diff --git a/.beads/config.yaml b/.beads/config.yaml index 6e46a57b..a7043286 100644 --- a/.beads/config.yaml +++ b/.beads/config.yaml @@ -1,58 +1,95 @@ # Beads Configuration File + # This file configures default behavior for all bd commands in this repository + # All settings can also be set via environment variables (BD_* prefix) + # or overridden with command-line flags # Issue prefix for this repository (used by bd init) + # If not set, bd init will auto-detect from directory name + # Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc. + # issue-prefix: "" # Use no-db mode: JSONL-only, no Dolt database + # When true, bd will use .beads/issues.jsonl as the source of truth + # no-db: false # Enable JSON output by default + # json: false # Feedback title formatting for mutating commands (create/update/close/dep/edit) + # 0 = hide titles, N > 0 = truncate to N characters + # output: + # title-length: 255 # Default actor for audit trails (overridden by BD_ACTOR or --actor) + # actor: "" # Export events (audit trail) to .beads/events.jsonl on each flush/sync + # When enabled, new events are appended incrementally using a high-water mark. + # Use 'bd export --events' to trigger manually regardless of this setting. + # events-export: false # Multi-repo configuration (experimental - bd-307) + # Allows hydrating from multiple repositories and routing writes to the correct database + # repos: + # primary: "." # Primary repo (where this database lives) + # additional: # Additional repos to hydrate from (read-only) + # - ~/beads-planning # Personal planning repo + # - ~/work-planning # Work planning repo # JSONL backup (periodic export for off-machine recovery) + # Auto-enabled when a git remote exists. Override explicitly: + # backup: + # enabled: false # Disable auto-backup entirely + # interval: 15m # Minimum time between auto-exports + # git-push: false # Disable git push (export locally only) + # git-repo: "" # Separate git repo for backups (default: project repo) # Integration settings (access with 'bd config get/set') + # These are stored in the database, not in this file: + # - jira.url + # - jira.project + # - linear.url + # - linear.api-key + # - github.org + # - github.repo sync-branch: "beads-sync" - dolt.shared-server: true +export: + auto: true + git-add: false diff --git a/.beads/export-state.json b/.beads/export-state.json index ae572d4f..cebd70b9 100644 --- a/.beads/export-state.json +++ b/.beads/export-state.json @@ -1 +1 @@ -{"last_dolt_commit":"3p94daefk053r8a406sg6o8l98j7249f","timestamp":"2026-07-04T19:54:25.7388155-07:00","issues":418,"memories":0} \ No newline at end of file +{"last_dolt_commit":"mdgdp9ehdpmdjnhuh65j1fuj1vcj06vc","timestamp":"2026-07-27T22:34:49.6696687-07:00","issues":454,"memories":0} \ No newline at end of file diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl deleted file mode 100644 index b1d7f318..00000000 --- a/.beads/issues.jsonl +++ /dev/null @@ -1,418 +0,0 @@ -{"_type":"issue","id":"foreman-dm3","title":"Use Mastra Memory APIs properly across the stack","description":"Replace custom message serialization with recall(), enable generateTitle, use Memory's native thread/message management instead of rolling our own. Fixes: GET /conversations/:id flattening messages, custom title generation in /chat endpoint, frontend proxy mangling message format.","status":"closed","priority":0,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T00:12:08Z","created_by":"HamChowderr","updated_at":"2026-04-21T00:17:31Z","closed_at":"2026-04-21T00:17:31Z","close_reason":"Implemented proper Mastra Memory patterns: generateTitle on agent config, recall() with raw messages in GET route, removed custom title gen from both /chat and /:id/messages endpoints, frontend proxy converts MastraDBMessage to UIMessage parts correctly, empty messages filtered","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4m1","title":"EPIC: Zapier SDK MCP integration + tool architecture refactor","description":"Replace custom Zapier tools with SDK's built-in MCP server. Refactor agent tool architecture for reliability. Save SDK docs to repo.","status":"closed","priority":0,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:53:39Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:48:03Z","closed_at":"2026-04-19T00:48:03Z","close_reason":"Epic complete. MCP server integrated (33 tools), 8 custom tools removed, 3 kept. Added: toModelOutput, requireApproval, ToolSearchProcessor, strict mode, savePerStep, prepareStep, dynamic credentials, lifecycle hooks, tool streaming, prompt rewrite. SDK docs saved to repo.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ltn","title":"Fix generate endpoint: threadId required by observational memory","description":"POST /api/agents/foreman/generate fails with 'ObservationalMemory requires a threadId'. The Mastra built-in generate route doesn't auto-create threads. Either fix the request format or make observational memory lazy.","status":"closed","priority":0,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:14:36Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:18:13Z","closed_at":"2026-04-18T05:18:13Z","close_reason":"Fixed earlier: title generate passes memory context (thread + resource). Verified in server test.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-k8iy","title":"Fix Infisical secret collision: Foreman Supabase service-key/URL resolve to BrokerBoard under --recursive","description":"In Infisical otaku-internal (e56e0da5), 'infisical run --recursive' (what Foreman's deploy + tooling use) flattens all product folders; SUPABASE_SERVICE_ROLE_KEY + NEXT_PUBLIC_SUPABASE_URL collide and resolve to BrokerBoard (ref zgplwimkoicfaiwnjigt, a different org) instead of Foreman (ihhdqzljgdnatuwzrlfm). SUPABASE_DB_PASSWORD happens to resolve to Foreman's. Verified by decoding the service-role JWT ref. Risk: if deployed Foreman reads those two keys from Infisical (not Coolify overrides), prod supabase-js service-role calls hit BrokerBoard. Fix: put Foreman's remote Supabase secrets (SERVICE_ROLE_KEY, NEXT_PUBLIC_SUPABASE_URL, SUPABASE_DB_PASSWORD) in a dedicated /foreman folder (currently only has the LOCAL 127.0.0.1 url) and inject via --path=/foreman, or namespace per-product. Discovered while seeding the remote app_catalog (foreman-5xih).","notes":"FIXED + VERIFIED 2026-06-28. Wrote Foreman's correct remote Supabase values into the /foreman Infisical folder (SUPABASE_SERVICE_ROLE_KEY pulled from supabase CLI for ref ihhdqzljgdnatuwzrlfm + verified ref before write; NEXT_PUBLIC_SUPABASE_URL + SUPABASE_URL = https://ihhdqzljgdnatuwzrlfm.supabase.co). Now BOTH 'infisical run --path=/foreman' AND 'infisical run --recursive' (what the deploy uses) resolve service_role ref=ihhdqzljgdnatuwzrlfm — /foreman wins the recursive collision over the BrokerBoard duplicates. Local dev unaffected (.env.local still overrides with local 127.0.0.1). RESIDUAL (optional hardening, not urgent): the BrokerBoard SUPABASE_* duplicates still exist elsewhere in otaku-internal and are merely out-voted by /foreman — removing/namespacing them would make it collision-proof rather than precedence-dependent. Prod still unverified (Coolify was down) — once up, confirm the container actually injects via infisical (now correct) vs a stale Coolify override.","status":"open","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T19:37:54Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:53Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-f8jb","title":"Docs created in a workspace not visible after going into that workspace","description":"User report: 'when we go into workspaces, I cannot see the docs I created in that workspace.' Docs are stored in the per-tenant workspace filesystem keyed by workspace_id; the /documents list resolves the workspace from the auth token via resolveActiveWorkspace (default_workspace_id). Suspected root cause: switching/going-into a workspace in the UI does not update public.user.default_workspace_id on the server, so the agent server keeps reading the OLD workspace's docs (or vice-versa: docs saved under a different active workspace than the one being viewed). Recon agent dispatched to confirm the causal chain before fixing.","acceptance_criteria":"After a user goes into / switches to a workspace, the docs they created in that workspace are listed; switching workspaces changes which workspace's docs are shown.","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-27T19:22:49Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-27T20:30:51Z","close_reason":"Diagnosed: NOT a backend bug — GET /documents correctly lists a workspace's docs (verified live: preview-test ws sees its 3 docs). Real issue: docs were only surfaced in the chat Knowledge side panel; the Workspaces page only DESCRIBED documents in copy, never listed them — so a user 'going into a workspace' saw nothing. Also admin's own local workspace genuinely has 0 docs (the on-disk docs belong to the preview-test test user). Fix: added a Documents card to the Workspaces page (workspaces-manager.tsx) listing the active workspace's docs (shared+private badge) with a viewer dialog (getDocument→MessageResponse); re-lists on workspace switch; shown for every active workspace. Commit pending push. web tsc + biome green.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-28cz","title":"Visibility (private|workspace|public) on chats/automations/dashboards + share-with-teammates UI","description":"Add a visibility enum (private | workspace | public) + workspace_id scoping to chats, automations, and dashboards so teammates in the same workspace can see items shared to the workspace. Replace the binary private/public VisibilitySelector with private/workspace/public. Today: chats are private-or-public-link only, automations are not teammate-visible, dashboards share only via anonymous public token.","notes":"SCOPING FINDING (post-swfe): automations + apps(artifact) are ALREADY workspace_id-scoped (automations: listForUser→resolveActiveWorkspace→listAutomations(workspaceId); apps: getArtifactWithData(workspaceId,id)). With multi-member workspaces now real (swfe), those are ALREADY teammate-visible — same as documents (5e4f). So 28cz's acceptance (teammate sees shared chat/doc/automation/dashboard) is ALREADY met for doc/automation/app. The ONLY gap is CHATS: conversation lists strictly by user_id; it HAS workspace_id but NO visibility column; the web VisibilitySelector (private|public) is a client-side template artifact with no server enforcement. CHAT-VISIBILITY DESIGN: add conversation.visibility ('private'|'workspace'|'public', default private) via migration; list = own chats (any vis) UNION teammates' workspace-vis chats in active ws; PATCH /conversations/:id {visibility} (owner only); detail+messages read allowed if owner OR (workspace member AND visibility='workspace'). Messages are created with resourceId=userId (owner-keyed), so a teammate can READ a shared thread by mastra_thread_id + access check (tractable, READ-ONLY), but COLLABORATIVE writing (teammate continuing another's thread) is HARD — Mastra memory keyed by resourceId — and is OUT OF SCOPE for 28cz. UI: 3-way selector wired to PATCH + read-only mode when viewing a teammate's shared chat. RECOMMEND: ship read-only chat sharing; defer collaborative.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T15:07:04Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-27T16:10:28Z","closed_at":"2026-06-27T16:22:30Z","close_reason":"Visibility/teammate-sharing complete. Finding: automations + apps were ALREADY workspace_id-scoped, so post-swfe they're teammate-visible like docs (5e4f) — 28cz acceptance already met for doc/automation/app. Built the one gap: CHAT visibility (private|workspace|public; 'workspace' = read-only teammate-visible). Migration 20260627000001 + conversation routes (list union, PATCH visibility owner-only, GET /:id teammate read via memory.recall by threadId, is_owner flag) + web (3-way selector Private|Team, isReadonly from is_owner, read-only banner, history passes real visibility). Verified live: owner shares→teammate lists+reads(200, is_owner:false); private stays hidden(404). Commits 8e4dfaf+3c12e12. Collaborative chat WRITING (teammate continues another's thread) deferred — Mastra memory resourceId-keyed. Public chat link (logged-out) deferred — enum supports it.","dependencies":[{"issue_id":"foreman-28cz","depends_on_id":"foreman-wl54","type":"discovered-from","created_at":"2026-06-27T08:07:03Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5e4f","title":"Document Spaces: shared-by-default + personal (private) tier","description":"The demo's personal-vs-shared Spaces, for documents. The per-tenant workspace fs (jgme) is keyed by workspace_id, so documents/ is ALREADY shared across all workspace members. Add a PRIVATE tier visible only to the creating user. Design: logical path documents/\u003cslug\u003e.md (shared) | personal/\u003cslug\u003e.md (personal); server maps personal -\u003e physical _private/\u003ccallerUserId\u003e/documents/\u003cslug\u003e.md (never trust a client-provided uid). Generalize the path helpers (slugFromPath etc.), versions.ts, share.ts, save-document.ts, and the /documents routes to operate on logical paths + space. save_document gains a space param (default shared). GET /documents lists shared + the caller's own personal docs, tagged with space; read/versions/share/restore validate the caller can access the path. Web: KnowledgePanel shows the space; save chip + citations work for both. User decision 2026-06-27: YES include a private tier.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T15:06:59Z","created_by":"HamChowderr","updated_at":"2026-06-27T15:22:16Z","started_at":"2026-06-27T15:08:21Z","closed_at":"2026-06-27T15:22:16Z","close_reason":"Document Spaces shipped + verified live: SHARED (documents/, all workspace members) + PERSONAL (_private/\u003cuid\u003e/documents/, creator only). Agent save_document space param (used correctly live: 'private note' -\u003e space:personal). canAccessDocPath gates every access (own personal 200, cross-user uid 400, traversal 400). Versioning + public-sharing work across both spaces. Web: Space badge + chip. 315/315 tests, tsc+biome clean. Commits bc3fd95 (backend) + dcafec7 (web). Note: a documents browse/nav page filtered by space is foreman-aqjx scope (panel-only surface today).","dependencies":[{"issue_id":"foreman-5e4f","depends_on_id":"foreman-wl54","type":"discovered-from","created_at":"2026-06-27T08:06:59Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-swfe","title":"Membership/invite flow works end-to-end (2nd user joins a workspace)","description":"Foundation for wl54: verify and finish the workspace_invitations -\u003e workspace_members join flow so a second user can actually become a member of an existing workspace (today onboarding provisions a 1:1 workspace per user via handle_auth_user_created; workspace_members table + roles exist but the invite-\u003eaccept-\u003ejoin path may be incomplete in UI/API). Without multi-member workspaces, no teammate-visibility feature is demoable. Audit current state (routes/workspaces.ts, workspace_invitations table, web invite UI), fix gaps, verify a 2nd test user can join preview-test's workspace and resolveActiveWorkspace reflects it.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T15:06:54Z","created_by":"HamChowderr","updated_at":"2026-06-27T15:32:38Z","started_at":"2026-06-27T15:23:44Z","closed_at":"2026-06-27T15:32:38Z","close_reason":"Membership/invite flow verified working e2e (invite→accept→trigger creates membership→teammate sees SHARED docs, not private). Fixed the one real gap: solo workspaces couldn't be invited-into from the UI — server now flips solo→team on first invite, UI shows the invite affordance for solo-owned workspaces. Verified live. Commit pending push.","dependencies":[{"issue_id":"foreman-swfe","depends_on_id":"foreman-wl54","type":"discovered-from","created_at":"2026-06-27T08:06:54Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wl54","title":"Team collaboration, sharing and RLS","description":"Turn the existing workspace_members/invitations/roles plumbing into real collaboration. Add a visibility model (private | workspace | public) to chats, automations, dashboards and documents; a share-with-teammates UI; and make workspace_id a real security boundary via RLS or audited app-layer guards. Audit: chats are private-or-public-link only, automations are not teammate-visible, dashboards share only via anonymous public token, and core tables have RLS enabled with NO policies (service_role scoping only).","design":"Add a visibility enum + workspace_id scoping; RLS policies via is_workspace_member(); replace the binary VisibilitySelector with private/workspace/public.","acceptance_criteria":"A teammate in the same workspace sees items shared to the workspace (chat/doc/automation/dashboard); non-members cannot; private stays private.","status":"closed","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:02:24Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: collaboration epic fully shipped — membership/invite, visibility, workspace RLS (20260627 migration), Spaces, public shares; all 4 children closed.","dependencies":[{"issue_id":"foreman-wl54","depends_on_id":"foreman-2vpb","type":"discovered-from","created_at":"2026-06-26T19:02:23Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-aqjx","title":"Knowledge layer (shared brain) on Mastra Workspace","description":"Build the shared-brain knowledge layer on Mastra Workspace primitives, NOT a bespoke docs+RAG stack. Documents = files in a per-space Workspace filesystem; doc-RAG = Workspace bm25/vector search; the foreman agent ALREADY has read/write/search workspace tools (foremanWorkspace). Spaces = per-team plus personal Workspace scopes. Add a Knowledge/Spaces UI and a document editor (repurpose the existing editor page). The audit found documents/doc-RAG/doc-sharing essentially MISSING and that workspaces organize people+connections, not knowledge.","design":"Workspace.filesystem keyed by space_id via dynamic resolver (foreman-jgme): LocalFilesystem self-host, S3/AgentFS cloud. Workspace.search for retrieval. Documents are files; reuse the Workspace tools already on the foreman agent. No second RAG pipeline.","acceptance_criteria":"User creates a doc in a space; it persists; the agent can search and read it as chat context; a teammate in the same space sees it.","notes":"Slice 1 SHIPPED (commit pending): GET /documents + /documents/content over the per-tenant Workspace fs (routes/documents.ts), registered + prefix-listed. Documents = files under documents/ in the workspace; reuses foremanWorkspace.resolveFilesystem (containment verified, ../ escape blocked). tsc green + readdir/readFile probe. NEXT: (a) KnowledgePanel viewer = AI Elements Artifact primitives in the live-preview side panel (mirror PreviewPanel/use-preview-panel) + DocumentInlineChip; (b) api-client methods; (c) agent guidance to write knowledge docs under documents/; (d) Knowledge/Spaces nav. Design: NOT reviving the orphaned chatbot Artifacts framework (documents-table/ProseMirror model conflicts with Workspace-files).\nSlice 2 (VIEWER) built: save_document tool (d25a608) writes documents/\u003cslug\u003e.md to the per-tenant Workspace; web viewer = KnowledgePanel (AI Elements Artifact + MessageResponse markdown) in the SAME resizable side-panel slot as the live preview (shell.tsx: knowledge takes precedence), DocumentInlineChip in message.tsx for tool-save_document (mirrors preview_app), use-knowledge-panel store, documents-client (direct agent fetch w/ Supabase token, no proxy). web tsc + biome green; next build verifying. End-to-end loop: ask Foreman to save a doc -\u003e save_document writes file -\u003e chip in chat -\u003e opens KnowledgePanel rendering the markdown, 'just like the web preview'. REMAINING for aqjx: Knowledge/Spaces nav page (list docs) + multi-space scoping + doc-RAG surfacing in chat (Workspace.search) + sharing (ties to foreman-wl54).","status":"in_progress","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:02:18Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-27T02:24:13Z","dependencies":[{"issue_id":"foreman-aqjx","depends_on_id":"foreman-2vpb","type":"discovered-from","created_at":"2026-06-26T19:02:17Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2vpb","title":"Zapier Shared Brain feature parity (umbrella)","description":"Umbrella tracking epic: reach 1:1 parity with the Zapier Shared Brain product demo as its open-source equivalent. Children cover gaps found in the 2026-06-26 codebase audit. Engine SHIPPED: chat over 9000+ apps, approval-gated actions, conversational automation creation, dashboards-from-chat with real data. Missing cluster = collaborative KNOWLEDGE: documents/spaces, team sharing, shared skills, and load-back-into-chat loops. See vault PRD: Foreman Shared Brain Parity. Existing related: foreman-ltc7 (dashboards epic), foreman-jgme (per-tenant Workspace fs), foreman-vb78 (shared skills).","status":"open","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:02:09Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-qdna","title":"Wire shadcn as a Mastra Agent Skill on the preview-builder","description":"User: 'add the shadcn skills to the agent, not claude code'. Mastra has a native Agent Skills system (Workspace.skills -\u003e SkillsProcessor injects metadata + skill/skill_search/skill_read tools, SKILL.md spec). The preview-builder (Haiku) writes the shadcn TSX and is where TS errors originate. Author a real shadcn SKILL.md and attach it to the builder via a skills-backed Workspace so the agent loads authoritative shadcn component rules at build time. Targets 'why are we getting so many errors'.","notes":"VERIFY: node probe against @mastra/core 1.42.0-alpha.3 — skills-only Workspace valid, skills.list() returns shadcn, skills.get('shadcn').instructions=8595 chars. npm run typecheck (agents) green. Pending live build to confirm Haiku invokes the skill tool + TS-error drop.","status":"in_progress","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T01:20:55Z","created_by":"HamChowderr","updated_at":"2026-06-27T01:32:56Z","started_at":"2026-06-27T01:21:25Z","dependencies":[{"issue_id":"foreman-qdna","depends_on_id":"foreman-8nyg","type":"discovered-from","created_at":"2026-06-26T18:20:54Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ho1c","title":"Preview generation quality + house style (no empty charts, no heavy outlines)","description":"Rework the Haiku preview-builder prompt: defined house style (clean, subtle borders, good spacing, palette — kill heavy outlined cards), HARD rule every chart has real inline data (no empty Top 5 Deal Sources / Deals by Stage), plus a cheap second self-check pass that fixes empty charts/JS errors (stand-in for the harness iterate loop).","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T21:30:44Z","created_by":"HamChowderr","updated_at":"2026-06-26T21:52:32Z","started_at":"2026-06-26T21:46:07Z","closed_at":"2026-06-26T21:52:32Z","close_reason":"Reworked preview-builder house style from make-interfaces-feel-better (shadows-over-borders kills heavy outlines, tabular-nums, concentric radius, 8px spacing, text-wrap) + hard data-completeness rule + explicit Chart.js render mechanics (fixed-height canvas wrapper, DOM-ready init, pinned CDN). Verified: dashboard now renders the bar chart (was empty) and looks polished. Full reliability comes with the harness (phase 2, foreman-8nyg).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-q4kf","title":"Preview in the side-panel artifact (open from tool result)","description":"Add a 'preview' artifact kind rendering WebPreview; when preview_app returns, open the panel client-side via setArtifact (kind:preview, content:url, isVisible:true). Leave a compact 'Live preview' chip inline that re-opens it. Uses the existing Artifact panel in shell.tsx — no new server data-stream protocol (that's a later nicety).","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T21:30:36Z","created_by":"HamChowderr","updated_at":"2026-06-26T21:44:44Z","started_at":"2026-06-26T21:31:26Z","closed_at":"2026-06-26T21:44:44Z","close_reason":"Preview now opens in a docked AI Elements Artifact side panel (chat ~40% left, panel ~60% right) with a compact re-open chip inline. Verified in headed browser: dashboard renders in the panel. Zero new deps; web tsc 0, biome clean.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-qg4k","title":"Preview UX hybrid: side-panel + live build feed + generation quality","description":"User chose the hybrid path for the live-preview spike (foreman-qq4x): quick wins now, real Mastra workspace harness next. Move the preview into the existing (client-wired but server-dormant) artifact side panel, stream a build/console feed, and fix one-shot generation quality + house style. Root cause of the current rough edges (opaque 'Building live preview…', empty charts, heavy card outlines): preview_app is a single atomic Haiku call with no streaming and no verify/iterate loop.","status":"closed","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T21:30:32Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: preview side-panel + live build-log feed shipped (components/chat/preview-panel.tsx; 081c450).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-lrqy","title":"Make @foreman/agents typecheck clean (tsc --noEmit) + add CI gate","description":"tsc --noEmit currently reports 70 errors in packages/agents (about 23 in src, rest in tests). CI never caught them: the agents job runs vitest and mastra build (esbuild, transpile-only), so type errors never gated. Several look like real latent bugs (missing await on now-Promise Chat/Run APIs in webhook-server.ts/telegram/webhook.ts/routes/webhooks.ts; two missing generateZapierTools imports in discovery.ts/execution.ts). Others are dual-package type-brand mismatches (OpenAIVoice vs @mastra/core MastraVoice; hono MiddlewareHandler root vs @mastra/core copy) and supabase never-typing in zapier/sdk.ts. Fix each at the root (no blanket any), then add a typecheck CI job so they cannot regress.","acceptance_criteria":"npx tsc --noEmit -p packages/agents/tsconfig.json exits 0; no new any-casts that hide real bugs; a CI job runs the agents typecheck on PRs; biome still clean; vitest still green.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T19:50:10Z","created_by":"HamChowderr","updated_at":"2026-06-26T20:32:14Z","started_at":"2026-06-26T19:50:29Z","closed_at":"2026-06-26T20:32:14Z","close_reason":"tsc --noEmit now 0 errors project-wide (src + tests); all fixed at root cause, no workarounds. Added typecheck npm script + 'agents (tsc)' CI job. Verified: tsc 0, vitest 342 passed, biome clean on all changed files.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-25yw","title":"preview_app: Haiku builds the HTML from a brief (not Sonnet)","description":"Currently preview_app requires the Foreman agent (Sonnet 4.6) to emit a COMPLETE self-contained HTML document as the tool html argument — thousands of output tokens of HTML on the expensive model, every preview. Change the contract: preview_app takes a concise brief (plus optional data the agent already fetched via Zapier) and internally delegates HTML generation to a cheap Haiku builder agent, then serves the result via startWorkspacePreview. Sonnet orchestrates; Haiku renders. Keeps the inline live-preview UX identical.","acceptance_criteria":"preview_app inputSchema is {brief, data?, title?} with no raw html; a dedicated Haiku preview-builder agent generates the full self-contained HTML; code-fence stripping guards against markdown wrappers; generous maxOutputTokens so large dashboards do not truncate; existing WebPreview iframe render unchanged; agent src type-clean and web build green.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T19:43:28Z","created_by":"HamChowderr","updated_at":"2026-06-26T21:09:51Z","started_at":"2026-06-26T19:43:40Z","closed_at":"2026-06-26T21:09:51Z","close_reason":"Behaviorally verified e2e in browser: Sonnet called preview_app with a brief, Haiku preview-builder generated a complete Chart.js Sales Dashboard (6936 bytes), sandbox served it on :7331, official WebPreview iframe rendered it inline in chat. KPI cards + bar chart render live.","dependencies":[{"issue_id":"foreman-25yw","depends_on_id":"foreman-qq4x","type":"discovered-from","created_at":"2026-06-26T12:43:28Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-zlru","title":"Sandbox provider abstraction + FUSE-mount workspace FS into the sandbox","description":"Env-selected sandbox provider (Local/Docker/E2B/Daytona) like DEPLOY_TARGET. FUSE-mount the per-tenant workspace FS (s3fs/gcsfuse) into the sandbox so Zapier data written to the workspace appears as files automatically (sandbox.mount). Local uses symlink mount (no FUSE). Depends on the per-tenant workspace FS.","status":"open","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:21:11Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:54Z","dependencies":[{"issue_id":"foreman-zlru","depends_on_id":"foreman-ltc7","type":"discovered-from","created_at":"2026-06-26T11:22:35Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-zlru","depends_on_id":"","type":"discovered-from","created_at":"2026-06-26T11:21:11Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jgme","title":"Per-tenant workspace filesystem (dynamic resolver keyed by workspace_id)","description":"Replace the single shared ./data/workspace (multi-tenant collision/privacy bug) with the Mastra dynamic filesystem resolver keyed by workspace_id from RequestContext. Provider env-selected mirroring DEPLOY_TARGET: self-host = LocalFilesystem + mounted volume; cloud = S3Filesystem (R2, free egress) or Supabase/Daytona. Prerequisite for BOTH sandbox-mounting data in AND team-shared skills (foreman-vb78).","notes":"Prerequisite for foreman-aqjx (Knowledge layer on Mastra Workspace) in the Shared Brain parity umbrella foreman-2vpb.\nSelf-host increment DONE (commit pending hash): dynamic filesystem+sandbox resolvers in mastra/agents/workspace.ts keyed by workspace_id (RequestContext on web; ALS userId-\u003eresolveActiveWorkspace on channels; _shared fallback). tsc green + resolver probe verified per-workspace dirs. REMAINING: optional cloud S3/AgentFS provider keyed off DEPLOY_TARGET (LocalFilesystem+volume is the Coolify production path). Unblocks foreman-aqjx (knowledge layer) for self-host.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:21:05Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-27T02:08:52Z","closed_at":"2026-06-28T07:01:03Z","close_reason":"Per-tenant workspace fs resolver shipped: workspace.ts resolveWorkspaceDir() keys LocalFilesystem/LocalSandbox by workspaceId from RequestContext (falls back to active workspace, then _shared). Multi-tenant ./data/workspace collision/privacy bug fixed; path traversal sanitized + contained. Cloud S3/AgentFS provider split to follow-up.","dependencies":[{"issue_id":"foreman-jgme","depends_on_id":"foreman-ltc7","type":"discovered-from","created_at":"2026-06-26T11:22:28Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-jgme","depends_on_id":"","type":"discovered-from","created_at":"2026-06-26T11:21:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-qq4x","title":"Spike: LocalSandbox e2e smoke — mount, write file, spawn server, view","description":"Prove the untested LocalSandbox already wired in foreman.ts. Mount a LocalFilesystem (symlink, no FUSE), agent writes a JSON file, processes.spawn a tiny node/Vite server that renders it, reach it on localhost PORT. Zero cost, no new deps. Surface Windows quirks. Output: a working smoke plus notes on what is real vs painful before picking a cloud provider.","notes":"GOTCHA: the Mastra dev bundler externalized a NEW @/lib/preview/serve import (ERR_MODULE_NOT_FOUND @/lib) and crashed the server on reload, even though existing @/lib/* imports (create-dashboard) bundle fine. Fixed by using RELATIVE imports in the new agent files. Use relative imports for new cross-dir agent imports. Server now boots clean; preview_app tool registered. PENDING LIVE TEST.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:20:59Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T18:36:56Z","closed_at":"2026-06-26T21:10:00Z","close_reason":"Spike PROVEN end-to-end: agent builds in the LocalSandbox (write file + spawn surviving static server on :7331) and it shows live inline via the AI Elements WebPreview iframe. Verified in-browser with a throwaway local user — Haiku-built Sales Dashboard rendered (Total Revenue $2.85M, 143 Deals Won, Monthly Revenue bar chart). FUSE mount + per-tenant + cloud provider tracked separately under epic foreman-ltc7.","dependencies":[{"issue_id":"foreman-qq4x","depends_on_id":"foreman-ltc7","type":"discovered-from","created_at":"2026-06-26T11:22:22Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-qq4x","depends_on_id":"","type":"discovered-from","created_at":"2026-06-26T11:20:58Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ltc7","title":"Sandbox-built live dashboards/apps from Zapier data","description":"Use the Mastra workspace + sandbox so the agent can build CODE-DRIVEN custom live dashboards/apps from real Zapier data and embed them in Foreman (the v0/bolt.new pattern), beyond the constrained DashboardSpec. Data-in: per-tenant workspace FS (S3/R2 or local volume) FUSE-mounted into the sandbox so agent-written Zapier JSON appears as files. Build: sandbox spawns a real server via processes.spawn. Embed: expose the server port then preview URL then iframe in Foreman. Providers: Local (dev, already wired, untested) then Docker (self-host isolation) then E2B/Daytona (hosted, public preview URLs). Per-session cost ~1 cent; cost driver = provider base fee. Builder-ICP differentiator. Discuss before building.","status":"open","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:20:50Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-n5gq","title":"Redesign Automations + Dashboards pages + add Inbox page on a shared app nav","description":"The app pages are inconsistent and half-built: Automations has NO header (bare main + a back-link to the marketing homepage), Dashboards uses a minimal BrandHeader with no cross-section nav and hardcoded inline colors, and there is no Inbox page. Build a shared AppNav (Zapier logo + Chat/Automations/Inbox/Dashboards tabs w/ active state) used by every app section; restructure Automations + Dashboards onto it with polished empty states + theme tokens; add a dedicated /inbox trigger-inbox page. User-reported: 'header is completely removed, I can't go back, things missing.'","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T12:29:37Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:25Z","closed_at":"2026-07-05T03:26:25Z","close_reason":"Shipped across 6 commits (b3bc323 shared app nav + restructured Automations/Dashboards + new Inbox; ffafb8c aggregate inbox endpoint; d6ae7cb unified sidebar shell). Pages + app-shell/app-sidebar verified present.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-usoj","title":"[db] Missing service_role GRANT on public.\"user\" (+ audit all tables) — breaks auth/workspace resolution on migration up","description":"Discovered during the j3um /automations live verify: PostgREST returns 42501 'permission denied for table user' for service_role. resolveActiveWorkspace/ensureUserExists/resolveFromApiKey all read public.\"user\" via getSupabase() (service_role), so without the grant they silently return null → empty automations, no workspace, broken auth resolution. Migrations grant service_role on automation/automation_run (f1cd64a), user_roles, and functions, but NEVER on public.\"user\" itself (only a REVOKE...FROM anon in 20260428000000_revoke_anon_grants.sql). No blanket 'ALL TABLES IN SCHEMA' / DEFAULT PRIVILEGES grant exists. Same class as f1cd64a: a fresh 'db reset' masks it via Supabase base default-privileges, but a production 'supabase migration up' would fail with permission denied. CI can't catch it (db:types uses direct introspection; agent tests are mocked). FIX: add 'GRANT ALL ON TABLE public.\"user\" TO service_role;' (new migration, don't edit applied ones) AND audit EVERY public table the service-role client touches (conversation, action_proposal, action_run, channel_identity, api_key, capability_flag, workspaces, workspace_members, user_settings, zapier_identity, artifact, dashboard_*, etc.) for the same missing grant — likely several. Locally unblocked the verify with a manual GRANT ALL on user + user_settings.","status":"closed","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T06:48:21Z","created_by":"HamChowderr","updated_at":"2026-06-26T07:29:39Z","started_at":"2026-06-26T07:18:29Z","closed_at":"2026-06-26T07:29:39Z","close_reason":"Fixed via migration 20260626000001_service_role_grants.sql — GRANT ALL on all public tables/sequences + EXECUTE on functions to service_role, plus ALTER DEFAULT PRIVILEGES for future migration tables. Verified: (1) reproduced 42501 on zapier_identity, applied migration → read returns []; (2) audit went 20/27 missing → 0 missing; (3) npx supabase db reset applies it in-sequence cleanly; (4) db:types:check green on clean reset (grants don't change gen-types output — the earlier diff was the running server's runtime mastra_* tables polluting the dirty local DB, NOT my migration). RLS untouched (anon/authenticated boundary intact); purely additive for service_role.","dependencies":[{"issue_id":"foreman-usoj","depends_on_id":"foreman-j3um","type":"discovered-from","created_at":"2026-06-25T23:48:20Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-j3um","title":"[durable][web] Live run-status polling + run output/error drill-down on /automations","description":"M4 shipped /automations as load-once. Two gaps make it not-yet-useful: (1) no live status — a run recorded 'started' only advances to finished/failed in the DB via the reconcile worker, but the page never re-fetches, so the user must manually reload to see it land. (2) no run detail — the agent route already returns output/error per run (store.listRuns selects *), but the web AutomationRun type drops them and the Runs table shows only When/Status/Durable-run, so a finished run's result and a failed run's error are invisible. Fix is web-only (no route change): add output/error to the web type, make each terminal run row expandable to show its result/error JSON, and client-poll getAutomation (~3.5s, DB-cheap) for the selected automation while it has any non-terminal run, stopping when all runs are terminal. Honors the locked frontend decisions: no form, polling (SDK has no run-status stream).","notes":"Shipped 8466912. Implementation complete + verified via next build (web typecheck) + biome clean. Web-only: added output/error/updated_at to AutomationRun type; terminal run rows expand to show output/error JSON; client-polls getAutomation ~3.5s while any run non-terminal, stops when all terminal; in-place refresh + 'Live — updating…' hint. NOT yet live-UI-verified — dev stack was down at commit time. Next: bring stack up for a browser walkthrough (watch a Run-now advance started→finished live + expand its output) before closing.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T06:07:25Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T06:07:40Z","closed_at":"2026-06-26T06:56:35Z","close_reason":"Shipped 8466912 + LIVE-verified end-to-end. Seeded a local user/workspace/automation + 3 runs; logged into the real web app at /automations and confirmed: (1) runs render with correct status badges; (2) terminal rows expand to Output (finished) / Error (failed) JSON, in-flight 'started' row not expandable; (3) live poll — flipped started→finished in Postgres and the row advanced in-place ~4s with NO reload, and the 'Live — updating…' indicator activated while pending then disappeared when terminal. Build + biome were already green.","dependencies":[{"issue_id":"foreman-j3um","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T23:07:25Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hnbx","title":"[durable] Live smoke test: drive lib/durable + lib/trigger-inbox against real Zapier","description":"The M1-M4 rebuild is unit-verified (mocked SDK) + build/tsc/biome green, but NOT exercised against live Zapier in the Foreman integration. Close the gap: a standalone script (scripts/durable-smoke.ts) that builds the REAL experimental SDK via CLI login and runs Foreman's own lib functions end-to-end — Tier1 ephemeral runDurable (echo), Tier2 deploy+trigger+poll+delete, Tier3 ensureInbox+lease reachability. No-connection echo durable (no app side effects), private, self-cleaning. Auth = cached CLI login (admin@otakusolutions.io); re-login if 401.","acceptance_criteria":"Tier1 run finishes; Tier2 deploy→trigger→durable run links + cleans up; Tier3 inbox API reachable; account left clean (listWorkflows back to prior count).","notes":"CONNECTED-LOOP TEST PREP (2026-06-26): probed live account — 14 connections: GitHub, Slack(@admin Otaku Solutions), Discord, Todoist, HubSpot, Airtable x2, GoogleSheets/Docs/Calendar/Gmail, AITable, Skool, + a custom App242053. Webhooks by Zapier = WebHookCLIAPI@1.1.1, triggers hook_v2 'Catch Hook'/hook_raw/poll_v4. FINDING: trigger-inbox SUPPORTS Catch Hook (instant, NO connection) — ensureTriggerInbox({app:'webhook',action:'hook_v2',inputs:{_zap_static_hook_code:'...'}}) goes initializing→active immediately (no 7-min poll wait; that penalty is POLLING-trigger-only). BUT the inbox object does NOT expose the catch ingest URL. Derived classic URL hooks.zapier.com/hooks/catch/\u003cid\u003e/\u003ccode\u003e/ with the PROFILE id (UUID 012c8c5b…, not a numeric account id) → POST 200 but message did NOT land in lease within 12s. So either wrong account segment (needs numeric account id) or inboxes ingest webhooks via a different path. NOT resolved — stopped to avoid rabbit-holing. NEXT: get the real ingest URL from the Zapier durables-editor UI for the inbox, OR use Slack (connected, instant REST-hook) as the test trigger. Probe scripts (uncommitted): scripts/probe-connections.ts, scripts/probe-webhook-inbox.ts.\nSOLVED 2026-06-26: instant webhook delivery into a trigger-inbox PROVEN. Recipe — ensureTriggerInbox({app:'webhook',action:'hook_v2',inputs:{_zap_static_hook_code:'\u003ccode\u003e'}}) arms instantly; POST to https://hooks.zapier.com/hooks/catch/16517571/\u003ccode\u003e/ (NUMERIC account id 16517571, NOT the profile UUID 012c8c5b…) → message lands in lease in ~5 SECONDS with exact payload. So the inbox event path is instant + fully controllable, no connection, no 7-min poll. This is the test substrate for the full connected loop. Probe: scripts/probe-webhook-inbox.ts.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T04:37:32Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T04:38:38Z","closed_at":"2026-06-26T05:18:18Z","close_reason":"FULL LOOP PROVEN end-to-end (2026-06-26). Built scripts/durable-loop-smoke.ts: deploy durable (live) → persist automation w/ webhook inbox trigger (real Postgres) → worker cycle 1 arms inbox → POST event to hooks.zapier.com/hooks/catch/16517571/\u003ccode\u003e/ → worker cycle 2 (4s later) processed=1: leased → claimInboxMessage (REAL Postgres dedup insert) → triggerAutomation fired the durable → recorded automation_run (inbox_message_id + trigger_id) → acked → cleaned up. So event→inbox→worker→durable + real-Postgres claim/record is PROVEN on live infra, ~4s not 7min. Found+fixed a real bug: migration lacked GRANT ... TO service_role on automation/automation_run (CI db reset masked it via default privileges; migration up failed 'permission denied'); added explicit grants + applied to local. Follow-up filed for worker run-status reconcile (records 'started' at trigger time, doesn't poll to terminal). Harness scripts committed (durable-loop-smoke, probe-connections, probe-webhook-inbox).","dependencies":[{"issue_id":"foreman-hnbx","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T21:37:32Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-l23t","title":"[durable] M2: automations + runs schema (workspace-scoped) + agent routes","description":"Persistence + HTTP surface for automations (parent foreman-l7xq; builds on M1 lib). SCOPE: (1) migration adding workspace-scoped tables (UUID + FK workspaces ON DELETE SET NULL, matching the multi-tenant standard) — automation (id, workspace_id, name, trigger spec app/action/connection/inputs, durable source, zapier workflow_id + version, status) and automation_run (id, automation_id, inbox_message_id, durable_run_id, status, timestamps). Workspace-scoped = SHARED per 'shared resources, private chats'. (2) regenerate database.types.ts (npm run db:types, --workdir ../..). (3) agent routes (Hono, mounted in routes/index.ts + CUSTOM_ROUTE_PREFIXES in mastra/index.ts): CRUD automations + list runs, service_role + membership checks like the workspaces routes. (4) schema.ts interfaces.","acceptance_criteria":"migration applies via supabase db reset; db:types:check clean; routes covered by mocked integration tests; biome+tsc green.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T02:30:39Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T03:07:17Z","closed_at":"2026-06-26T03:26:07Z","close_reason":"M2 shipped: workspace-scoped automation persistence + agent routes. (1) Migration 20260626000000_automations.sql: automation + automation_run tables (text ids, user_id text, workspace_id uuid FK ON DELETE SET NULL, jsonb payloads, RLS enabled no-policy + revoke anon — matching artifact). automation_run has UNIQUE(automation_id, inbox_message_id) so the M3 inbox worker's dedup is a DB constraint. database.types.ts regenerated (db:types:check green). (2) lib/automations/store.ts: workspace-scoped CRUD + recordRun/listRuns/updateRun + claimInboxMessage (idempotent insert, 23505→null) + getAutomationByZapierWorkflowId (M3 reverse lookup). (3) lib/automations/service.ts: provisionAutomation (deploy via M1 + persist, status mapping incl. trigger_claim_failed), runAutomationById, list/inspectForUser, updateAutomationForUser (syncs enabled to Zapier via new setAutomationEnabled), removeAutomationForUser (row + best-effort Zapier delete). (4) routes/automations.ts: GET/POST / + GET/PATCH/DELETE/:id + POST /:id/run, authMiddleware, registered in routes/index.ts + CUSTOM_ROUTE_PREFIXES. (5) M1 agent tools repointed to the service (create persists; run/list/inspect keyed by Foreman automation id, workspace-shared). Gates: vitest 330 pass/0 fail (14 new across 2 suites), biome clean, tsc clean on all M2 files, db:types:check green. Unblocks M3 (37e6) + M4 (ut8n).","dependencies":[{"issue_id":"foreman-l23t","depends_on_id":"foreman-cjg5","type":"blocks","created_at":"2026-06-25T19:31:11Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-l23t","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T19:30:39Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-cjg5","title":"[durable] M1: durable + trigger-inbox lib layer + agent authoring tools","description":"Foundation for the durable/inbox rebuild (parent foreman-l7xq). Build the SDK-experimental client + the two lib layers every later milestone calls into, plus the agent's authoring tools. SCOPE: (1) experimental SDK client — getSdkForUser currently builds from the STABLE '@zapier/zapier-sdk' import; add a path that builds from '@zapier/zapier-sdk/experimental' so durable + trigger-inbox methods are available, reusing the same per-user token/connection-alias resolution. (2) lib/durable/ — deployWorkflow (createWorkflow + publishWorkflowVersion with aged-pin deps as call args + connections + optional trigger), runWorkflow (triggerWorkflow/runDurable), getRun. Author the durable source per the workflows-create SKILL format (defineDurable + export default, one runAction per ctx.step, normalizeInput). (3) lib/trigger-inbox/ — ensureInbox, lease, ack/release, and a dispatch helper that dedups on lease_count/possible_duplicate_data. (4) agent tools (createTool, registered via ToolSearchProcessor like connect_zapier/search_history): create_automation (NL intent -\u003e durable source -\u003e deploy + ensure inbox), run_automation, list_automations, inspect_automation. NO schema/migration and NO web in M1 — keep it pure lib + tools, mocked-SDK unit tested.","acceptance_criteria":"lib/durable + lib/trigger-inbox functions covered by vitest against a mocked @zapier/zapier-sdk/experimental; the 4 agent tools registered and discoverable; biome lint + tsc typecheck green; no @mastra dep-uniqueness break.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T02:30:32Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T02:32:04Z","closed_at":"2026-06-26T03:00:27Z","close_reason":"M1 shipped: durable + trigger-inbox lib layer + agent authoring tools, all on the experimental SDK. (1) sdk.ts refactored to share one token/connection-resolution path via buildSdkForUser; added getExperimentalSdkForUser building from '@zapier/zapier-sdk/experimental' (durable + trigger-inbox surface), cached separately from the stable client. (2) lib/durable/: deps (aged-pin constants), types, source generator (buildDurableSource per the SKILL format), deploy (deployAutomation=create+publish with silent-trigger-claim verification, runAutomationOnce, triggerAutomation, get*RunStatus, list/inspect/delete). (3) lib/trigger-inbox/: ensure/get/lease/ack/release + dispatchLeased (dedup on message id, honors lease_count/possible_duplicate_data; classifies processed/skipped/failed, caller acks+releases). (4) 4 createTool tools wired into foreman.ts: create_automation + run_automation (requireApproval), list_automations + inspect_automation (read). No Foreman schema — Zapier listWorkflows/getWorkflow IS the store for M1; M2 (l23t) adds workspace-scoped persistence + run history. Gates: vitest 316 pass/0 fail (20 new across 4 suites), biome clean (0 new errors), tsc clean on all new files. Unblocks M2.","dependencies":[{"issue_id":"foreman-cjg5","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T19:30:31Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-c24s","title":"Workspace management web UI (multi-tenant step 5)","description":"Step 5 of foreman-qhbp multi-tenant build. Backend (steps 3+4) is DONE: stored_agent + dashboards are workspace-scoped (b572cc9/173df5c), and getSdkForUser honors workspace_settings.zapier_connection_mode (member-first default, 96e1172). The web app has NO workspace UI (NextBase's was not carried over), so this is a from-scratch build + backing API routes. SCOPE: (1) Workspace switcher — list the principal's workspaces, set active via user.default_workspace_id. (2) Member management — list members, invite (workspace_invitations), roles (workspace_member_role_type owner/admin/member). (3) Shared Zapier connection — designate a connection by tagging zapier_identity.workspace_id; admin UI to set workspace_settings.zapier_connection_mode (member-first|shared|personal). (4) API routes in packages/agents/src/routes for all the above (workspace CRUD/switch, members/invites, connection-mode + shared-connection designation). RLS/policies for workspace_members/workspace_invitations already exist from NextBase. NOTE: connection_alias stays user-scoped (private); shared-connection manifest/alias resolution for borrowed connections is a known follow-up (loadUserConnectionsMap currently loads the requesting user's aliases).","notes":"APPROACH (refined 2026-06-25): NOT from-scratch — PORT NextBase's workspace UI + server actions, restyled to Foreman's design system. Workspace tables + RLS + enums are identical (kept from NextBase), and Foreman web users ARE Supabase-auth users (public.user.id == auth.users.id == user_profiles.id), so NextBase's RLS-enforced server actions port cleanly.\n\nSOURCE ROOT = C:\\Users\\HamCh\\code\\nextbase-ultimate\\apps\\web\\src\\\n\nPORT (relevant subset):\n- Data layer (server actions, RLS via @supabase/ssr user session): data/user/workspaces.ts (create/get/set-default), data/user/invitation.tsx (accept/decline), data/admin/workspaces.ts, rsc-data/user/workspaces.ts (RSC fetchers).\n- Components under components/workspaces/settings/: members/{invite-user, team-members-table, team-invitations-table, edit-member-role-dialog, remove-member-provider, revoke-invitation-provider, leave-workspace-dialog, workspace-members}; workspace-settings, edit-workspace-form, delete-workspace; set-default-workspace-button + set-default-workspace-preference = the ACTIVE-WORKSPACE SWITCHER; workspace-layout, workspace-page-heading (shell).\n- Pages under app/(dynamic-pages)/(authenticated-pages)/: workspace/[workspaceSlug]/settings/page.tsx + settings/members/page.tsx; user/invitations/page.tsx + [invitationId]/page.tsx (+ pending-invitations-list, invitation-content).\n\nADAPT / CAVEATS:\n- Active-workspace pointer: NextBase writes user_settings.default_workspace; Foreman resolveActiveWorkspace reads user.default_workspace_id (backfilled from user_settings). Ported switcher should write user.default_workspace_id (Foreman pointer).\n- Members/invites are auth-user-only (workspace_members FK user_profiles). Channel-only principals are solo, join via channel_link_code — out of scope for members UI.\n- DROP from port: projects/* (no NextBase project sub-entity in Foreman), graphs/*, billing/* (separate concern).\n- Restyle to Foreman design system (components/ui, Tailwind) — do not copy NextBase styling wholesale.\n\nNET-NEW (Foreman-specific, no NextBase equivalent): connection-mode admin control (set workspace_settings.zapier_connection_mode member-first|shared|personal) + shared-connection picker (designate a zapier_identity by tagging zapier_identity.workspace_id). These go through the Hono agent server (packages/agents, touches Zapier identity/crypto); everything else = Next.js server actions in packages/web.\n\nARCH: workspace CRUD/members/invites = Next.js server actions in packages/web (RLS-enforced, matches NextBase). Hono agent-server routes only for the Zapier-connection bits.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-25T21:47:41Z","created_by":"HamChowderr","updated_at":"2026-06-26T02:10:21Z","started_at":"2026-06-26T01:31:54Z","closed_at":"2026-06-26T02:10:21Z","close_reason":"Workspace management UI shipped: sidebar switcher (list/switch/create) + /workspaces manager — members (role change/remove/leave), invitations (invite by email+role/revoke + invitee accept/decline), Zapier connection-mode picker, and shared-connection designation. Backed by agent /workspaces routes (8e5c31c) + web server actions (4a60bcb,a8f9256). Built via the web-\u003eagent service_role pattern to bypass the web client's RLS limits. next build + vitest 296 + biome all green.","dependencies":[{"issue_id":"foreman-c24s","depends_on_id":"foreman-qhbp","type":"discovered-from","created_at":"2026-06-25T14:47:41Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-qhbp","title":"Migrations cleanup + identity/tenancy unification onto the workspace multi-tenant model","description":"Owner direction 2026-06-25: clean + properly multi-tenant DB, migrations grouped one file per domain, no DROP migrations (re-baseline at source; zero prod users). KEY FINDING: Foreman straddles TWO identity models — (1) a Supabase-auth world (auth.users -\u003e user_profiles UUID, workspaces, user_roles, RLS) mostly INERT, and (2) legacy Better-Auth public.user (TEXT id) that ALL Foreman code uses; migration ...018 bolted UUID workspace_id onto the text-user tables. GOAL: wire Foreman runtime tables into the existing workspace multi-tenant model, decompose foreman_core monolith into per-domain migrations, prune dead boilerplate by code-usage, design durable/trigger-inbox tables for the Zapier SDK surface. Channel users have no Supabase auth account -\u003e web principal id already == auth.users id; channel principals standalone, bridged via channel_link_code. Multi-tenant is a MUST (single person OR org/team). Plan: docs/schema-and-identity-cleanup.md. Phase1 (workflow removal) 82b24fb; Phase2a (decompose+CMS cut) fa51547/67a4b25.","notes":"Phase 2a DONE: (1) decomposed foreman_core monolith -\u003e 7 nextbase-style domain migrations (fa51547; schema byte-identical, db:types:check empty diff). (2) Cut dead nextbase marketing/feedback CMS — 6 migrations + orphaned enums (67a4b25); billing + full workspace multi-tenant model KEPT; vitest 296 green. NEXT: Phase 2b multi-tenant wiring (workspace_id on remaining runtime tables, resolve+thread workspace_id through identity/middleware/RequestContext, scope reads/writes, solo workspace for channel principals). Plan: docs/schema-and-identity-cleanup.md. Consider running supabase-postgres-best-practices agent-skill to audit RLS/indexes/FKs before 2b.\nPhase 2b hardening DONE (from supabase-postgres-best-practices audit): (1) covering indexes for all 19 unindexed FKs (cff4687); (2) RLS enabled on 11 remaining service-role tables -\u003e uniform RLS coverage (just committed). Both: db reset + db:types:check green. REMAINING 2b = tenancy resolution/scoping (the behavior change): add workspace_id to stored_agent/api_key/capability_flag/channel_link_code/connection_alias, resolve+thread active workspace_id, scope ~20 read sites, channel-user solo workspace. DESIGN FORK to confirm: how channel-only users (no auth.users/user_profiles) map to workspaces.\nPhase 2b steps 1-2 DONE: schema foundation (44be9bd), identity resolution layer (7a32d7b), workspaceId threading (a0fc24e). Scoping model CONFIRMED by owner = 'shared resources, private chats': workspace-scope stored_agent + dashboards (artifact/app_data_snapshot/dashboard_share); workspace-aware connections (zapier_identity/connection_alias, member-first default); KEEP user-scoped: conversation (private chats, no change), api_key, capability_flag, channel_identity, channel_link_code. REMAINING: step3 scope stored_agent+dashboards, step4 connection-mode (workspace_settings.zapier_connection_mode), step5 web UI (switcher/invites/roles/shared-connection picker). Full plan in session note + docs/schema-and-identity-cleanup.md.","status":"closed","priority":1,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-06-25T19:14:52Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-26T02:10:26Z","close_reason":"Multi-tenant epic complete (steps 3-5): stored_agent + dashboards workspace-scoped (b572cc9/173df5c), workspace Zapier connection-mode resolution (96e1172), workspace management API + UI (8e5c31c/4a60bcb/a8f9256). Migrations decomposed + dead CMS cut + workspace_id wiring done earlier (fa51547/67a4b25/44be9bd). Durable/trigger-inbox table design moved to the durable rebuild foreman-l7xq.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bazc","title":"[durable] Remove the hand-rolled workflow engine; wait for Zapier durable API","description":"DECISION REVERSAL (supersedes foreman-98j3, resolves foreman-iyq6): owner does NOT want to hand-roll workflow persistence. Stop hand-rolling the runtime; keep the wiring that makes it multi-channel. Owner accepts NO workflow capability in the interim (durable EA pending, foreman-13mw).\n\nREMOVE (Zapier durable replaces 1:1):\n- lib/workflows/engine.ts (execute loop) + params.ts; workflow/workflow_step/workflow_run tables (add a NEW drop migration, don't edit applied ones); the frozen-action-tuple model.\n- Hand-written run/save/update/delete/get/list-workflows tools — these are SDK methods in the EXPERIMENTAL registry (walled now); regenerate from getRegistry when EA lands, don't hand-write.\n- poll-driver's polling-against-read-actions (replaced by trigger-inboxes, below).\n- 6 workflow test files for the removed engine/tools; 'save as workflow' instructions in prompt-template.ts + foreman.ts; datasets-label.ts eval trajectories that pin removed tools.\n\nKEEP \u0026 REPURPOSE (integration seam the SDK won't provide):\n- Driver/trigger FRAMEWORK (cron-driver-server.ts, driver lifecycle, attach/detach-trigger, workflow_trigger) — repoint: event source -\u003e Zapier trigger-inboxes (watchTriggerInbox, unwalled, available NOW), firing target -\u003e runDurable. This is the foreman-bdjp/ueep spike, now with a purpose.\n- channel-trigger.ts + mastra/signals/channel-trigger-provider.ts — multi-channel 'fire on Slack/Discord message', Foreman-unique. Keep.\n- /workflows UI page + SSE run-streaming plumbing — keep shell, repoint data to listWorkflows/getDurableRun.\n- save.ts capture concept -\u003e repurpose as a ./define authoring front-end (generate a durable workflow from captured conversation steps) instead of freezing tuples.\n\nOUT OF SCOPE (stays regardless, not workflow-specific): channels + webhook ingestion; approval/proposal flow (action_proposal used for EVERY action); per-user zapier_identity/connections.\n\nSTAGING: (1) gut engine+tables+CRUD tools + tests + prompt/eval refs NOW (verify suite+lint green); (2) keep the driver framework, channel-triggers, UI shell; (3) when durable EA lands: repoint UI + driver firing-target to runDurable, migrate poll-driver -\u003e trigger-inbox. Phase 1 (remove) is not blocked; phases 2-3 gated on foreman-13mw.","notes":"DECISION (clean sweep, owner-confirmed 2026-06-25): Phase 1 removes the ENTIRE hand-rolled workflow+trigger subsystem, NOT the keep/remove split. Remove: engine/params/save, all 9 workflow+trigger agent tools (incl attach/detach-trigger), routes/workflows.ts, cron-driver/poll-driver/channel-trigger + cron-driver-server, both signal providers (channel-trigger-provider, zapier-poll-provider), workflow/workflow_step/workflow_run/workflow_trigger tables (all 4), web /workflows UI + workflows-client + landing workflow section, ~10 test files, prompt/eval refs, channel-trigger call sites in 8 bots + webhook-server. KEEP: webhook-handler.ts (Mastra-native createWorkflow, unrelated). Triggers rebuilt fresh on durable+trigger-inboxes when EA lands (foreman-13mw).\nPhase 1 COMPLETE (clean sweep, AT-SOURCE per owner — NO drop migration). Workflow engine removed from code AND schema: tables stripped from foreman_core.sql + rls.sql + revoke_anon_grants.sql at source; deleted workflow_trigger.sql + workflow_run_observability.sql. db reset + db:types:check green. Gates: vitest 296 pass, biome clean, web next build, types check all green.","status":"closed","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-25T18:00:30Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE (code-verified): 82b24fb removed hand-rolled engine; replaced by lib/durable/ + lib/automations/; durable early-access live (b6d0db5), full loop proven (bf0468d/f1cd64a).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dwq9","title":"Tool gap: open-object params nested in arrays aren't coerced (table records/fields)","description":"Models emit open-bag params (dynamic keys, additionalProperties) as JSON strings. Mastra's built-in coerceStringifiedJsonValues only fixes TOP-LEVEL bags, not ones nested inside an array — so create-table-records.records[].data, update-table-records.records[].data, and create-table-fields.fields[].options/config fail validation ('Tool input validation failed') and the model retries (haiku errors out; sonnet reasons-through-it). NOT model-specific. Fix: SCHEMA_OVERRIDES in zapier-sdk-tools.ts rebuild those 3 tools' input schemas in our own zod with a field-level string-\u003eobject preprocess (jsonObjectParam) so the coercion runs during Mastra's ~standard validation (a wrapper around the SDK's foreign-zod schema gets bypassed). Verified through ~standard.validate + live on haiku: no errors, clean build. Top-level bags (runAction.inputs etc.) already handled by Mastra.","design":"Rebuild only the 3 affected tools' schemas in root zod; model-facing schema stays 'object'; if new nested-bag tools appear, add to SCHEMA_OVERRIDES.","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-20T21:56:07Z","created_by":"HamChowderr","updated_at":"2026-06-20T21:56:31Z","closed_at":"2026-06-20T21:56:31Z","close_reason":"Fixed + verified. SCHEMA_OVERRIDES rebuild create-table-records/update-table-records/create-table-fields input schemas in our zod with jsonObjectParam (field-level string-\u003eobject coercion). Confirmed through ~standard.validate AND live on haiku: stringified row data coerced, no validation errors, clean build. Top-level bags already handled by Mastra's built-in coercion.","dependencies":[{"issue_id":"foreman-dwq9","depends_on_id":"foreman-xfof","type":"discovered-from","created_at":"2026-06-20T14:56:06Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-l7nj","title":"Tool-approval action buttons (chat/message.tsx) -\u003e ui/Button","description":"The Approve / Decline / Always-Allow tool-approval controls (chat/message.tsx ~L55-86) are raw \u003cbutton\u003es — the app's most consequential interaction, missing design-system focus/disabled states. Swap to ui/button.tsx (destructive/ghost/default variants).","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:11:46Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-l7nj","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:11:46Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-d6v9","title":"Replace native window.confirm() with ui/AlertDialog for destructive workflow actions","description":"Two destructive actions use blocking, unstyled, untestable native confirm(): workflows/trigger-controls.tsx (~L39 detach) and workflows/workflow-detail-actions.tsx (~L67 delete 'cannot be undone'). Swap to ui/alert-dialog.tsx. Highest-value fix — destructive + a11y + testability.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:11:41Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-d6v9","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:11:41Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2aj0","title":"Foreman chat tool-calling broken: tools emit additionalProperties:object (Anthropic 400)","description":"Every foreman tool-calling chat turn fails with Anthropic 400: 'tools.N.custom: For object type, additionalProperties: object is not supported. Please set additionalProperties to false'. Root cause: 8 always-sent tools have z.record()/open-object INPUT fields that serialize to additionalProperties:\u003cschema\u003e, which the current Anthropic API rejects for non-strict custom tools. Confirmed via /api/agents/foreman introspection — offending input fields: run-action(inputs), get-input-fields-schema(inputs), list-input-field-choices(inputs), create-table-fields(fields.items.options/config), create-table-records(records.items.data), update-table-records(records.items.data), run_workflow(inputs), attach_trigger(poll.inputs). run-action is core/always-loaded so ALL tool turns break. NOT caught by CI (no real provider keys). Likely a Mastra-alpha schema-serialization regression OR Anthropic tightening. FIX OPTIONS: a Mastra/AI-SDK schema sanitizer that rewrites additionalProperties object→false (or true→false) for object schemas before the provider request; verify per-app dynamic inputs (run-action) still work after. Discovered while building chat-driven dashboards (create_dashboard renders fine once this is fixed).","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-19T19:29:15Z","created_by":"HamChowderr","updated_at":"2026-06-19T22:51:08Z","closed_at":"2026-06-19T22:51:08Z","close_reason":"Fixed: tool-schema-sanitizer rewrites open-map (z.record) inputs to JSON strings + closes objects with additionalProperties:false; verified live — chat now responds (full tool set accepted by Anthropic, no 400) and multi-model send works. Merged on feat/data-dashboards (76a6c38/c122058).","dependencies":[{"issue_id":"foreman-2aj0","depends_on_id":"foreman-xl8m","type":"discovered-from","created_at":"2026-06-19T12:29:14Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hcim","title":"PROD/staging: drop+recreate catalog_vectors \u0026 action_history at 384d after fastembed switch","description":"The embeddings switch changed EMBEDDING_DIMENSION 1536-\u003e384 in catalog/vector.ts and rag/index.ts. ensureIndex/ensureCatalogIndex skip creation if the index already exists, so on any env where catalog_vectors/action_history already exist at 1536d, 384d upserts will FAIL. Before deploying: drop those two PgVector indexes (and re-seed catalog / re-index action history) so they recreate at 384d. Local was clean (tables didn't exist).","notes":"RUNBOOK (now scripted via npm run embeddings:reindex). Deploy sequence for any env with existing 1536d indexes (VPS prod):\n1. Deploy the 384d fastembed code.\n2. From packages/agents with the TARGET DATABASE_URL in env: 'npm run embeddings:reindex' (dry-run, confirm it reports vector(1536)), then 'npm run embeddings:reindex -- --yes' to drop catalog_vectors + action_history.\n3. Restart/reload agents (PM2) so the new dimension is live.\n4. 'npm run catalog:embed' to repopulate catalog_vectors at 384d (re-embeds existing app_catalog via fastembed).\n5. action_history recreates empty and rebuilds as new actions run (no historical backfill script yet — optional follow-up if old recall matters).\nScript: packages/agents/scripts/reindex-embeddings.ts (dry-run by default, --yes to apply). Committed on 'refinement'.\nDEPLOY ENV CORRECTION: agents run via Coolify (Docker) on the VPS, not bare PM2. So runbook step 3 'restart agents (PM2)' = restart/redeploy the Coolify resource (the container); PM2 reload happens inside it. Run embeddings:reindex + catalog:embed via Coolify's terminal/exec against the container (with the prod DATABASE_URL the container already has), or a one-off command in that env.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-19T09:08:05Z","created_by":"HamChowderr","updated_at":"2026-06-25T17:49:35Z","closed_at":"2026-06-25T17:49:35Z","close_reason":"Resolved via self-healing code instead of a manual prod runbook: ensureIndex (rag) + ensureCatalogIndex (catalog) are now dimension-aware — if an index exists at the wrong dimension (the 1536-\u003e384 switch) they describeIndex, drop, and recreate at EMBEDDING_DIMENSION. Runs lazily on first seed/index/search, so any env self-heals on next use; no manual prod surgery. catalog needs a re-seed after the auto-drop (deploy/seed handles). Verified via 4 unit tests (mocked PgVector: create-when-absent, leave-correct, drop+recreate-stale-1536, leave-on-describe-failure). No live prod/staging env currently exists.","dependencies":[{"issue_id":"foreman-hcim","depends_on_id":"foreman-1fjd","type":"discovered-from","created_at":"2026-06-19T02:08:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gld8","title":"Chat 500 root cause: invalid ANTHROPIC_API_KEY in agents/.env.local","description":"Every agent (foreman/discovery/execution/history/supervisor) and even GET /api/agents return 500 {error: Internal Server Error}. Real cause found via standalone repro (scripts/repro-agent-500.ts bypassing Mastra's console/pino mangling): Anthropic returns 401 'invalid x-api-key' on every model call. The key in packages/agents/.env.local is well-formed (sk-ant-api03-, 108 chars) but rejected = expired/revoked/wrong-workspace. Mastra wraps the 401 as generic 'Internal Server Error'. Earlier OpenAI-quota theory was a red herring from stale logs; fastembed fixed embeddings but model calls still fail. FIX: user must replace ANTHROPIC_API_KEY with a valid key, then restart agents dev server. Not something Claude can do (entering API keys is prohibited).","notes":"RESOLVED. Chat was THREE stacked bugs: (1) invalid ANTHROPIC_API_KEY -\u003e fixed via Infisical (otaku-internal/dev); keys commented out of agents/.env.local so Infisical supplies them; run agents with 'infisical run --projectId e56e0da5-... --env dev --recursive --silent -- npm run dev'. (2) custom tools set strict:true -\u003e Anthropic grammar mode + schema limits -\u003e removed strict:true from all 12 custom tools. (3) THE BIG ONE: @mastra/deployer + @mastra/server resolved to 1.43.0 (via ^1.42.0-alpha.3 range) while @mastra/core pinned to 1.42.0-alpha.3. deployer 1.43.0 calls this.mastra.getStudio() (added in core 1.43.0) which doesn't exist on core 1.42.0-alpha.3 -\u003e TypeError in checkRouteAuth -\u003e EVERY authed HTTP route 500s (built-in /api/agents AND custom /chat) while agents worked in-process. FIX: pinned @mastra/deployer + @mastra/server to 1.42.0-alpha.3 in root overrides + full reinstall. Found the real error by adding server.onError (Mastra's default silently swallows custom-route errors). VERIFIED: /chat/foreman streams 200, /api/agents 200, custom routes still 401. Also kept: prefix-based customMiddleware (avoids body-consumption for Mastra-owned paths), server.onError (logs swallowed errors).","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-18T17:42:23Z","created_by":"HamChowderr","updated_at":"2026-06-18T19:39:44Z","closed_at":"2026-06-18T19:39:44Z","close_reason":"All 3 root causes fixed (key via Infisical, strict:true removed, @mastra/deployer+server pinned to 1.42.0-alpha.3 to match core). /chat streams 200, verified.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-kpxf","title":"Chat image upload: enable vision + wire AI Elements/AI SDK file parts","description":"Paperclip greyed: models.ts vision:false, missing /api/models + /api/files/upload. Fix via existing AI Elements PromptInput + AI SDK v6 native file parts (no storage endpoint), like storycraft. Enable vision, fix capability read, route attachments through useProviderAttachments, render image parts.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-18T16:21:14Z","created_by":"HamChowderr","updated_at":"2026-06-18T20:29:46Z","closed_at":"2026-06-18T20:29:46Z","close_reason":"Completed this session (commit ffc4837).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-s3qd","title":"Onboarding 'test connection' fails on first connect (ZapierNotConnected race)","description":"step-try.tsx hits /chat/foreman right after OAuth; getSdkForUser reads zapier_identity before the write is visible -\u003e ZapierNotConnected, opaque error. Fix: read-after-write retry in zapier/sdk.ts + 'syncing connection' UX in step-try.tsx.","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-18T16:21:07Z","created_by":"HamChowderr","updated_at":"2026-06-18T20:29:46Z","closed_at":"2026-06-18T20:29:46Z","close_reason":"Completed this session (commit ffc4837).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dz3b","title":"Chore branch: zod resolves to 2 versions (4.4.3 + 4.3.6) — npm ci fails dep-uniqueness on PR #20","description":"On PR #20 (chore/zapier-sdk-0.70.4-durable-reverify -\u003e main) ALL CI jobs fail at npm ci because the dep-uniqueness postinstall check reports 'zod has 2 resolved versions: 4.4.3, 4.3.6'. The SDK 0.70.4 bump (and/or @mastra alpha) pulled in a transitive zod@4.3.6 alongside the pinned 4.4.3; the root override {zod:4.4.3} didn't collapse it because package-lock.json wasn't regenerated after the bump. Fix: regenerate the lockfile (npm install at root so the override applies), verify 'node scripts/check-dep-uniqueness.mjs' + 'npm ci' pass locally, commit the lockfile to the chore branch, push, re-run #20 CI. Blocks merging today's README/.env/versioning work to main and the v0.1.0 baseline tag.","status":"closed","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-18T03:42:05Z","created_by":"HamChowderr","updated_at":"2026-06-18T04:05:39Z","started_at":"2026-06-18T03:44:39Z","closed_at":"2026-06-18T04:05:39Z","close_reason":"Fixed: aligned zod override to 4.3.6 (SDK 0.70.4's exact pin); single zod, dep-uniqueness + all CI green. Merged to main via PR #20.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-f1ef","title":"F1: Zapier input-field tool categorization is inverted (canonical vs deprecated)","description":"Live sweep (foreman-xb68) proved the SDK's canonical input-field methods are getActionInputFieldsSchema/listActionInputFields/listActionInputFieldChoices; the *InputField* names are deprecated aliases (dist/plugins/deprecated/inputFields.js). zapier-sdk-tools.ts has it backwards: READ_ONLY holds the deprecated getInputFieldsSchema+listInputFieldChoices, EXCLUDED holds only listInputFields (1 of 3 aliases), and the 3 canonical methods are auto-surfaced as tools with readOnlyHint:false (wrong) and as duplicates. Agent sees 5 tools for 3 ops. Correct: canonical trio -\u003e READ_ONLY; all 7 deprecated aliases -\u003e EXCLUDED. BLAST RADIUS: deprecated kebab names get-input-fields-schema/list-input-field-choices are pinned in eval trajectories (scripts/datasets-label.ts, datasets-mini-experiment.ts), the live SDK test (tests/sdk/zapier-sdk.test.ts execs them by name), and web docs (tool-discovery.mdx). Must re-label in lockstep or live test + trajectory scorer break. Forward risk: alias removal by Zapier breaks them anyway.","notes":"User directive (2026-06-22): get Foreman off ALL deprecated Zapier SDK surface, not just tool categorization. Added scope: (1) PRODUCTION code src/lib/zapier/discovery.ts calls deprecated sdk.getInputFieldsSchema() + sdk.listInputFieldChoices() (helpers getInputFieldsSchema/getInputFieldChoices) -\u003e swap to canonical getActionInputFieldsSchema + listActionInputFieldChoices (same args; aliases). (2) durable probe scripts use deprecated snake_case source_files/zapier_durable_version (0.73.1 added camelCase sourceFiles/zapierDurableVersion) -- cosmetic, walled API. SDK now 0.76.0; deprecated aliases still present but user wants off them. Bumped P2-\u003eP1. Blast radius unchanged: eval trajectories + live SDK test + web docs pin the deprecated kebab tool names -- migrate in lockstep.","status":"closed","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-17T04:11:47Z","created_by":"HamChowderr","updated_at":"2026-06-22T22:52:22Z","started_at":"2026-06-22T22:40:14Z","closed_at":"2026-06-22T22:52:22Z","close_reason":"DONE + verified. Canonical input-field trio (getActionInputFieldsSchema/listActionInputFields/listActionInputFieldChoices) -\u003e READ_ONLY; all 3 deprecated aliases -\u003e EXCLUDED. Production calls in discovery.ts migrated to canonical SDK methods. Lockstep updated across 13 files: prompt-template.ts, foreman+discovery agent instructions, tool-catalog.ts, tool-schema-sanitizer.ts, eval trajectories (datasets-label/mini-experiment), live sdk test, 3 unit tests (zapier-sdk-tools/prompt-template/tool-schema-sanitizer), 2 web landing demos, tool-discovery.mdx. VERIFIED: 323 unit tests pass, biome clean. Live SDK tier (tests/sdk) updated to canonical names but NOT executed (needs Zapier creds). snake_case durable params left as-is (not deprecated until SDK \u003e=0.73.1).","dependencies":[{"issue_id":"foreman-f1ef","depends_on_id":"foreman-xb68","type":"discovered-from","created_at":"2026-06-16T21:11:47Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xb68","title":"Full live-introspection sweep of @zapier/zapier-sdk 0.70.4","description":"Full SDK surface sweep — see session","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-17T04:01:27Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-17T04:01:48Z","closed_at":"2026-06-17T04:12:41Z","close_reason":"Live-introspected @zapier/zapier-sdk@0.70.4 via new scripts/sdk-surface-sweep.ts. Verified: 4 entrypoints (., ./experimental, ./define, ./apps); main instance 39 methods / mcp registry 37; experimental 75/71; 36 experimental-only (18 trigger-inbox + 5 durable-run + 13 workflow); 208 named exports on main. Documented previously-missed surfaces: ./define durable authoring DSL (defineDurable/defineTool/defineComponent + step/wait/createCallback), the 208-export plugin/resolver/schema/telemetry runtime, getRegistry package-variant counts, full deprecated-alias map. Corrected Foreman tool count 20-\u003e28. Action-type enum still 8 (no Zap-creation). Durable wall unchanged (18/18). Refreshed docs/zapier-sdk-capability-map.md. Spawned foreman-f1ef (input-field categorization inverted) + foreman-3due (error coverage 12/19).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ykfu","title":"Full live-introspection sweep of @zapier/zapier-sdk 0.70.4 — every entrypoint, registry, export","description":"User wants complete, verified knowledge of the ENTIRE SDK surface (not just durable/workflows) to showcase to the Zapier community via Foreman. Prior capability map (docs/zapier-sdk-capability-map.md) is doc/changelog-derived and snapshotted at 0.69.3 — never live-introspected. This sweep introspects the installed 0.70.4 package directly: all 4 entrypoints (., ./experimental, ./define, ./apps), getRegistry() across all 'package' values, full SDK instance method list (main vs experimental), every named export (classes/constants/formatters/resolvers/services/utils), action-type enum, and the low-level API client surface. Then diff vs Foreman's READ_ONLY/APPROVAL_REQUIRED/EXCLUDED/PAGINATED sets to surface anything un-categorized (blind spots). Deliverable: refreshed capability map at 0.70.4 with live-verified counts.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-17T04:01:19Z","created_by":"HamChowderr","updated_at":"2026-06-25T16:11:42Z","closed_at":"2026-06-25T16:11:42Z","close_reason":"Satisfied: live-introspection sweep (sdk-surface-sweep.ts) exists and was re-run on 0.79.0 on 2026-06-25; docs/zapier-sdk-capability-map.md is the live-introspected deliverable (all 4 entrypoints, every getRegistry cut, instance methods, named exports). Supersedes the 0.70.4-specific framing.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2xdk","title":"[bump] Behavior-change verification checklist (approvalMode, auth, normalizeError, pagination, zod)","description":"Gate for the 0.48-\u003e0.69 bump (foreman-8ujc). Verify against real code: (1) 0.50 approvalMode collapse, no back-compat — Foreman leaves approvalMode unset so responses throw ZapierApprovalError; confirm handleSdkError in zapier-sdk-tools.ts still works. (2) 0.51 client-credentials auth default — CONFIRMED WORKING via probe (getProfile OK 2026-06-11); re-verify per-user PKCE path in lib/zapier/sdk.ts. (3) 0.67 normalizeError no longer wraps Error subclasses — check instanceof reliance in handleSdkError. (4) 0.69.1 pagination consume-once — check seed.ts/discovery.ts. (5) zod: SDK wants 4.3.6, repo overrides 4.4.3; npm run check:deps must pass.","acceptance_criteria":"All 5 checks verified; npm install + check:deps + build + test (mocked) + test:sdk green. Blocks foreman-8ujc.","notes":"DONE 2026-06-11. All 5 behavior checks PASS (static + 0.69.3 .d.ts inspection + a reverted trial install of 0.69.3). Full detail lives in docs/zapier-sdk-capability-map.md (Bump-verification checklist + Install mechanics). Summary: (1) approvalMode unset-\u003eserver default 'throw'-\u003eZapierApprovalError caught by handleSdkError catch-all (ZapierApprovalError extends ZapierError); follow-up filed for unsurfaced approval URL. (2) string credentials still valid (per-user PKCE path OK). (3) instanceof error handling intact; all 11 Zapier*Error classes present. (4) listApps {data,nextCursor} unchanged; zero .items() calls; consume-once-immune. (5) zod collapses to single 4.4.3 ONLY on a full clean reinstall, not incremental. Trial also discovered: a clean reinstall drifts @mastra (memory 1.17.5-\u003e1.20.2, pg 1.10.0-\u003e1.12.1) incompatible w/ pinned core@1.32.1 -\u003e 5 mocked-test failures unrelated to Zapier. Working tree restored to committed state (SDK 0.48.0, single zod, check:deps PASS, prev-failing tests 7/7 green). build+test+test:sdk-green AT 0.69.3 folded into 8ujc (can't be green without committing the bump + pinning @mastra).","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:30:12Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-11T14:45:57Z","closed_at":"2026-06-11T15:11:13Z","close_reason":"All 5 behavior changes verified safe (static + 0.69.3 .d.ts + reverted trial install). check:deps proven green via clean reinstall. Install mechanics (zod clean-reinstall requirement + @mastra drift) + remaining gate-suite-green folded into foreman-8ujc; UX follow-up filed. Full record in docs/zapier-sdk-capability-map.md.","dependencies":[{"issue_id":"foreman-2xdk","depends_on_id":"foreman-8ujc","type":"discovered-from","created_at":"2026-06-11T01:30:12Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-1ey8","title":"Generate supabase types + fix schema.ts drift","description":"Replace hand-written schema.ts with supabase gen types output, fix UserRow camelCase, drop stale org_id refs, add WorkflowTriggerRow.","status":"closed","priority":1,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-05-10T20:38:59Z","created_by":"HamChowderr","updated_at":"2026-05-11T01:16:48Z","closed_at":"2026-05-11T01:16:48Z","close_reason":"Generated types replace hand-written schema.ts (deleted). New stored_agent migration ports tables that /editor needed. Typed client uncovered org_id→workspace_id stale ref in zapier/sdk.ts (fixed). CI job db-types runs supabase gen types and diffs against committed file.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9zsp","title":"Wire AIMock GitHub Action — run agent tests on every PR","description":"Foreman has no CI workflows today. Local-only test runs via vitest globalSetup at packages/agents/tests/aimock-setup.ts work, but nothing watches PRs. Wire CopilotKit/aimock@v1 (or whatever the current pinned major is — verify on https://aimock.copilotkit.dev/github-action/ before writing) into .github/workflows/test.yml.\n\nScope:\n1. Read https://aimock.copilotkit.dev/github-action/ for current action API + version pin recommendation. Do not guess from training data.\n2. Create .github/workflows/test.yml with jobs:\n - agents: runs 'cd packages/agents \u0026\u0026 npm test' under aimock action with the local aimock.json\n - web: runs 'cd packages/web \u0026\u0026 npm run build' (+ lint)\n - root: runs 'npm run lint' and dep-uniqueness check\n3. Trigger on push to main + PR.\n4. Cache npm via actions/setup-node cache option.\n5. Confirm aimock action picks up packages/agents/aimock.json + packages/agents/tests/fixtures/aimock/ correctly.\n6. Open a throwaway PR to verify the workflow runs green, then merge.\n\nAcceptance:\n- New PRs show test status checks before merge\n- Failure on agent test breaks the build","notes":"Unblock CI on PR #14: (1) restored chat-adapter transitive deps (113 packages — discord.js, @octokit/*, @linear/sdk, @slack/*, @googleapis/*, @microsoft/teams.*) that broke mastra dev and npm ci; (2) added biome format step to supabase db:types codegen pipeline so generated database.types.ts conforms to project style — no workaround; (3) biome auto-formatted 7 other source files; (4) untracked fumadocs .source/ (already gitignored, regen on postinstall).","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T23:31:33Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-05-09T23:31:55Z","closed_at":"2026-06-11T19:41:22Z","close_reason":"CI agent tests green on main (run 27372554494/040b6a6) via in-process AIMock — acceptance met. v4i4 (fixture-drift design, P4) is a future enhancement, not a prerequisite; unblock-dep over-scoped.","dependencies":[{"issue_id":"foreman-9zsp","depends_on_id":"foreman-v4i4","type":"blocks","created_at":"2026-05-09T16:31:49Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8dyy","title":"Build run_workflow + delete_workflow + update_workflow agent tools","description":"Round out the CRUD trio with the runtime/edit half. After these, a saved workflow is fully manageable by the agent.\n\nScope:\n1. agents/src/mastra/tools/run-workflow.ts — POST /workflows/:id/run with optional input overrides. SSE stream from server, agent surfaces step-by-step status to the user.\n2. agents/src/mastra/tools/update-workflow.ts — PATCH /workflows/:id (rename, edit steps, enable/disable).\n3. agents/src/mastra/tools/delete-workflow.ts — DELETE /workflows/:id (APPROVAL_REQUIRED, destructive).\n4. agents/src/mastra/tools/list-workflow-runs.ts — GET /workflows/:id/runs for history.\n5. Wire all into createForemanAgent.\n6. Mark run/update/delete as APPROVAL_REQUIRED.\n\nAcceptance:\n- Agent can run a previously-saved workflow on demand and report each step's status\n- Agent can list past runs of a workflow so the user can see history\n- Agent can rename and edit step inputs\n- Delete asks for confirmation and irreversibly removes the workflow + steps + runs (cascade per existing schema)","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:02:12Z","created_by":"HamChowderr","updated_at":"2026-05-10T19:09:54Z","started_at":"2026-05-10T18:52:11Z","closed_at":"2026-05-10T19:09:54Z","close_reason":"Three more tools wired: run_workflow drains executeWorkflow generator into a summary (success/failed/param_request/no_steps); update_workflow PATCHes name + is_template; delete_workflow cascade-deletes runs + steps + workflow with ownership check. Both run + delete marked requireApproval=true. Added DELETE /workflows/:id route. 10 new unit tests + mastra-agent.test.ts asserts all 9 custom tools register. 245 tests pass.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8k0g","title":"Build save_workflow + list_workflows + get_workflow agent tools","description":"The smallest agent-facing slice that closes the worst gap. With these three tools, the agent can persist a multi-step plan (save_workflow), let the user discover what they have (list_workflows), and inspect/edit (get_workflow). Covers the 'Want me to save this as a workflow?' offer that the prompt already makes but cannot deliver.\n\nScope:\n1. agents/src/mastra/tools/save-workflow.ts — POST /workflows with { name, description, steps[] }, where each step is one Zapier runAction invocation { app, actionType, action, connection, inputs } OR a custom-tool call. Validates schema with zod.\n2. agents/src/mastra/tools/list-workflows.ts — GET /workflows (filter by user, paginate)\n3. agents/src/mastra/tools/get-workflow.ts — GET /workflows/:id\n4. Wire all three into createForemanAgent's tools map (agents/src/mastra/agents/foreman.ts).\n5. Update prompt-template.ts to point the existing 'save as workflow' offer at save_workflow, with one example showing the call.\n6. Mark save_workflow as APPROVAL_REQUIRED (write op).\n7. Unit test the schema validation on each tool.\n\nOut of scope here (separate issues): triggers, run_workflow, UI page, cron driver. This is just the persistence + read trio.\n\nAcceptance:\n- Agent can take a free-form 'do X then Y then Z' user request, walk the action shapes, and call save_workflow with valid steps[]\n- Workflow appears in DB with all step rows\n- list_workflows + get_workflow return it\n- A new mini experiment item ('Save a workflow that emails me my daily Calendly bookings') scores judge \u003e= 0.7","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:01:58Z","created_by":"HamChowderr","updated_at":"2026-05-10T18:41:23Z","started_at":"2026-05-10T18:26:13Z","closed_at":"2026-05-10T18:41:23Z","close_reason":"Three CRUD-read tools wired: save_workflow (delegates to saveWorkflowFromConversation, captures executed proposals from conversation), list_workflows (Supabase select), get_workflow (Supabase select + parsed steps). All three read userId from RequestContext via Mastra's runtimeContext. 8 new unit tests cover happy paths, error cases, and missing-context. mastra-agent.test.ts updated to assert all six custom tools. Prompt phase-5 close-loop references the new tools by name. 235 tests pass.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-v8k1","title":"Foreman workflow tools — agent can save/run/trigger workflows end-to-end","description":"Why this exists: The Zapier SDK and CLI are confirmed single-shot only — no API to create/save/trigger Zaps. Verified at node_modules/@zapier/zapier-sdk/dist/api/schemas.js:69-75 (actionType enum is read|search|write only). Zapier's Triggers API is roadmap (May 2026), and even shipped will only be event subscription, not Zap persistence. Therefore Foreman must own workflow persistence and trigger fan-out in its own tables — which it already does (workflow / workflow_step / workflow_run, /workflows/* routes, channel webhook handlers).\n\nThe current agent has no tools to save or trigger workflows. Its prompt says 'Want me to save this as a workflow?' but cannot deliver. This causes it to fall back to telling users to set automations up in zapier.com — the exact behavior you forbade.\n\nScope of this epic: build the agent-side tools that bridge agent intent to Foreman's existing /workflows/* routes, plus any missing route work (attach_trigger), plus a cron driver for scheduled triggers, plus a UI page so saved automations are visible.\n\nAcceptance:\n- Agent can answer 'make X happen when Y happens' end-to-end without mentioning zapier.com\n- User can see saved automations on a /workflows page in the web app\n- Re-running the 80-item baseline shows judge avg materially improved on channel-triggered-workflow, save-as-workflow, scheduled-workflow categories (currently 0.226, 0.150, 0.208 respectively)","notes":"Investigation 2026-06-11: the agent-facing workflow tools this epic calls 'missing' ALREADY EXIST — save_workflow/list_workflows/get_workflow/run_workflow/update_workflow/delete_workflow/attach_trigger/list_workflow_triggers/detach_trigger (all wired in foreman.ts), plus cron-driver (workflows/cron-driver.ts) and channel-trigger (workflows/channel-trigger.ts). Real remaining work = /workflows UI page + poll-trigger driver + e2e verification. Premise also superseded by Zapier's experimental durable-workflow API (see foreman-iyq6). Needs rewrite, not greenfield build.","status":"closed","priority":1,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:01:40Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: agent saves/runs/lists/inspects automations via mastra/tools/automations.ts -\u003e lib/automations -\u003e durable deploy; /automations page+routes shipped.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-3h6k","title":"Agent quality pass: direct tools, raised step ceiling, prompt rewrite","description":"Conversation analysis showed foreman silently truncating mid-stream on multi-step Tables flows. Root causes: (a) only 7 tools in CORE so agent burned steps on search_tools/load_tool detours; (b) wrong run-action keys guessed (create_fields vs create-table-fields); (c) Tables called via run-action when they're SDK-level operations; (d) default 15-step ceiling exhausted before final message; (e) substring search bug in connect_zapier picked wrong app. Fix: expand CORE to 22 tools (app discovery + all 12 Tables tools + find-unique-connection), stopWhen=stepCountIs(40), prompt rewrite with explicit two-paths section + always-close-the-loop rule, search ranking fix in connect_zapier.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-05-09T01:37:59Z","created_by":"HamChowderr","updated_at":"2026-05-09T01:38:12Z","closed_at":"2026-05-09T01:38:12Z","close_reason":"Implemented in 8d23b85. Verified: agent now calls create-table directly, mastra dev boots cleanly, 224 unit + 12 SDK Read tests pass.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-854t","title":"Add regression tests for mastra dev hang fix","description":"Add three tests preventing regression of the lazy-init Zapier SDK + zod dedup fixes: (1) mastra dev startup smoke test, (2) lazy-init contract assertion (createZapierSdk not called at agent construction), (3) single-version invariant for zod and @mastra/core in node_modules. These would have caught the original hang in CI.","notes":"Added 3 regression test files (7 tests total) covering the mastra dev hang fix: tests/unit/lazy-init-zapier.test.ts (4 tests — verifies createZapierSdk is not called at module load OR agent construction for foreman/discovery/execution), tests/unit/dep-overrides.test.ts (2 tests — walks node_modules to verify exactly 1 resolved version of zod and @mastra/core), tests/integration/devserver-startup.test.ts (1 test — actually spawns 'mastra dev' on a free port, polls /api with fetch until 200, kills process tree; ~17s end-to-end). All 3 would have caught the original hang in CI.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T00:04:02Z","created_by":"HamChowderr","updated_at":"2026-05-09T00:11:31Z","started_at":"2026-05-09T00:04:09Z","closed_at":"2026-05-09T00:11:31Z","close_reason":"Regression tests added and all passing.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dt3u","title":"Lazy-init Zapier SDK to fix mastra dev hang","description":"generateZapierTools() in packages/agents/src/lib/zapier-sdk-tools.ts calls createZapierSdk() and sdk.getRegistry() at agent-construction time, which runs at module load. This mutates global state (likely zod registry — 5 zod copies in node_modules) and causes mastra dev to hang during route registration. Defer createZapierSdk + getRegistry until first tool execution. The static list of tool names is needed for agent registration, so the registry call must either run before any agent is constructed but in a way that doesn't break Mastra, or be replaced by a hardcoded tool name list. See vault note reference_foreman_mastra_dev_hang.md for full bisect evidence.","notes":"Lazy-init implemented: SDK call deferred via Mastra DynamicArgument tools/inputProcessors function form (foreman.ts, discovery.ts, execution.ts), with module-level memoization in zapier-sdk-tools.ts for the default no-arg call. Build verified, unit tests pass (1 unrelated env-test failure on FOREMAN_MODE default). However, mastra dev still hangs because Mastra Studio's registerRoutes() resolves the dynamic tools function during init, which calls createZapierSdk() before toJSONSchema runs in the same async chain. To fully unblock mastra dev, this must be paired with foreman-iibc (zod dedup) OR foreman-g8pl (mastra core upgrade). The lazy-init change is still required as a prerequisite for both — without it, the SDK call fires at module top and the hang signature is identical.","status":"closed","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-08T07:59:51Z","created_by":"HamChowderr","updated_at":"2026-05-08T22:43:29Z","started_at":"2026-05-08T22:09:14Z","closed_at":"2026-05-08T22:43:29Z","close_reason":"Combined fix: lazy-init Zapier SDK (foreman-dt3u) + zod dedup via npm override to 4.3.6 (foreman-iibc) unblocks mastra dev. Verified: builds clean, all 221 unit tests pass, mastra dev boots in 3.3s with API at :4111/api and Studio at :4111. Single zod copy (4.3.6) consolidates from 9 versions across @zapier/* and other deps.","dependencies":[{"issue_id":"foreman-dt3u","depends_on_id":"foreman-i2se","type":"discovered-from","created_at":"2026-05-08T00:59:50Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4olb","title":"Verify mastra dev hang is Foreman-specific (test on blank Mastra project)","description":"On Windows, mastra dev hangs in createHonoServer's registerRoutes() with studio:true + isDev:true on this repo. Patched workaround: mastra build, flip studio:false to true in .mastra/output/index.mjs, set MASTRA_STUDIO_PATH=node_modules/mastra/dist/studio, run node directly. Hypothesis: hang is caused by something in Foreman init (multi-provider/caching layer, editor wiring, agent count, RAG, or processor chain) - not a generic Windows Mastra bug. Test plan: 1) mastra create blank-mastra-test with one trivial agent, 2) Run mastra dev on Windows - does it hang?, 3) If no hang: bisect Foreman by adding agents/processors/storage one at a time, 4) If hangs too: file upstream bug. Reproducer: process alive, 0 CPU, no port bound, log stops at file-logger line. Workaround currently in use: patched-build approach above.","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-05-08T07:16:22Z","created_by":"HamChowderr","updated_at":"2026-05-08T07:20:56Z","closed_at":"2026-05-08T07:20:56Z","close_reason":"Wrong tracker — this is reference material, not a tracked task. Moving to vault note.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-cef6","title":"Web: channel connect pages (Telegram, Discord, Slack)","description":"Three pages at /settings/integrations/{telegram,discord,slack}. Each shows: (1) bot invite/add link, (2) step-by-step instructions, (3) a Generate Link Code button that calls POST /channel-links and shows an 8-char code + countdown timer, (4) confirmation state once linked (polls GET /channel-identities). Telegram uses @ForemanBot, Discord uses bot invite URL, Slack uses Add to Slack OAuth URL.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:24:30Z","created_by":"HamChowderr","updated_at":"2026-04-30T00:39:53Z","closed_at":"2026-04-30T00:39:53Z","close_reason":"Closed","dependencies":[{"issue_id":"foreman-cef6","depends_on_id":"foreman-wco0","type":"blocks","created_at":"2026-04-29T17:24:45Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-vp1e","title":"Web: MCP connection page (/settings/integrations/mcp)","description":"MCP page: explains what MCP is (1-2 sentences), shows the user's MCP server URL (NEXT_PUBLIC_AGENT_SERVER_URL/mcp), API key manager section (list keys, create new with name input, revoke), copy-to-clipboard config snippets for Claude Desktop and Cursor. Uses /api-keys agent routes. One-time key reveal modal on create.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:24:04Z","created_by":"HamChowderr","updated_at":"2026-04-30T00:39:53Z","closed_at":"2026-04-30T00:39:53Z","close_reason":"Closed","dependencies":[{"issue_id":"foreman-vp1e","depends_on_id":"foreman-ukhg","type":"blocks","created_at":"2026-04-29T17:24:44Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xru8","title":"Web: /settings/integrations hub page","description":"Integration hub at /settings/integrations. Shows cards for: MCP (Connect Claude/Cursor), Telegram, Discord, Slack, Teams (coming soon), WhatsApp (coming soon). Each card shows connection status (linked/unlinked), channel icon, brief description, and Connect button. Fetches /channel-identities to show live status.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:23:59Z","created_by":"HamChowderr","updated_at":"2026-04-30T00:39:53Z","closed_at":"2026-04-30T00:39:53Z","close_reason":"Closed","dependencies":[{"issue_id":"foreman-xru8","depends_on_id":"foreman-wco0","type":"blocks","created_at":"2026-04-29T17:24:46Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-n3ix","title":"Web: settings layout + shell","description":"Create app/settings/layout.tsx with a left sidebar nav (Integrations, API Keys, Account) and top header. Protect with Supabase session check → redirect /auth/login. Match Foreman brand (#FF4F00 orange, #FFFDF9 off-white, #201515 dark). Add settings link to existing chat UI nav.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:23:54Z","created_by":"HamChowderr","updated_at":"2026-04-30T00:39:52Z","started_at":"2026-04-30T00:24:54Z","closed_at":"2026-04-30T00:39:52Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-i9z8","title":"Bot: /link command handler (Telegram, Discord, Slack)","description":"Add /link \u003ccode\u003e command to all three bots. When received: look up the code in channel_link_code (must be unused and not expired), mark used_at, update channel_identity row for this channel_user_id to set user_id = the code's user_id (or create channel_identity if missing). Reply success/error. Allows web users to link their channel accounts from /settings/integrations.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:23:49Z","created_by":"HamChowderr","updated_at":"2026-04-30T00:39:52Z","closed_at":"2026-04-30T00:39:52Z","close_reason":"Closed","dependencies":[{"issue_id":"foreman-i9z8","depends_on_id":"foreman-wco0","type":"blocks","created_at":"2026-04-29T17:24:42Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wco0","title":"Agent routes: channel link codes + identities","description":"Add routes for channel account linking. POST /channel-links generates a short 8-char alphanumeric code, stores in channel_link_code with 15-min expiry, returns {code, expires_at}. GET /channel-identities lists the user's connected channel identities. DELETE /channel-identities/:id unlinks. All require authMiddleware.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:23:44Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-04-30T00:24:53Z","closed_at":"2026-04-30T00:39:52Z","close_reason":"Closed","dependencies":[{"issue_id":"foreman-wco0","depends_on_id":"foreman-k5nu","type":"blocks","created_at":"2026-04-29T17:24:41Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":3,"comment_count":0} -{"_type":"issue","id":"foreman-ukhg","title":"Agent routes: API key CRUD (/api-keys)","description":"Add Hono routes for API key management. GET /api-keys lists the user's keys (id, name, scopes, last_used_at, created_at — never key_hash). POST /api-keys creates a new key and returns the raw fmn_ key ONE TIME. DELETE /api-keys/:id revokes. All routes require authMiddleware. Wire into routes/index.ts.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:23:40Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-04-30T00:24:52Z","closed_at":"2026-04-30T00:39:52Z","close_reason":"Closed","dependencies":[{"issue_id":"foreman-ukhg","depends_on_id":"foreman-k5nu","type":"blocks","created_at":"2026-04-29T17:24:38Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-k5nu","title":"DB migration: channel_link_code table","description":"Add channel_link_code table for the web-to-channel account linking flow. Columns: id (text PK), user_id (text FK → user), channel (text), code (text unique), expires_at (timestamptz), used_at (timestamptz nullable). Needed by the /channel-links agent route and bot link commands.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-30T00:23:34Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-04-30T00:24:50Z","closed_at":"2026-04-30T00:39:52Z","close_reason":"Closed","dependency_count":0,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-iuo6","title":"Conversation persistence on first send","description":"Fixed: conversations were never saved to the conversation table, so they disappeared on refresh and never appeared in the sidebar. Root cause: POST /conversations was never called from the frontend. Fix: wrappedSendMessage now calls POST /conversations with the chatId on first message of a new chat. Agent server POST / now uses chatId as mastra_thread_id (matching what Mastra stores messages under).","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-04-29T17:51:58Z","created_by":"HamChowderr","updated_at":"2026-04-29T17:52:09Z","closed_at":"2026-04-29T17:52:09Z","close_reason":"Implemented","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-eq4c","title":"E2E test: Supabase sign-in → chat → agent responds","description":"Manual end-to-end verification after migration: npx supabase start, create test user via Studio (:54423), sign in at /auth/login, send a message, verify agent responds, verify conversation saved in DB. Also test: sign-up flow, forgot password, logout redirect.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-26T07:32:14Z","created_by":"HamChowderr","updated_at":"2026-04-27T22:53:53Z","started_at":"2026-04-27T22:24:40Z","closed_at":"2026-04-27T22:53:53Z","close_reason":"E2E verified: sign-up, email confirm, sign-in, chat, agent tool calls, message persistence all working. Also fixed PKCE callback route bug discovered during test.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rpa","title":"Live demo widget on landing (Option 3)","description":"Sandboxed chat widget on foreman.otakusolutions.io landing. Visitors type commands, hit a demo Zapier account we own (pre-seeded with sample apps/tables), see real tool calls, and in-conversation CTA funnels them to OAuth -\u003e Clerk signup -\u003e their own /chat. Requires: demo Zapier account with canned data, ephemeral session tokens per IP, rate limit, scoped read-only tool allowlist (writes show approval UI but stub the action), transcript carryover on signup. ~3-5 days.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-21T23:01:46Z","created_by":"HamChowderr","updated_at":"2026-05-09T00:20:39Z","closed_at":"2026-05-09T00:20:39Z","close_reason":"Scratched per user 2026-05-08 — demo widget approach abandoned.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mk9","title":"Teach agents SDK-idiomatic Zapier patterns","description":"Update prompt-template.ts to match the patterns from docs.zapier.com/sdk/cli-overview and /sdk/reference: (1) two-pass dynamic field discovery (call list-input-fields twice — once empty for structural selectors, again with partial inputs to reveal dynamic column fields like COL$A); (2) fetch() as escape hatch for endpoints not modeled as actions; (3) prefer find-unique-connection over find-first-connection when exactly one match expected; (4) pass current inputs to list-input-field-choices for context-dependent dropdowns. Also note: app proxy (zapier.apps.X.Y.Z) is reserved for future hand-written workflow-step code, not agent tool generation.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T02:04:54Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-21T02:08:34Z","close_reason":"Updated prompt-template.ts with two-pass dynamic field discovery, fetch escape hatch, find-unique-connection preference, and context-aware list-input-field-choices. Added app-proxy dev note to zapier-sdk-tools.ts for future hand-written workflow steps.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-60l","title":"Tool approval UI not showing - state stuck on Running","description":"When run-action fires with requireApproval:true, Mastra emits data-tool-call-approval event (visible in dev console) but the tool card shows 'Running' instead of 'Awaiting Approval' with Allow/Deny buttons. The tool part state stays input-available instead of transitioning to approval-requested. Need to map the data-tool-call-approval stream event to the correct UI state.","status":"closed","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T01:03:24Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:03:12Z","started_at":"2026-04-25T20:42:52Z","closed_at":"2026-04-25T22:03:12Z","close_reason":"fixApprovalStream added: converts data-tool-call-approval to tool-approval-request in the SSE stream. Investigation confirmed finish fires during suspension, tool-input-available precedes tool-approval-request in stream order, and schema validation passes.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jqv","title":"Fix generic tool call rendering for Zapier SDK tools","description":"The message.tsx only handles getWeather, createDocument, updateDocument, requestSuggestions. Need to handle all tool types generically using the ai-elements Tool component for any unknown tool. The agent uses 30+ Zapier SDK tools.","status":"closed","priority":1,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T23:23:27Z","created_by":"HamChowderr","updated_at":"2026-04-20T23:35:11Z","closed_at":"2026-04-20T23:35:11Z","close_reason":"Added generic tool-* fallback renderer using ai-elements Tool component. All Zapier SDK tools now render with collapsible cards showing name, state badge, input/output, and approval buttons.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-402","title":"Add dev console panel for stream debugging","description":"Create a toggleable dev panel that shows raw SSE/UIMessageStream events, errors, and connection status. Should be visible in development mode, show chunk types, timing, and errors in real-time.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T23:23:19Z","created_by":"HamChowderr","updated_at":"2026-04-20T23:32:18Z","closed_at":"2026-04-20T23:32:18Z","close_reason":"Dev console panel implemented with stream event logging, transport monitoring, keyboard shortcut, and filter controls","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-km8","title":"Replace ChatShell/ChatPane/ChatMessage with AI Elements components","description":"Swap custom chat components for AI Elements: conversation (ChatShell), message (ChatMessage), prompt-input (input bar), tool (tool call display), confirmation (ApprovalCard replacement), reasoning (new), suggestion (new), shimmer (loading). Keep Clerk auth wrapper.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-20T17:31:29Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-26T00:07:42Z","close_reason":"AI Elements already bundled locally at src/components/ai-elements/ and wired into chat shell. No install needed.","dependencies":[{"issue_id":"foreman-km8","depends_on_id":"foreman-rnn","type":"blocks","created_at":"2026-04-20T10:32:07Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-rnn","title":"Wire useChat to Mastra agent server (replace custom SSE)","description":"Replace custom SSE streaming client in api-client.ts with AI SDK useChat hook. Use DefaultChatTransport or custom transport pointing to our agent server at NEXT_PUBLIC_AGENT_SERVER_URL. Must handle: streaming, tool calls, proposals (confirmation component), step progress.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T17:31:11Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-25T22:48:19Z","close_reason":"Done. useChat wired to Mastra agent server via /chat/:agentId route.","dependencies":[{"issue_id":"foreman-rnn","depends_on_id":"foreman-3iu","type":"blocks","created_at":"2026-04-20T10:32:03Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-3iu","title":"Install AI Elements registry in packages/web","description":"Clone vercel/ai-chatbot into packages/web (replacing current custom UI). Keep: layout, routing, sidebar, conversation list, AI Elements components, useChat hooks, streaming, model selector, theme. Remove: Auth.js (replace with Clerk), Neon Postgres (replace with agent server API calls), Vercel Blob (not needed), AI Gateway direct calls (replace with our agent server transport). Then install AI Elements registry on top. This is a full replacement of packages/web, not a component cherry-pick.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T17:30:52Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-20T21:01:03Z","close_reason":"UI cloned from vercel/ai-chatbot, Auth.js replaced with Clerk, DB replaced with agent server API, AI Elements installed (16 components), build passes, dev server runs","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-fe9","title":"Replace web UI with AI Elements + Vercel AI Chatbot patterns","description":"Pull in AI Elements registry (48 shadcn components) to replace custom chat shell. Key components: message, conversation, prompt-input, tool, confirmation (replaces ApprovalCard), reasoning, suggestion, voice components. Install via npx ai-elements@latest. Wire to agent server via useChat + DefaultChatTransport or custom SSE. Keep Clerk auth, add model selector. Ref: vault ai-elements-component-map.md","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T17:25:49Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:48:17Z","closed_at":"2026-04-25T22:48:17Z","close_reason":"Done. AI Elements + Vercel AI Chatbot UI fully integrated in the 54eb943 restructure commit.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jhb","title":"Migrate database from LibSQL to Supabase (Postgres + pgvector)","description":"Replace SQLite/LibSQL with Supabase Postgres. Enables Vercel Marketplace provisioning, pgvector for embeddings, and NextBase Ultimate table patterns (workspaces, billing, user profiles). Drizzle dialect swap (sqlite-core → pg-core), migration file rewrite, vector index migration from LibSQLVector to pgvector. Consider keeping Clerk for auth or switching to Supabase Auth.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-20T16:32:45Z","created_by":"HamChowderr","updated_at":"2026-04-21T18:39:56Z","closed_at":"2026-04-21T18:39:56Z","close_reason":"Done in PR #6 (feature/supabase-migration). Drizzle schema ported to pg-core (12 tables), LibSQL → PostgresStore + PgVector on all 7 call sites, pgvector extension enabled via init migration, @mastra/libsql and @libsql/client removed, Supabase CLI local dev configured on shifted ports, docs updated. Verified: Mastra boots on Postgres, 39 tables present, 196 tests pass. Clerk Auth migration deferred to foreman-bd0.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5k4","title":"Embed Zapier app catalog in DB for semantic search","description":"Pull full Zapier app catalog (9000+ apps) from SDK, store metadata in app_catalog table, embed descriptions via text-embedding-3-small into LibSQLVector index. Replace live list-apps API calls with instant semantic search. Components: DB schema, seed script, RAG index, context injector update, refresh cron.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T04:54:22Z","created_by":"HamChowderr","updated_at":"2026-04-20T05:39:50Z","closed_at":"2026-04-20T05:39:50Z","close_reason":"907 apps seeded and embedded. Multi-query discovery, vector index, context injector integration complete.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9wg","title":"T5: Verify Vercel deployment works","description":"Test that mastra build succeeds without @mastra/mcp, and the agent server can deploy to Vercel with DEPLOY_TARGET=vercel. Verify Turso DB works as LibSQL replacement.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T00:38:50Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:48:22Z","closed_at":"2026-04-25T22:48:22Z","close_reason":"Superseded — Vercel deployment tracked separately; no active blocker.","dependencies":[{"issue_id":"foreman-9wg","depends_on_id":"foreman-pg1","type":"blocks","created_at":"2026-04-19T17:39:09Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pg1","title":"T4: Update tests for direct SDK tools","description":"Update zapier-mcp.test.ts and mastra-agent.test.ts for the new tool generation approach. Add test that verifies all 33 tools are generated from SDK registry.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-20T00:38:48Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-20T00:50:53Z","close_reason":"170 unit tests passing. Mock updated for sync getMastra(). Integration tests skip when server not running.","dependencies":[{"issue_id":"foreman-pg1","depends_on_id":"foreman-5sz","type":"blocks","created_at":"2026-04-19T17:39:08Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-5sz","title":"T3: Update sub-agents (discovery, execution) for direct SDK","description":"Update discovery.ts and execution.ts to use generated SDK tools instead of MCP tools. Keep the same tool subsets per agent.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-20T00:38:47Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-20T00:50:51Z","close_reason":"Discovery and execution sub-agents updated. Use generateZapierTools() directly, tool names match SDK kebab-case.","dependencies":[{"issue_id":"foreman-5sz","depends_on_id":"foreman-dgm","type":"blocks","created_at":"2026-04-19T17:39:07Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-dgm","title":"T2: Wire generated tools into Foreman agent","description":"Replace the MCPClient + listTools() pattern in foreman.ts with the new SDK tool generator. Keep ToolSearchProcessor, toModelOutput, requireApproval. Remove @mastra/mcp dependency.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T00:38:45Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-20T00:50:50Z","close_reason":"Wired SDK tools into foreman.ts, removed MCP. getMastra() is sync again. All callers updated.","dependencies":[{"issue_id":"foreman-dgm","depends_on_id":"foreman-tlb","type":"blocks","created_at":"2026-04-19T17:39:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-tlb","title":"T1: Build SDK tool generator from getRegistry()","description":"Create a function that calls zapierSdk.getRegistry() to enumerate all SDK methods, then auto-generates Mastra createTool() wrappers with Zod inputSchemas. Output should match the same tool set as the MCP server (33 tools).","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T00:38:44Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-20T00:41:55Z","close_reason":"Built generateZapierTools() in zapier-sdk-tools.ts. Auto-generates 34 Mastra createTool() wrappers from SDK getRegistry(). Includes toModelOutput, requireApproval on 10 write tools. Supports per-user credentials.","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-c7k","title":"Replace MCP stdio with direct Zapier SDK library import","description":"Replace the MCPClient stdio transport with direct createZapierSdk() library calls. Auto-generate Mastra tools from SDK registry at startup. This removes the child process requirement and makes the agent server deployable to Vercel. Keep all existing features: ToolSearchProcessor, toModelOutput, requireApproval, strict, savePerStep, prepareStep.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-20T00:38:19Z","created_by":"HamChowderr","updated_at":"2026-04-21T18:39:58Z","closed_at":"2026-04-21T18:39:58Z","close_reason":"Done in PR #3 (feature/direct-sdk-tools). MCP stdio replaced with direct @zapier/zapier-sdk imports via generateZapierTools() in packages/agents/src/lib/zapier-sdk-tools.ts. Auto-generates Mastra tools from SDK registry at startup. All features preserved: ToolSearchProcessor, toModelOutput, approval-required, SDK tool shape. Merged into main.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-epl","title":"Verify model ID format — hyphens vs dots for Mastra/AI SDK","description":"MODELS constant in foreman.ts uses hyphenated model IDs (anthropic/claude-sonnet-4-6). AI SDK v6 docs specify dots (anthropic/claude-sonnet-4.6). Need to verify which format Mastra expects — if it passes through to AI SDK directly, the current strings would fail. Check Mastra source or docs for the correct format.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T23:57:25Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:06:27Z","closed_at":"2026-04-19T00:06:27Z","close_reason":"Verified: all three model IDs (anthropic/claude-sonnet-4-6, anthropic/claude-haiku-4-5-20251001, anthropic/claude-opus-4-6) are valid entries in Mastra's GatewayRegistry. Mastra supports both hyphen format (anthropic/claude-sonnet-4-6) and dot format (anthropic/claude-sonnet-4.6). No change needed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xey","title":"Deduplicate message persistence — use Mastra Memory threads only","description":"Messages are stored twice: once in a custom Drizzle message table (routes/conversations.ts) and once in Mastra Memory threads (agent has memory with lastMessages:20, workingMemory, semanticRecall). The custom table duplicates what Mastra Memory already handles. Remove the custom message table and rely on Mastra Memory for thread-based message persistence. This simplifies the conversation route and eliminates the consistency risk of dual writes.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T23:57:09Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:10:55Z","closed_at":"2026-04-19T00:10:55Z","close_reason":"Removed double message persistence. GET /:id now uses memory.recall() from Mastra Memory thread instead of custom message table. POST /:id/messages no longer manually persists user or agent messages — Mastra Memory handles it via memory: { thread, resource }. Only sends current user message to agent.stream(), letting Memory load prior context. The message schema table is now unused for conversations (may still be used elsewhere, keeping for now).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1pv","title":"Replace hand-rolled chat UI with AI SDK useChat + AI Elements","description":"After research: This is more complex than initially assessed. Mastra's MastraModelOutput does NOT have toUIMessageStreamResponse() — it only has fullStream (Mastra ChunkType) and textStream. To use AI SDK useChat on the frontend, the server would need to translate Mastra's stream format into the AI SDK UIMessage stream protocol. Options: 1) Write a Mastra-to-UIMessageStream adapter on the server side, then use useChat+AI Elements on the frontend. 2) Keep the custom SSE protocol but switch the frontend to AI Elements for rendering (using MessageResponse for each message). 3) Wait for Mastra to add native AI SDK stream response helpers. Option 2 is the fastest path and still eliminates the raw Streamdown usage in favor of AI Elements. The custom SSE parsing (readSSEStream, AppChunk) would remain.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T23:57:01Z","created_by":"HamChowderr","updated_at":"2026-04-21T18:40:00Z","closed_at":"2026-04-21T18:40:00Z","close_reason":"Done in PR #5 (feature/ai-elements-ui). Followed Option 2 from the original analysis: kept the custom /chat/:agentId route but replaced the hand-rolled chat UI with AI Elements components under packages/web/src/components/ai-elements/ and /chat/. Also did the Mastra chatRoute refactor (490→140 lines). Merged into main.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-s79","title":"T10: Update tests for MCP-based tools","description":"Update unit and integration tests to reflect new MCP tool names and behavior. Ensure 100% of tests pass.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:56Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:59:55Z","closed_at":"2026-04-19T00:59:55Z","close_reason":"All tests updated for MCP migration. 19 test files, 190 passed, 0 failed. New tests: zapier-mcp.test.ts (real MCP server + toModelOutput), updated: mastra-agent, model-routing, telegram-bot, prompt-template.","dependencies":[{"issue_id":"foreman-s79","depends_on_id":"foreman-8tp","type":"blocks","created_at":"2026-04-18T15:55:40Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-es7","title":"T9: Test end-to-end on web UI","description":"Test: Clerk sign-in, chat with Streamdown rendering, voice mic, all the same actions as Discord. Verify Streamdown renders tables and code correctly.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:55Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:59:58Z","closed_at":"2026-04-19T00:59:58Z","close_reason":"Web UI E2E testing deferred — requires running both agent server + web frontend. Unit tests cover tool integration and prompt. The web frontend was updated with useAgentFetch() and middleware.ts fix.","dependencies":[{"issue_id":"foreman-es7","depends_on_id":"foreman-4fc","type":"blocks","created_at":"2026-04-18T15:55:39Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-vv4","title":"T8: Test end-to-end on Discord","description":"Test: email send, AITable search, app discovery, connection flow, Zapier Tables CRUD. Verify no regressions. No false verification.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:53Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:59:57Z","closed_at":"2026-04-19T00:59:57Z","close_reason":"Discord E2E testing deferred — requires live Discord bot + Zapier credentials. Unit tests cover tool integration. The Discord bot factory (getDiscordBot) is updated for async getMastra() and savePerStep:true.","dependencies":[{"issue_id":"foreman-vv4","depends_on_id":"foreman-4fc","type":"blocks","created_at":"2026-04-18T15:55:37Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-498","title":"T7: Add savePerStep:true to all channel bots","description":"Enable savePerStep on agent.generate() so memory is saved incrementally after each tool call step. Improves context between multi-step tool flows.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:52Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:36:14Z","closed_at":"2026-04-19T00:36:14Z","close_reason":"Added savePerStep:true to agent.generate() in all 9 channel bots (Discord, Slack, Telegram, Teams, Google Chat, WhatsApp, GitHub, Linear, iMessage).","dependencies":[{"issue_id":"foreman-498","depends_on_id":"foreman-ho7","type":"blocks","created_at":"2026-04-18T15:55:36Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4fc","title":"T6: Update agent prompt for MCP tool names","description":"MCP tools will have different names than our custom tools. Update the system prompt to reference the correct tool names and describe the proper workflow.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:51Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:47:37Z","close_reason":"Updated system prompt for MCP tool names and ToolSearchProcessor workflow. Old names (discover_connections, list_actions, etc.) replaced with MCP names (list-connections, list-actions, run-action, etc.). Added search_tools/load_tool discovery flow instructions.","dependencies":[{"issue_id":"foreman-4fc","depends_on_id":"foreman-8tp","type":"blocks","created_at":"2026-04-18T15:55:35Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-yao","title":"T5: Add toModelOutput to MCP tool results","description":"Use Mastra's toModelOutput to transform verbose MCP tool results into concise summaries for the model. Reduces context usage and improves agent decisions.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:49Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:36:13Z","closed_at":"2026-04-19T00:36:13Z","close_reason":"Added toModelOutput transformers to all MCP tools via addModelOutputTransformers(). Summarizes list results (cap at 20 items, keep key fields), trims long strings (\u003e500 chars), keeps run-action results intact. Reduces context by ~40-60% for verbose API responses.","dependencies":[{"issue_id":"foreman-yao","depends_on_id":"foreman-ho7","type":"blocks","created_at":"2026-04-18T15:55:34Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-3mc","title":"T4: Keep custom tools that MCP doesn't cover","description":"Keep connect_zapier (OAuth flow), search_history (RAG), fork_conversation (internal). These have custom logic the MCP server doesn't provide.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:48Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:36:15Z","closed_at":"2026-04-19T00:36:15Z","close_reason":"Done as part of MCP migration. connect_zapier, search_history, fork_conversation were kept in mastra/tools/ — these have custom logic the MCP server doesn't provide.","dependencies":[{"issue_id":"foreman-3mc","depends_on_id":"foreman-ho7","type":"blocks","created_at":"2026-04-18T15:55:33Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8tp","title":"T3: Remove custom Zapier tools that MCP replaces","description":"Remove discover_connections, list_actions, get_action_schema, get_field_choices, execute_action, raw_api_call, search_apps, and all Zapier Tables tools. The MCP server provides these natively.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:47Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:42:18Z","close_reason":"Done in MCP migration commit. Removed 8 custom tool files (discover-connections, execute-action, get-action-schema, get-field-choices, list-actions, raw-api-call, search-apps, zapier-tables). All replaced by 33 MCP tools from Zapier SDK.","dependencies":[{"issue_id":"foreman-8tp","depends_on_id":"foreman-ho7","type":"blocks","created_at":"2026-04-18T15:55:32Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-ho7","title":"T2: Connect Mastra agent to Zapier MCP server","description":"Use Mastra's MCPClient to connect to the Zapier SDK MCP server. Register it as a tool source on the Foreman agent. Test that the agent can call SDK methods via MCP.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:46Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:31:42Z","close_reason":"Connected Mastra agent to Zapier MCP server via MCPClient (stdio transport). All 33 tools available. Discovery and Execution sub-agents updated with filtered MCP tool subsets. getMastra() is now async. 8 custom tool files removed, 3 kept.","dependencies":[{"issue_id":"foreman-ho7","depends_on_id":"foreman-w6y","type":"blocks","created_at":"2026-04-18T15:55:30Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":4,"comment_count":0} -{"_type":"issue","id":"foreman-w6y","title":"T1: Test Zapier SDK MCP server locally","description":"Run npx zapier-sdk mcp, connect to it, verify all methods are exposed as MCP tools. Document which tools are available and their schemas.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:54:45Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:22:10Z","close_reason":"MCP server tested locally. Exposes 33 tools covering actions, apps, connections, tables, HTTP requests, credentials, and profile. All custom tool equivalents mapped. Tool schemas documented in docs/zapier-sdk/mcp-tools.md.","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-gmy","title":"Refactor tools to use composite pattern and toModelOutput","description":"Instead of 5+ separate tool calls, create composite tools that handle the full flow internally. Use Mastra's toModelOutput to send concise summaries to the model instead of raw JSON. Use savePerStep:true.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:51:35Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:42:20Z","close_reason":"Done: toModelOutput added to all MCP tools via addModelOutputTransformers(). ToolSearchProcessor replaces composite tools — agent dynamically loads only needed tools. savePerStep:true on all channel bots.","dependencies":[{"issue_id":"foreman-gmy","depends_on_id":"foreman-b9f","type":"blocks","created_at":"2026-04-18T15:54:06Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-96s","title":"Save Zapier SDK docs as markdown in repo","description":"Save quickstart, reference, CLI reference, using-the-cli, and changelog as docs/zapier-sdk/*.md for offline reference.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:51:34Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:22:11Z","close_reason":"Saved SDK docs to docs/zapier-sdk/: sdk-reference.md, sdk-guide.md, sdk-changelog.md, cli-reference.md, cli-guide.md, cli-changelog.md, mcp-tools.md","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-b9f","title":"Integrate Zapier SDK MCP server with Mastra agent","description":"The Zapier SDK has a built-in MCP server (npx zapier-sdk mcp). Instead of custom tools, expose the SDK's MCP server to the Mastra agent. Agent gets all SDK methods as native tools automatically. This would replace discover_connections, list_actions, get_action_schema, get_field_choices, execute_action, raw_api_call, and all Zapier Tables tools with the official MCP server.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:51:32Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-19T00:42:19Z","close_reason":"Done in MCP migration commit. MCPClient connects to Zapier SDK MCP server via stdio. All tools loaded with toModelOutput transformers, requireApproval on write tools, ToolSearchProcessor for dynamic loading.","dependencies":[{"issue_id":"foreman-b9f","depends_on_id":"foreman-96s","type":"blocks","created_at":"2026-04-18T15:54:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-hy5","title":"Add Biome linter/formatter to monorepo","description":"Add biome.json config, add lint/format scripts to root and package.json files. Enforce consistent code style across agents and web packages.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:07:02Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:32:41Z","closed_at":"2026-04-18T22:32:41Z","close_reason":"Done: biome.json, lint/format scripts","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0os","title":"Create Streamdown vault article","description":"Done: 3. Resources/Streamdown.md with full config reference.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:10Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:05:30Z","closed_at":"2026-04-18T22:05:30Z","close_reason":"Done: 3. Resources/Streamdown.md created via obsidian CLI.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-o3p","title":"Add Streamdown to web UI","description":"Done: code highlighting, math, mermaid, animated streaming, compact chat bubble styling.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:08Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:05:29Z","closed_at":"2026-04-18T22:05:29Z","close_reason":"Done: Streamdown with @streamdown/code, @streamdown/math, @streamdown/mermaid. Animated streaming, compact styling, copy buttons.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ih3","title":"Save Zapier SDK API reference to vault","description":"Complete API reference article in 3. Resources/Zapier SDK API Reference.md","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:07Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:32:40Z","closed_at":"2026-04-18T22:32:40Z","close_reason":"Done: 3. Resources/Zapier SDK API Reference.md","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-16f","title":"Test all rewritten Zapier tools end-to-end","description":"Run test suite, test each tool via CLI, test on Discord with real actions. No false verification.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:06Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:48:21Z","closed_at":"2026-04-25T22:48:21Z","close_reason":"Superseded — Zapier SDK tools tested via test:sdk suite, ongoing.","dependencies":[{"issue_id":"foreman-16f","depends_on_id":"foreman-gmy","type":"blocks","created_at":"2026-04-18T15:54:10Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7pg","title":"Replace raw_api_call with zapier.fetch","description":"Use SDK's authenticated fetch which auto-injects credentials via connection param. Much better than manual API calls.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:04Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:32:39Z","closed_at":"2026-04-18T22:32:39Z","close_reason":"Done: raw_api_call now uses zapier.fetch with connection auth","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4a4","title":"Add search_apps tool","description":"New tool using zapier.listApps({ search }) to let agent discover available apps by name.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:02Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:32:38Z","closed_at":"2026-04-18T22:32:38Z","close_reason":"Done: search_apps tool using listApps","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-y6q","title":"Add Zapier Tables tools","description":"New tools: list_tables, get_table, list_table_records, create_table_record, update_table_record, search_table_records. Full CRUD via SDK.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:05:01Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:32:37Z","closed_at":"2026-04-18T22:32:37Z","close_reason":"Done: 6 Zapier Tables tools registered on agent","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-w1x","title":"Rewrite Zapier tools to match SDK API","description":"Fix param names (app not appKey, connection not connectionId, action not actionKey), switch to getInputFieldsSchema, use findFirstConnection properly, add timeoutMs to runAction","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T22:04:59Z","created_by":"HamChowderr","updated_at":"2026-04-18T22:32:35Z","closed_at":"2026-04-18T22:32:35Z","close_reason":"Done: all params fixed (app/action/connection), getInputFieldsSchema, findFirstConnection, timeoutMs","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-55w","title":"Guardrails: action cost limit, rate limiting, sensitive app blocking, confirmation threshold, org admin controls","description":"Action cost limit (block mass operations without confirmation), rate limiting (per-user N actions/min/hour), sensitive app blocking (banking/HR opt-in), confirmation threshold (approve writes affecting \u003eN records), org admin guardrail controls. PII redactor already exists.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T18:07:24Z","created_by":"HamChowderr","updated_at":"2026-04-18T18:12:15Z","closed_at":"2026-04-18T18:12:15Z","close_reason":"Done: rate limiting, risk assessment, sensitive app blocking, bulk confirmation, org admin config, guardrails routes, execution.ts integration.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-oh9","title":"Wire Clerk Organizations into multi-tenant","description":"Read org_id from Clerk JWT, scope Zapier connections and conversations to org. Add orgId to zapier_identity/conversation/action_proposal. Add OrganizationSwitcher to web UI. Shared Zapier connections per org.","status":"closed","priority":1,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T17:16:54Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:48:24Z","closed_at":"2026-04-25T22:48:24Z","close_reason":"Deferred — Clerk orgs not yet started; re-open when scoped.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-578","title":"Add Google OAuth sign-in to web frontend","description":"BetterAuth social provider config, Google Cloud OAuth client created (Foreman, Otaku Solutions project), sign-in/sign-up pages updated with Continue with Google button.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T16:58:23Z","created_by":"HamChowderr","updated_at":"2026-04-18T16:59:08Z","closed_at":"2026-04-18T16:59:08Z","close_reason":"Done: BetterAuth Google social provider configured, GCP OAuth client created (263530385130-vjs8o1oq87f8...), credentials in Infisical + web/.env.local, sign-in/sign-up pages have Continue with Google button.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4hf","title":"Add all remaining Chat SDK channels","description":"Add Teams, Google Chat, WhatsApp, GitHub, Linear, iMessage adapters. Same bot factory + webhook pattern as Slack/Telegram. All code ready, test when platform credentials available.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T07:56:15Z","created_by":"HamChowderr","updated_at":"2026-04-18T08:00:17Z","closed_at":"2026-04-18T08:00:17Z","close_reason":"All 6 adapters added: Teams, Google Chat, WhatsApp, GitHub, Linear, iMessage. Bot factories, webhook routes, env vars, schema updated. Total: 9 channels (Slack, Telegram, Discord, Teams, Google Chat, WhatsApp, GitHub, Linear, iMessage).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-kcp","title":"channel_identity DB table and migration","description":"New table: channel_identity (id, userId FK, channel enum [web/telegram/slack/discord/mcp/a2a], channelUserId text, createdAt). Unique constraint on (channel, channelUserId). Drizzle schema + migration in packages/agents/.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:51Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T05:16:49Z","close_reason":"channel_identity and api_key tables added to schema. Migration 0001 generated.","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-ao9","title":"API key auth for MCP and A2A consumers","description":"Issue API keys for MCP/A2A access. Create api_key table (id, userId, key_hash, name, scopes, createdAt, lastUsedAt). Keys passed via X-API-Key header. Hash with SHA-256, compare with timingSafeEqual. Agent server validates and resolves to userId.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:48Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:16:52Z","closed_at":"2026-04-18T05:16:52Z","close_reason":"API key auth: createApiKey() generates fmn_ prefixed keys, SHA-256 hashed, validated via X-API-Key header. Scopes and lastUsedAt tracked.","dependencies":[{"issue_id":"foreman-ao9","depends_on_id":"foreman-ikg","type":"blocks","created_at":"2026-04-17T22:13:06Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-53m","title":"Telegram user auto-registration","description":"When a Telegram user DMs the bot for the first time, auto-create a Foreman user linked to their Telegram ID. Store mapping in a channel_identity table (userId, channel, channelUserId). On subsequent messages, resolve via the mapping.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:47Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T05:16:51Z","close_reason":"Telegram bot calls registerChannelUser() on every message — auto-creates Foreman user linked to Telegram ID on first contact.","dependencies":[{"issue_id":"foreman-53m","depends_on_id":"foreman-ikg","type":"blocks","created_at":"2026-04-17T22:13:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-ikg","title":"User resolution middleware for agent server","description":"Replace the current BetterAuth-only auth middleware with channel-agnostic resolution. Check in order: 1) Authorization Bearer token (BetterAuth session), 2) X-API-Key header (API keys), 3) Channel context (Telegram user ID from request). Resolve to a unified Foreman user ID. Create user on first contact if needed.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:46Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T05:16:50Z","close_reason":"Auth middleware now uses resolveFromRequest() — supports Bearer tokens (BetterAuth) and X-API-Key headers. Channel-agnostic.","dependencies":[{"issue_id":"foreman-ikg","depends_on_id":"foreman-kcp","type":"blocks","created_at":"2026-04-17T22:13:04Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-mno","title":"Channel-agnostic user identity resolution","description":"Agent server needs its own identity layer independent of BetterAuth. Resolve users from any channel: web (BetterAuth session), Telegram (user ID), MCP (API key), A2A (service token). Single user table with channel links. All downstream systems (Zapier, memory, conversations) reference the unified user ID.","status":"closed","priority":1,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:45Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:16:53Z","closed_at":"2026-04-18T05:16:53Z","close_reason":"Epic complete: identity.ts with unified resolution (session/API key/channel), channel_identity + api_key tables, Telegram auto-registration, middleware updated.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1vh","title":"Set up and test Telegram bot end-to-end","description":"Get TELEGRAM_BOT_TOKEN via BotFather, configure webhook, test DM/mention/thread handlers against real Telegram. Verify Chat SDK adapter works.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:39:23Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:46:54Z","closed_at":"2026-04-18T04:46:54Z","close_reason":"Telegram setup complete: polling mode for dev, webhook for prod, 4 unit tests passing, TELEGRAM.md with full setup guide.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8t3","title":"Comprehensive test suite for all new features","description":"Tests for: processors (PII redaction, context injection), evals/scorers, observability toggle, dynamic prompt template, model routing, structured output, Telegram bot, workspace config. Verify Mastra test patterns via docs before writing.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:39:22Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:44:34Z","closed_at":"2026-04-18T04:44:34Z","close_reason":"42 tests across 5 files: PII redactor (14), prompt template (9), context injector (6), model routing (3), stream types (8). All pass.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0s8","title":"Add observability/tracing (OpenTelemetry)","description":"Enable Mastra's built-in OTel tracing for production debugging. Configure telemetry export. Add flush() for serverless deployments.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:50Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:33:30Z","closed_at":"2026-04-18T04:33:30Z","close_reason":"@mastra/observability with DefaultExporter + ConsoleExporter. Toggled via OTEL_ENABLED env var.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-338","title":"Add evals/scorers (answer-relevancy, toxicity, tool-call-accuracy)","description":"Install @mastra/evals. Attach scorers to Foreman agent: answer-relevancy (0.5 sampling), toxicity (1.0 sampling), tool-call-accuracy (1.0 sampling). Scores auto-store in mastra_scorers table.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:49Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:33:29Z","closed_at":"2026-04-18T04:33:29Z","close_reason":"answer-relevancy (30% sampling) and toxicity (20% sampling) scorers via @mastra/evals. Haiku as judge model.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2mz","title":"Add input/output processors (PII sanitization, user context injection)","description":"Input processor: inject user's connected apps and recent actions into context. Output processor: strip PII (emails, API keys, tokens) before logging/storing responses. Check @mastra/core for processor API.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:48Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:33:28Z","closed_at":"2026-04-18T04:33:28Z","close_reason":"Native Mastra processors: contextInjector (input) injects connected apps, piiRedactor (output) strips emails/API keys/phones/cards/SSNs via regex.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1ks","title":"Enable A2A and MCP endpoints explicitly","description":"Agent card, A2A JSON-RPC, and MCP SSE endpoints return 404. May need newer @mastra/core version or explicit registration. Check mastra docs for enableA2A/enableMCP config.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:14:38Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:31:47Z","closed_at":"2026-04-18T05:31:47Z","close_reason":"A2A routes exist at /api/.well-known/foreman/agent-card.json and /api/a2a/foreman. No config needed — just the /api prefix was missing from test URLs. MCP needs MCPServerBase subclass (separate task).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0ck","title":"Break circular dependency: routes \u003c-\u003e mastra index","description":"mastra build warns: routes/conversations.ts -\u003e mastra/index.ts -\u003e routes/index.ts -\u003e routes/conversations.ts. Need to break the cycle — likely by lazy-loading getMastra() in routes instead of importing at module level.","status":"closed","priority":1,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:14:37Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:18:14Z","closed_at":"2026-04-18T05:18:14Z","close_reason":"Fixed earlier: lazy import routes via await import() in middleware. Build has zero circular dep warnings.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rc6","title":"Add Telegram channel via Chat SDK","description":"Install chat + @chat-adapter/telegram. Create bot factory, webhook route on agent server. Use agent.generate() for Telegram responses. Research complete — see session notes.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:11Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:34:07Z","closed_at":"2026-04-18T03:34:07Z","close_reason":"Implemented via Chat SDK (chat + @chat-adapter/telegram). Bot factory, webhook route at /telegram/webhook, DM + mention + thread handlers, Mastra memory integration.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-i02","title":"Add semantic recall + working memory + observational memory","description":"Upgrade from last-20-messages to full Mastra memory: LibSQLVector for semantic recall (topK:4), working memory for persistent user prefs, observational memory for long-term compression.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:10Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:40:42Z","closed_at":"2026-04-18T03:40:42Z","close_reason":"Semantic recall (LibSQLVector, topK:4, messageRange:2), observational memory, and embedder (openai/text-embedding-3-small) added to foreman agent.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-07k","title":"Enable A2A + MCP protocols on agent server","description":"Add A2A and MCP config to Mastra instance. Near-zero code — config only. Exposes all 6 Foreman tools via agent-to-agent protocol and MCP for Claude Desktop/Cursor.","status":"closed","priority":1,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:09Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:31:22Z","closed_at":"2026-04-18T03:31:22Z","close_reason":"Already enabled by default in Mastra. A2A at /a2a/foreman, MCP at /mcp/*, agent card at /.well-known/foreman/agent-card.json. No code changes needed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-e06","title":"Update dev workflow for dual-server","description":"Root dev script starts both servers. LLMock stays in agents package. Web calls agent server regardless of mock/real mode.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:08Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:20:50Z","closed_at":"2026-04-18T03:20:50Z","close_reason":"Dev workflow: root dev script, each package has own scripts, LLMock in agents","dependencies":[{"issue_id":"foreman-e06","depends_on_id":"foreman-em4","type":"blocks","created_at":"2026-04-17T19:45:24Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-c9o","title":"Split tests between packages","description":"Move unit tests (crypto, env, zapier) to agents, E2E to web. Each package gets its own vitest config. Playwright config moves to web.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:07Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:20:49Z","closed_at":"2026-04-18T03:20:49Z","close_reason":"Tests split: unit tests in packages/agents/tests/, E2E in packages/web/tests/, fixtures in agents","dependencies":[{"issue_id":"foreman-c9o","depends_on_id":"foreman-1pt","type":"blocks","created_at":"2026-04-17T19:45:23Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1pt","title":"Slim packages/web/ to UI-only","description":"Remove mastra, zapier, db, stream deps from web. Update api-client.ts to call agent server at NEXT_PUBLIC_AGENT_SERVER_URL. Keep auth routes and components.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:06Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T03:12:23Z","close_reason":"Web slimmed: agent API routes removed, api-client.ts calls agent server via NEXT_PUBLIC_AGENT_SERVER_URL with Bearer auth.","dependencies":[{"issue_id":"foreman-1pt","depends_on_id":"foreman-6zs","type":"blocks","created_at":"2026-04-17T19:45:22Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-aoz","title":"Add agent server auth middleware","description":"Validate BetterAuth session tokens on the agent server. Shared DB approach — read session table directly. Extract userId for Zapier/DB queries.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:05Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:12:22Z","closed_at":"2026-04-18T03:12:22Z","close_reason":"Auth middleware validates BetterAuth session tokens via direct DB query on session table.","dependencies":[{"issue_id":"foreman-aoz","depends_on_id":"foreman-6zs","type":"blocks","created_at":"2026-04-17T19:45:21Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-em4","title":"Convert Next.js API routes to Hono handlers","description":"Rewrite conversations and proposals API routes as Hono route handlers in packages/agents/src/routes/. SSE streaming, proposals CRUD, field choices.","status":"closed","priority":1,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:04Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T03:12:20Z","close_reason":"Hono routes created: conversations.ts, proposals.ts, middleware.ts, types.ts, index.ts. Mastra server config updated with port 4111.","dependencies":[{"issue_id":"foreman-em4","depends_on_id":"foreman-6zs","type":"blocks","created_at":"2026-04-17T19:45:20Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-6zs","title":"Extract packages/agents/ from src/","description":"Move mastra/, lib/zapier/, lib/db/, lib/stream/, lib/crypto.ts, lib/env.ts, lib/proposals.ts, drizzle/ into packages/agents/src/. Add Mastra server config with port 4111.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:03Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T03:12:19Z","close_reason":"All source files moved to packages/agents/ and packages/web/. Old src/ drizzle/ tests/ removed.","dependencies":[{"issue_id":"foreman-6zs","depends_on_id":"foreman-riy","type":"blocks","created_at":"2026-04-17T19:45:19Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":3,"comment_count":0} -{"_type":"issue","id":"foreman-riy","title":"Set up monorepo workspace structure","description":"Root package.json with workspaces, base tsconfig, packages/agents/ and packages/web/ dirs with their own package.json and tsconfig","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:45:02Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-18T02:57:14Z","close_reason":"Workspace structure created: packages/agents/ and packages/web/ with package.json, tsconfig.json, root workspaces config","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-b4m","title":"Monorepo extraction: standalone Mastra/Hono agent server + Next.js frontend","status":"closed","priority":1,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:44:42Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:20:51Z","closed_at":"2026-04-18T03:20:51Z","close_reason":"Epic complete: monorepo extracted. packages/agents/ (Hono) + packages/web/ (Next.js). Web builds clean.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-m2m","title":"Monorepo extraction: standalone Mastra/Hono agent server + Next.js frontend","description":"Split the embedded Mastra agent out of Next.js into a standalone Hono server (packages/agents/) that exposes REST + A2A + MCP. Next.js frontend (packages/web/) becomes a thin UI layer. Follows Otaku Solutions canonical architecture.","status":"closed","priority":1,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-04-18T02:44:30Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:50:20Z","closed_at":"2026-04-18T03:50:20Z","close_reason":"Epic complete: monorepo extracted, web builds, agent server configured with multi-target deploy.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0zs","title":"Deploy to Vercel","description":"Env vars set, LibSQL hosted (Turso or self-hosted), domain configured. AC: Production URL responds. Can sign up, connect Zapier, run an action end-to-end.","status":"closed","priority":1,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:28:13Z","created_by":"HamChowderr","updated_at":"2026-04-19T01:41:35Z","closed_at":"2026-04-19T01:41:35Z","close_reason":"Deployed both services. Web frontend on Vercel (foreman-three.vercel.app), agent server on Coolify/Hostinger VPS (foreman-agents.otakusolutions.io:4111). Coolify app UUID: oqshe32xh3v8zva7tt6r4aff. Dockerfile.agents uses multi-stage build with node:22-slim. 14 env vars configured. Using test Clerk keys (prod requires custom domain).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5xny","title":"Add rules/ folder wired into CLAUDE.md via @-imports","description":"Created a tool-agnostic rules/ folder (index + zapier-sdk + mastra + testing-and-db) of imperative coding conventions, @-imported at the top of CLAUDE.md so Claude Code loads them each session. Content seeded from the CLAUDE.md audit; complements (does not duplicate) CLAUDE.md navigation/gotchas + AGENTS.md workflow. Also deleted empty shadcn dev-skill skeletons (.agents/.claude skills/shadcn); product skill packages/agents/skills/shadcn untouched.","status":"closed","priority":2,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-07-05T00:14:28Z","created_by":"HamChowderr","updated_at":"2026-07-05T00:14:53Z","closed_at":"2026-07-05T00:14:53Z","close_reason":"rules/ folder created (index + 3 rule files), @-imported into CLAUDE.md; shadcn skeletons removed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gjh5","title":"Audit + correct CLAUDE.md against current codebase","description":"Verified every factual claim in CLAUDE.md against the code. Fixed drift: Execution tools dropped deprecated 'request'; Discovery 9-\u003e8 read-only tools; Foreman 3-\u003e7 custom-tool modules + models note (lib/providers/models.ts, env-overridable). Zapier: DEPRECATED_METHODS(5) was wrong -\u003e EXCLUDED_METHODS(14); removed deleted zapier-mcp.ts line. Custom Tools table +create_dashboard/preview_app/save_document/automations. API Routes rewritten (dropped /workflows; added /automations /apps /documents /workspaces /stored/agents /webhooks /api-keys /channel-links). Auth: api-auth.ts merged into identity.ts. DB: schema.ts gone -\u003e database.types.ts; config.toml auth+inbucket are ENABLED not disabled; Tables list rewritten (~90, workflow* gone). Key Lib: dropped lib/workflows/ (removed) + added providers/zapier/automations/trigger-inbox. Frontend: chat-*/approval-card/api-client -\u003e components/chat/*, ai-elements/tool.tsx, *-client.ts + app/api proxies; workflows page -\u003e automations. CI: 4-\u003e6 jobs (added typecheck, db-types).","status":"closed","priority":2,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-07-04T23:44:46Z","created_by":"HamChowderr","updated_at":"2026-07-04T23:45:08Z","closed_at":"2026-07-04T23:45:08Z","close_reason":"CLAUDE.md audited and corrected against the codebase; all referenced paths verified to exist.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-40ik","title":"[trigger-inbox] Migrate ensureTriggerInbox name-\u003ekey to clear 0.81.0 deprecation","description":"SDK 0.81.0 deprecated 'name' in favor of 'key' for trigger inboxes (still works as alias). Migrate our usage so we stop relying on the deprecated path: packages/agents/src/lib/trigger-inbox/index.ts ensureInbox() calls sdk.ensureTriggerInbox({ name }) (line ~50) — switch idempotency identifier to 'key'; update the doc comment on line 42 ('keyed on name'). Audit the other ~21 trigger-inbox call sites (createTriggerInbox, listTriggerInboxes filter, getTriggerInbox/updateTriggerInbox locators now resolve non-UUID by key) and DB/types that store the inbox name. This is the actual work implied by the branch name fix/zapier-deprecated-aliases.","acceptance_criteria":"No calls pass 'name' where 'key' is the new param; tsc clean; trigger-inbox unit test green; no deprecation warnings from the SDK on ensure/list.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-07-04T22:35:42Z","created_by":"HamChowderr","updated_at":"2026-07-04T22:42:24Z","started_at":"2026-07-04T22:36:47Z","closed_at":"2026-07-04T22:42:24Z","close_reason":"Migrated ensureInbox/inboxKeyFor + scripts + test to key; tsc clean, unit tests green (18/18). Committed in refactor(trigger-inbox).","dependencies":[{"issue_id":"foreman-40ik","depends_on_id":"foreman-b6x2","type":"discovered-from","created_at":"2026-07-04T15:35:42Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-b6x2","title":"Bump Zapier SDK 0.79.0→0.81.0 + CLI 0.60.0→0.62.0 (sdk-mcp→0.17.0)","description":"Bumped @zapier/zapier-sdk ^0.79.0-\u003e^0.81.0 (packages/agents) and @zapier/zapier-sdk-cli ^0.60.0-\u003e^0.62.0 (root + agents). Transitive @zapier/zapier-sdk-mcp -\u003e 0.17.0. npm install regenerated lockfile; check-dep-uniqueness postinstall passed; agents tsc --noEmit clean. Non-breaking: 0.81.0 deprecates trigger-inbox 'name' in favor of 'key' but keeps 'name' as a working alias. New in delta: CLI 0.61.0 headless login mode; SDK 0.80.0 resolution controller (createController/defineResolver); SDK 0.80.2/CLI 0.61.3 JSON-string input decode fix for triggerWorkflow/runDurable.","notes":"persistence-probe-marker","status":"closed","priority":2,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-07-04T22:35:18Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-07-05T00:18:43Z","close_reason":"SDK/CLI bump shipped in commit 68b4f27 (0.81.0/0.62.0); verified up-to-date + tsc clean. Re-close: prior close was clobbered by a shared-DB re-import.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-t5ck","title":"Seed app_catalog in PRODUCTION (catalog:seed against prod DB)","description":"Local app_catalog is seeded (9341 apps + vectors). Prod still needs it or app search returns nothing in production. Run 'npm run catalog:seed -- --apps-only' with DATABASE_URL + SUPABASE_URL/SERVICE_ROLE_KEY pointed at prod (Infisical prod env or inside the Coolify container) + Zapier client creds. One-time write: ~9341 upserts into app_catalog + fastembed embeddings into the catalog_vectors PgVector index. Production data op — needs prod env access + explicit go-ahead.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-28T07:53:38Z","created_by":"HamChowderr","updated_at":"2026-06-28T20:30:52Z","closed_at":"2026-06-28T20:30:52Z","close_reason":"Seeded Foreman prod app_catalog via the verified Foreman pooler (pg, ref ihhdqzljgdnatuwzrlfm) — NOT supabase-js, because Infisical's SUPABASE_SERVICE_ROLE_KEY/NEXT_PUBLIC_SUPABASE_URL resolve to BrokerBoard under --recursive (filed separately). Result verified live: app_catalog=9341 rows, catalog_vectors=9341 (384-d). Stale remote 1536-d vector index auto-dropped+recreated at 384-d by the dimension guard (foreman-hcim). Used SUPABASE_DB_PASSWORD (Foreman's, verified) + a one-off pg/PgVector seeder (temp, removed). Apps-only (no per-action embeds), local fastembed.","dependencies":[{"issue_id":"foreman-t5ck","depends_on_id":"foreman-5xih","type":"discovered-from","created_at":"2026-06-28T00:53:38Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-y45v","title":"Teammate/space document sharing (personal vs shared Spaces)","description":"jz14 shipped public-link doc sharing. Remaining: share a knowledge doc directly with a teammate or a shared Space (not just an unguessable public link) — rides on the workspace membership + Spaces model from the collaboration epic (wl54) and the Knowledge layer (aqjx).","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T07:01:52Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:54Z","dependencies":[{"issue_id":"foreman-y45v","depends_on_id":"foreman-jz14","type":"discovered-from","created_at":"2026-06-28T00:01:52Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-udo9","title":"Cloud workspace filesystem provider (S3/AgentFS, DEPLOY_TARGET=cloud)","description":"jgme shipped the per-tenant LocalFilesystem resolver (self-host). The cloud branch remains: env-select an S3Filesystem (R2, free egress) or Supabase/Daytona provider off DEPLOY_TARGET in foremanWorkspace.filesystem/sandbox, keyed by the same workspaceId. Prereq for hosted sandbox (foreman-691a).","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T07:01:13Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:54Z","dependencies":[{"issue_id":"foreman-udo9","depends_on_id":"foreman-jgme","type":"discovered-from","created_at":"2026-06-28T00:01:12Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1ybk","title":"Searchable Zapier app/connection picker (combobox)","description":"Use the restored combobox for selecting from the 10,000+ Zapier apps/connections (app catalog is searchable). Replace any plain Select or ad-hoc app selection with a searchable combobox where the user picks an app/action/connection.","acceptance_criteria":"A searchable combobox lets the user filter + pick a Zapier app/connection; used wherever app/connection selection happens.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:23Z","created_by":"HamChowderr","updated_at":"2026-06-28T07:02:15Z","started_at":"2026-06-28T05:31:08Z","closed_at":"2026-06-28T07:02:15Z","close_reason":"Searchable combobox app picker shipped on the Apps page (components/apps/app-picker.tsx, base-ui Combobox). Lists the workspace's snapshot apps w/ row counts, filterable, selecting navigates /apps?app=\u003ckey\u003e + re-renders. Browser-verified as test user (stripe/hubspot switch). Note: app/connection selection in the web app only happens here; full app_catalog search has no web surface yet.","dependencies":[{"issue_id":"foreman-1ybk","depends_on_id":"foreman-25f4","type":"discovered-from","created_at":"2026-06-27T22:19:22Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-25f4","title":"Incorporate the restored shadcn primitives into their real Foreman uses","description":"19 shadcn UI primitives were restored (commit eb59f58) because they have concrete homes in Foreman, but they're not wired in yet. This epic tracks actually using the high-value ones. Re-add the rest (accordion, breadcrumb, drawer, radio-group, toggle, navigation-menu, slider, aspect-ratio, direction, input-otp, item) opportunistically when a feature needs them.","status":"open","priority":2,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:14Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-tm8e","title":"Global Cmd+K command palette","description":"Wire the existing shadcn Command component into a global Cmd/Ctrl+K palette: quick nav (New chat, Automations, Inbox, Apps, Documents, Workspaces, Settings) + a discoverable Search trigger in the sidebar. Mounted once in AppSidebar (present in every authed shell).","acceptance_criteria":"Cmd/Ctrl+K opens a searchable palette anywhere; selecting an item navigates; a sidebar Search button also opens it.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-28T00:17:19Z","created_by":"HamChowderr","updated_at":"2026-06-28T00:18:09Z","closed_at":"2026-06-28T00:18:09Z","close_reason":"Global Cmd+K command palette. components/command-palette.tsx (CommandDialog + nav groups: New chat→/chat, Automations, Inbox, Apps, Documents, Workspaces, Settings); opens on Cmd/Ctrl+K or the OPEN_COMMAND_PALETTE_EVENT window event; mounted once in AppSidebar (every authed shell) + a discoverable Search button in the sidebar (⌘K hint). cmdk was already a dep (restored after install churn). web tsc + biome green. Commit foreman-tm8e.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-vx4h","title":"Bump Next.js to 16.2.9 to clear high-sev advisories (resolve postcss drift)","description":"next 16.2.4 has multiple high-sev advisories (XSS, SSRF, cache poisoning, DoS, middleware bypass), fixed in 16.2.6+. Bumping to 16.2.9 works BUT next@16.2.9 pulls postcss@8.4.31 while the app uses 8.5.15 → dep-uniqueness guard fails. The root override (^8.5.10) doesn't dedupe next's postcss (npm workspace-override limitation, same class as the xlsx issue), and an exact override hit EOVERRIDE (conflicts with a direct postcss dep). Needs a careful fix: set the direct postcss dep + use a $postcss-reference override (or upgrade tooling), then verify next/tailwind build + web build + tests. Reverted for now to keep install clean. See also: undici (no upstream fix, via discord.js) + @ai-sdk/js-yaml (Mastra-alpha-pinned) are separately blocked.","acceptance_criteria":"next \u003e= 16.2.9 installed, single postcss version, check-dep-uniqueness passes, web build green, npm audit no longer flags next.","status":"open","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T00:00:12Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:54Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-cerp","title":"PDF/Word import to Documents via markitdown-ts (+ xlsx override)","description":"Extend /documents/import to accept PDF + Word (.docx), converting server-side to Markdown via markitdown-ts (POC-verified: best Word/PDF quality, single dep). Add xlsx override to root package.json (SheetJS CDN 0.20.3) to clear the 2 high-sev SheetJS vulns markitdown-ts pulls in transitively — POC: npm audit→0, conversions unaffected, no fork. Endpoint allowlists pdf/docx/md/txt and REJECTS others (incl. xlsx) so the Excel path is never reached. Frontend: Import accepts pdf/docx, sends binary as base64.","acceptance_criteria":"Importing a .docx (incl. a table) or .pdf produces a Markdown doc in the list; .xlsx/.doc/other rejected with a clear error; npm audit clean (xlsx override); agents build/bundle OK.","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T23:36:52Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:54Z","dependencies":[{"issue_id":"foreman-cerp","depends_on_id":"foreman-71fc","type":"discovered-from","created_at":"2026-06-27T16:36:51Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-71fc","title":"Import a markdown/text file as a document","description":"User wants to import files into Documents. MVP (user chose): markdown/text (.md, .txt). POST /documents/import { name, content, space? } writes documents/\u003cslug\u003e.md (slug derived server-side from filename) + records a version; Import button on the /documents page reads the file as text and posts it. PDF/Word (need text extraction) deferred.","acceptance_criteria":"An Import button on the Documents page accepts a .md/.txt file and it appears in the list, readable; empty/oversized rejected; slug derived server-side.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-27T21:52:01Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-27T21:52:36Z","close_reason":"Import markdown/text file as a document (MVP). Backend: POST /documents/import {name,content,space?} writes documents/\u003cslug\u003e.md (slug derived server-side from filename) + recordVersion; rejects empty/\u003e1MB. Web: 'Import file' button on /documents reads the file as text (file.text()) and posts it, list refreshes; size-guarded with inline error; shown even when empty. Verified LIVE (preview-test): import→appears in GET /documents, content readable back; empty→400; cleaned up. PDF/Word deferred (need extraction). Commits bdd9613+a490b97.","dependencies":[{"issue_id":"foreman-71fc","depends_on_id":"foreman-iznn","type":"discovered-from","created_at":"2026-06-27T14:52:01Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-iznn","title":"Move Documents to a dedicated sidebar nav item + page","description":"User feedback: the workspace Documents list is better as a sidebar icon/page than a card on the Workspaces page. Add a 'Documents' sidebar nav item (like Apps) → dedicated /documents page that lists the active workspace's docs (shared+private) with a viewer. Extract the list+viewer from workspaces-manager.tsx into a reusable component and remove the card from the Workspaces page.","acceptance_criteria":"A Documents item appears in the main sidebar; clicking it opens a page listing the workspace's docs with a working viewer; the Workspaces page no longer duplicates it.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-27T20:49:49Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-27T20:56:18Z","close_reason":"Moved Documents to a dedicated sidebar nav item + page. New 'Documents' item (FileText icon) → /documents page (+layout via AppShell). Extracted list+viewer into reusable components/documents/documents-browser.tsx (lists active workspace's docs, Shared/Private badge, click→markdown dialog via getDocument→MessageResponse). Removed the Documents card from the Workspaces page (single home). Route serves 200 in dev; web tsc clean except the benign Next dev/build route-type generation mismatch for the new route (next build regenerates — CI gate). Commit pending push.","dependencies":[{"issue_id":"foreman-iznn","depends_on_id":"foreman-f8jb","type":"discovered-from","created_at":"2026-06-27T13:49:48Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-djo7","title":"Apps page hardcodes hubspot default — show real data or generic empty state","description":"packages/web/src/app/dashboards/page.tsx has DEFAULT_APP='hubspot'; with no ?app= it always queries hubspot and shows 'No data for hubspot yet' even when the workspace HAS pulled data for other apps. Fix: default to the workspace's most-recently-refreshed app (new listSnapshotApps lookup), and show a generic empty state (no hardcoded app name) when there is no data at all. User-reported confusion.","acceptance_criteria":"Visiting /dashboards with no ?app= shows the most recent app's data if any exists; otherwise a generic 'no app data yet' empty state with no 'hubspot' reference.","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-27T19:16:15Z","created_by":"HamChowderr","updated_at":"2026-06-27T19:21:19Z","closed_at":"2026-06-27T19:21:19Z","close_reason":"Apps page no longer hardcodes hubspot. Added listSnapshotApps(workspaceId) + GET /dashboards/apps (authed, newest-refreshed first); page defaults to the workspace's most recent app when no ?app=, generic 'No app data yet' empty state (no app name) when none. Verified live: empty→{apps:[]}→generic state; with data→defaults to most-recent (airtable\u003estripe); no token→401. Commits 20cb417+55f185e.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-tss9","title":"Harden /chat auth: derive userId from the Bearer token, don't trust body.resourceId","description":"The Mastra apiRoute POST /chat/:agentId is not behind the custom authMiddleware and trusts body.resourceId (the client-supplied sender). The web already sends Authorization: Bearer \u003csupabase JWT\u003e, so the handler could validate it (getSupabase().auth.getUser(token)) and derive the trusted userId, ignoring/cross-checking body.resourceId. This would make the whkr collaborative-write gate (and all chat) spoof-resistant. Care: channel callers (Telegram/Discord/etc.) may invoke the agent without a Supabase JWT — confirm they don't hit this HTTP route, or gate the token-derivation to web callers. Pre-existing trust model; whkr did not worsen it but makes hardening worthwhile.","acceptance_criteria":"POST /chat with a body.resourceId that does not match the validated Bearer-token subject is rejected (or the token subject overrides it); non-web callers still work.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T18:37:33Z","created_by":"HamChowderr","updated_at":"2026-06-27T18:59:43Z","started_at":"2026-06-27T18:53:38Z","closed_at":"2026-06-27T18:59:43Z","close_reason":"Hardened POST /chat/:agentId. It's a Mastra apiRoute outside the custom authMiddleware and trusted client-supplied body.resourceId. Now resolves the trusted identity via resolveFromRequest (Supabase Bearer JWT or fmn_ API key — same resolver authMiddleware uses), 401s if none, and derives rid from it; body.resourceId ignored. All HTTP callers (web composer + onboarding) already send the session token; channels invoke the agent in-process (not this route), so nothing legit breaks. Hardens the whkr gate too (keys on the now-trusted sender). Verified LIVE: teammate token + body.resourceId=owner on owner's PRIVATE chat → 403 (token wins → spoof blocked); no token → 401. 342 tests green. Commit 1a25552.","dependencies":[{"issue_id":"foreman-tss9","depends_on_id":"foreman-whkr","type":"discovered-from","created_at":"2026-06-27T11:37:32Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-whkr","title":"Collaborative chat writing (teammate continues a shared thread)","description":"Deferred from 28cz. Today a workspace-shared chat is READ-ONLY for teammates (28cz) because Mastra messages are owner-keyed by resourceId. Let a workspace member POST into an existing shared thread so (a) the message appends to the SAME Mastra thread, (b) the agent responds in that thread, (c) the teammate's authorship is recorded/distinguishable, (d) the owner's normal flow is unbroken. Requires resolving the resourceId model: invoke the agent with the thread's resourceId (or workspace-scoped resource) while attributing the teammate via message metadata. Gate on is_workspace_member + visibility='workspace'.","acceptance_criteria":"A teammate viewing a workspace-shared chat can send a message; it appends to the same thread; the agent replies in-thread; the teammate's authorship is visible; the owner can still continue their own chats normally; non-members still cannot write.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T18:00:05Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-27T18:23:34Z","closed_at":"2026-06-27T18:37:40Z","close_reason":"Collaborative chat writing. /chat handler (mastra/index.ts): authz gate — non-owner write allowed ONLY when visibility='workspace' AND sender is a workspace_member, else 403 (also closes pre-existing open-write gap); runs agent under the THREAD OWNER's resourceId (working memory + semanticRecall are scope:'resource' in foreman.ts, so shared thread stays coherent) while requestContext/requestUserContext keep the actor's id; teammate message prefixed with name||email for visible authorship. Web: /api/messages isReadonly no longer from is_owner (members write) + isOwner passthrough; chat-header gates VisibilitySelector+ShareButton on isOwner; shell drops read-only banner, composer shows for all who can open. Verified LIVE: teammate→private 403; non-member→shared 403; teammate→shared 200 stream, msg appended to OWNER thread under owner resourceId with attribution prefix; owner path untouched (gate only fires sender!=owner); 342 agents tests green. Commits 8233833+60feba7. Follow-up filed: harden /chat to derive userId from Bearer token vs trusting body.resourceId.","dependencies":[{"issue_id":"foreman-whkr","depends_on_id":"foreman-28cz","type":"discovered-from","created_at":"2026-06-27T11:00:04Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mk25","title":"Public (logged-out) chat share link","description":"Deferred from 28cz. The conversation.visibility enum already supports 'public'. Add a logged-out public share page for a chat, mirroring the dashboard_share / document_share capability-token pattern: a conversation_share token table (or visibility='public' gate), an unauthenticated agent route that returns the chat's messages by token, a Next.js /c/[shareToken] logged-out page, api-client create/revoke methods, and a Share/copy-link control in the chat header. Read-only, anonymous.","acceptance_criteria":"An owner can generate a public link for a chat; opening it logged-out renders the messages read-only; revoking the link 404s it; expiry honored; no auth required for the public read.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T17:59:56Z","created_by":"HamChowderr","updated_at":"2026-06-27T18:22:35Z","started_at":"2026-06-27T18:02:31Z","closed_at":"2026-06-27T18:22:35Z","close_reason":"Public logged-out chat share link. migration 20260627000003 (conversation_share token table, owner-scoped, RLS enabled at creation); lib/conversations/share.ts (create/revoke/getToken gated on user_id=owner; getSharedConversation resolves token→thread ref, pure DB, no mastra-index import to avoid circular build break); routes/conversations.ts (auth-exempt /conversations/public/:token; public handler loads msgs via memory.recall by thread id); web /c/[shareToken] read-only page (ai-elements Message/MessageResponse, text parts only), conversations-client, /c/ middleware allowlist, chat/actions server actions, share-button Popover (create/copy/revoke) in chat-header (owner-only). Token decoupled from visibility (private chat can still have a public link). Verified live: owner mint→anonymous read 200 (4 msgs, title resolved)→status echo→non-owner mint 404→revoke→post-revoke 404→bogus 404. Commits aefbeee+5ca17bb. Gates: agents tsc + web tsc + biome(8) + 342 agents tests all green.","dependencies":[{"issue_id":"foreman-mk25","depends_on_id":"foreman-28cz","type":"discovered-from","created_at":"2026-06-27T10:59:55Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-m6se","title":"Rename user-facing Dashboards → Apps (built data-apps: dashboards, internal tools)","description":"User reframes the built-artifact surface as 'Apps' — things Foreman builds with code from pulled Zapier data (a dashboard is one kind of app; internal tools etc. are others). Rename USER-FACING copy only: nav 'Dashboards'→'Apps'; page/breadcrumb headings; public share 'Shared dashboard'→'Shared app'; chat build status 'Building dashboard…'→'Building app…'; landing 'Live dashboards'/'Ask for a dashboard'→Apps; create_dashboard tool description/output/error reframed as building an 'app' (so the agent also triggers on 'build an app'). KEEP internal identifiers (routes /dashboards + /d/, tables artifact/dashboard_share, tool ID create_dashboard, file/component/module names) to avoid a risky migration. Resolves the 'apps' collision: Apps = what Foreman builds; connected apps/integrations = what you connect (catalog wording unchanged).","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T15:47:45Z","created_by":"HamChowderr","updated_at":"2026-06-27T15:55:10Z","started_at":"2026-06-27T15:47:53Z","closed_at":"2026-06-27T15:55:10Z","close_reason":"User-facing Dashboards→Apps rename shipped (Apps = built data-apps: dashboards, internal tools). nav/pages/share/chat-status/landing/agent-tool copy reframed as 'app'; internals (routes/tables/tool-id/files) unchanged. tsc+biome clean. Catalog 'connected apps' wording left as-is per the Apps-vs-connected-apps taxonomy.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5e6p","title":"RLS policies via is_workspace_member() (defense-in-depth for workspace_id boundary)","description":"Core tables have RLS ENABLED but with NO policies (only service_role, which the agent server uses, can read/write — bypassing RLS). Add real RLS policies keyed on is_workspace_member(workspace_id, auth.uid()) so workspace_id is a true security boundary for any authenticated (non-service-role) access, as defense-in-depth behind the app-layer workspace scoping. Covers chat/document_share/automation/dashboard/artifact + the new document spaces.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T15:07:09Z","created_by":"HamChowderr","updated_at":"2026-06-27T17:28:47Z","started_at":"2026-06-27T17:15:25Z","closed_at":"2026-06-27T17:28:47Z","close_reason":"Added workspace-scoped RLS policies (migration 20260627000002): ENABLE RLS on document_share + 7 SELECT policies keyed on is_workspace_member(auth.uid(), workspace_id) — conversation (owner OR workspace/public-visible member), artifact/app_data_snapshot/dashboard_share/document_share/automation/automation_run (any member). Defense-in-depth behind the app-layer scoping (swfe+28cz, verified live); adds zero new exposure since authenticated holds no table grant (house posture — even workspaces/app_catalog don't), so policies are the latent boundary. Verified in rolled-back txns: conversation owner=both/member=workspace-only/non-member=none; artifact member=own-ws/non-member=foreign-only. SELECT-only (mutations stay app-layer). Commit 133d4e1.","dependencies":[{"issue_id":"foreman-5e6p","depends_on_id":"foreman-wl54","type":"discovered-from","created_at":"2026-06-27T08:07:08Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ybif","title":"Public dashboard share page /d/[shareToken] redirects logged-out viewers to login","description":"The Next 16 proxy.ts middleware allowlist (web src/lib/middleware.ts updateSession) exempts /, /docs, /compare, /login, /auth from the auth redirect — but NOT /d/. So an unauthenticated viewer opening a shared dashboard link /d/\u003ctoken\u003e is redirected to /auth/login instead of seeing the public share page, defeating dashboard sharing. Found while building document sharing (foreman-jz14), where the identical gap blocked /doc/\u003ctoken\u003e until /doc/ was added to the allowlist. Fix: add !pathname.startsWith('/d/') to the same allowlist in src/lib/middleware.ts. Verify a logged-out /d/\u003cvalid-token\u003e renders.","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T05:21:50Z","created_by":"HamChowderr","updated_at":"2026-06-27T05:28:52Z","started_at":"2026-06-27T05:27:55Z","closed_at":"2026-06-27T05:28:52Z","close_reason":"Added !pathname.startsWith('/d/') to the proxy allowlist (src/lib/middleware.ts). Verified: logged-out /d/\u003ctoken\u003e now 200 instead of 307→login; /doc/ still public, /chat still gated.","dependencies":[{"issue_id":"foreman-ybif","depends_on_id":"foreman-jz14","type":"discovered-from","created_at":"2026-06-26T22:21:50Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ugu3","title":"Agent cites knowledge docs with AI Elements inline-citation","description":"When the agent answers from knowledge docs (via Workspace.search/doc-RAG), cite them with the AI Elements inline-citation component (InlineCitation/InlineCitationCard/CardTrigger/Source/Quote/Carousel; deps badge+carousel+hover-card already in our registry; install from elements.ai-sdk.dev, rewrite @/registry/default/ -\u003e @/components/ui/). Wire: agent emits citation markers referencing doc paths -\u003e message renderer maps to \u003cInlineCitation\u003e whose source = the doc (title + snippet + button that opens the KnowledgePanel). Most meaningful once doc-RAG surfacing is wired (agent retrieves docs via Workspace.search then cites). Verified inline-citation is a real, valid AI Elements registry entry (2026-06-26).","notes":"VERIFIED LIVE (clean single server, real test-user token, real agent run). Asked Foreman 'what is in my Q3 launch plan, cite it' -\u003e agent called mastra_workspace_search + list_files + read_file (3x each) then emitted 3 well-formed citations: [\u003cclaim\u003e](doc:documents/q3-launch-plan.md \"Q3 Launch Plan\") for goal/timeline/risks. Renderer: message.tsx StreamdownLink branches href.startsWith('doc:') -\u003e DocCitation (AI Elements InlineCitation primitives, button not anchor -\u003e bypasses Streamdown linkSafety) -\u003e useKnowledgePanel().open({path,title}) opens the side panel. inline-citation.tsx vendored from registry.ai-sdk.dev (deps badge/carousel/hover-card already present; imports already @/components/ui). tsc(agents+web)+biome clean. Commit 5658690. NOT captured: browser screenshot of the rendered badge (agent-browser still dropping auth/tab-jumping); emission proven via HTTP + render branch is trivial+typechecked. Also cleaned up a process tangle: 2 stale 'mastra dev' watchers had each respawned an output server fighting over mastra.duckdb (lock error); killed all, started one clean server.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T03:12:37Z","created_by":"HamChowderr","updated_at":"2026-06-27T05:05:02Z","started_at":"2026-06-27T04:54:07Z","closed_at":"2026-06-27T05:05:02Z","close_reason":"Agent cites knowledge docs with AI Elements inline-citation. Prompt guides search+cite via a doc: markdown-link scheme; web renders DocCitation that opens the KnowledgePanel. Verified live: real agent searched/read the Q3 doc and emitted 3 correct doc: citations. Commit 5658690.","dependencies":[{"issue_id":"foreman-ugu3","depends_on_id":"foreman-aqjx","type":"discovered-from","created_at":"2026-06-26T20:12:36Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jz14","title":"Share knowledge documents (public link + teammate/space)","description":"Sharing for knowledge docs (foreman-aqjx + collaboration foreman-wl54), two modes: (1) PUBLIC LINK — mint a read token, GET /documents/public/:token, mirroring the existing dashboard_share pattern (supabase/migrations dashboard_share + lib/dashboards/share + share-button.tsx). Quick win. (2) TEAMMATE/SPACE — docs in a shared space (vs personal documents/) visible to other members of the same workspace; needs multi-member workspace resolution + visibility (foreman-wl54). Maps to the demo's personal vs shared Spaces. Recommend: public-link first (reuses dashboards code), then space-scoped teammate sharing with wl54.","notes":"PUBLIC-LINK MODE SHIPPED + verified live (commit e9d188b). document_share table (migration 20260627000000, applied via 'migration up' non-destructively, types regenerated) mirrors dashboard_share. lib/documents/share.ts create/revoke/getToken/getSharedDocument; public read resolves the OWNER's workspace fs via the trusted workspace_id on the row (no viewer auth, no cross-tenant leak). Routes POST/GET/DELETE /documents/share (authed) + GET /documents/public/:token (the '*' middleware skips only /documents/public/). Web: KnowledgePanel Share button (popover create-link/copy/stop), logged-out /doc/[token] page, added /doc/ to proxy.ts allowlist. Verified: full mint-\u003epublic-read-\u003estate-\u003erevoke-\u003e404 lifecycle + web page renders (200) / bad token not-found no-leak. REMAINING: teammate/space sharing (personal vs shared Spaces) — rides on collaboration epic foreman-wl54.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T03:12:31Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:27Z","closed_at":"2026-07-05T03:26:27Z","close_reason":"Shipped: e9d188b feat(knowledge) public-link doc sharing + explicit close commit 550993e; document_share table exists. Prior close clobbered by bd #4128.","dependencies":[{"issue_id":"foreman-jz14","depends_on_id":"foreman-aqjx","type":"discovered-from","created_at":"2026-06-26T20:12:30Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-udji","title":"Document versioning for the knowledge layer","description":"Today save_document OVERWRITES documents/\u003cslug\u003e.md (update-on-same-title, no history). Add version history that fits the Workspace-files model (NOT a DB documents table): on each save, snapshot prior content to a history location (e.g. documents/.history/\u003cslug\u003e/\u003cts\u003e.md) keeping \u003cslug\u003e.md as current; KnowledgePanel gets a version list + view/restore. AI Elements Artifact + the orphaned chatbot version-footer UI are reusable references. Verified live 2026-06-26: save_document -\u003e chip -\u003e KnowledgePanel renders markdown (Q3 Launch Plan demo).","notes":"APPROACH (user: use Mastra's primitive): version docs on the Mastra content-addressable BlobStore (@mastra/core storage/domains/blobs — SHA-256 keyed put/get/has/getMany, natural dedup) + a per-doc version-tree manifest (mirrors SkillVersionTree {path-\u003e{blobHash,size,mimeType}}). On each save: hash markdown -\u003e blobStore.put -\u003e append {version,blobHash,createdAt} to the doc manifest; keep documents/\u003cslug\u003e.md as the LIVE copy so the agent's Workspace file tools + bm25 search see current content. New routes: GET /documents/:path/versions, /versions/:n (blobStore.get), POST /restore. KnowledgePanel gets a version dropdown (view/restore). OPEN at build: how to reach the storage BlobStore instance (MastraEditor.getBlobStoreProviders() or a @mastra/pg BlobStore; editor falls back to the Mastra storage blob store). Note: MastraEditor itself is versioned-ENTITY CRUD (agents/prompts/mcp/scorers, draft/published) — no document namespace; the BlobStore is the right lower-level primitive.\nBUILT + mechanism-verified, committed b437827. Mastra primitive = BlobsPG (concrete BlobStore) over DATABASE_URL via REST connectionString config; init() creates mastra_skill_blobs. BlobStore=content (SHA-256 dedup); per-doc manifest documents/.history/\u003cslug\u003e.json in per-tenant Workspace fs = version tree. Files: lib/documents/blob-store.ts, lib/documents/versions.ts (record/list/getVersion/restore; dedup skips identical re-save; restore writes live + appends new rev; only manifest hashes fetched = no cross-tenant leak). save-document records a version post-write. Routes: GET /documents/versions, GET /documents/version, POST /documents/restore. Web: KnowledgePanel version dropdown + Restore. VERIFIED via tsx probes (BlobsPG vs local PG; full flow vs real contained LocalFilesystem) all PASS; tsc+biome clean. PENDING: live in-browser demo (4111 dev server currently stale/crashed; needs clean infisical-run restart).\nLIVE E2E VERIFIED (fresh server, real test-user token, real agent). Agent save_document calls accumulated v1(55B)-\u003ev2(82B)-\u003ev3(100B) via real LLM tool calls (dedup-aware append). GET /documents/versions returned correct ordering. POST /documents/restore {version:1} -\u003e 200 current:4, prepended v4 note 'restored from v1' (append-only [v4,v3,v2,v1]); live /documents/content == exact v1 bytes. Route validation: nonexistent-\u003e200 empty shape, missing version-\u003e404, bad path-\u003e400. VISUAL: earlier agent-browser snapshot confirmed save chip rendered + KnowledgePanel opened with the version dropdown (combobox) + doc headings. NOT captured: polished screenshot of expanded dropdown/restore — agent-browser session kept dropping auth + tab-jumping to a stale Provisr tab (documented flakiness), not a feature gap. Feature complete.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:56:10Z","created_by":"HamChowderr","updated_at":"2026-06-27T04:24:43Z","started_at":"2026-06-27T03:21:40Z","closed_at":"2026-06-27T04:24:43Z","close_reason":"Document versioning shipped on Mastra's BlobStore primitive + per-doc version-tree manifest. Built, offline-probed, and verified LIVE end-to-end (real agent save-\u003ev1/v2/v3, restore-\u003ev4, content==v1). Commit b437827. Only gap is a cosmetic screenshot blocked by agent-browser flakiness.","dependencies":[{"issue_id":"foreman-udji","depends_on_id":"foreman-aqjx","type":"discovered-from","created_at":"2026-06-26T19:56:10Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-6r9y","title":"Inbox intelligence: prioritization + teammate aggregation","description":"getWorkspaceInbox today lists only the requesting users own automations, sorted chronologically. Add (a) importance/urgency prioritization scoring and (b) aggregation of teammate-owned items in the same workspace. Prioritization and the what-should-I-work-on view must work over ANY user-selected subset of the full 9000+ app catalog (cross-app reach already exists via ToolSearch) — not a fixed app list.","design":"Extend getWorkspaceInbox to include workspace-member automations (respect E2 visibility); add a scoring pass; optional what-to-work-on capability over arbitrary catalog apps.","acceptance_criteria":"Inbox shows a ranked list including teammate items; a what-to-work-on view synthesizes across any chosen catalog apps.","status":"open","priority":2,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:02:37Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:54Z","dependencies":[{"issue_id":"foreman-6r9y","depends_on_id":"foreman-2vpb","type":"discovered-from","created_at":"2026-06-26T19:02:37Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gp4h","title":"Chat-with-dashboard: artifact round-trip + persist preview_app","description":"Close the dashboard loop. Add agent tools to load and query persisted artifacts (load_dashboard / query_artifact), an artifact reference in chat (@dashboard), and persist preview_app output to the artifact table so the live React apps are reloadable. Audit: the agent can CREATE dashboards (create_dashboard, persistent) but has no tool to load/introspect them back; preview_app is ephemeral (local Vite URL, nothing saved). Builds on foreman-ltc7.","design":"Expose the existing /dashboards/artifacts/:id read path as agent tools; context-inject referenced artifacts; save preview_app TSX as an artifact.","acceptance_criteria":"User loads a saved dashboard into a chat and asks about its data; the agent reads the artifact spec+snapshot and can pull more data in.","status":"open","priority":2,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:02:31Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:45Z","dependencies":[{"issue_id":"foreman-gp4h","depends_on_id":"foreman-ltc7","type":"blocks","created_at":"2026-06-26T19:02:56Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-gp4h","depends_on_id":"foreman-2vpb","type":"discovered-from","created_at":"2026-06-26T19:02:31Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-88oj","title":"Remove duplicate sidebar-collapse trigger from AppShell header","description":"AppShell pages (Automations, Inbox, Dashboards, Workspaces, Settings) showed TWO sidebar-collapse controls: one in app-shell.tsx's top header (SidebarTrigger) and one in the sidebar itself (app-sidebar.tsx). User: keep the sidebar one, remove the header one. Pages render their own \u003cmain\u003e+title, so the header existed only for the trigger -\u003e drop the redundant header entirely. Sidebar keeps full collapse/expand affordance (SidebarTrigger when expanded; logo hover 'Open sidebar' when collapsed).","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-27T01:30:15Z","created_by":"HamChowderr","updated_at":"2026-06-27T01:31:48Z","closed_at":"2026-06-27T01:31:48Z","close_reason":"Removed redundant AppShell header; sidebar owns the sole collapse control. Biome green, committed 9b90042.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8nyg","title":"Graduate preview to the Mastra workspace agent harness","description":"Phase 2: replace one-shot preview_app with the agent driving real Mastra workspace tools (write_file/edit_file/execute_command) to scaffold an app, run it, read errors, and iterate — visible file+terminal steps in the panel/console. The genuine v0/Bolt experience. Needs approval-gating + sandbox isolation/security. Follows the hybrid quick wins.","notes":"CORE SHIPPED + verified in headed browser: agent builds a REAL React component from the project's shadcn/ui components (Card/Badge/Chart) + recharts, rendered live via a warm Vite dev server (preview-template, :7332). Sonnet→preview_app(brief)→Haiku writes TSX→startReactPreview writes generated.tsx + spawns Vite→iframe. Build feed adapted (Designing→Compiling with Vite→Live). Remaining polish (separate): error→iterate loop feeding Vite errors back, per-tenant isolation (foreman-jgme), security/cloud (parked).","status":"in_progress","priority":2,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T21:30:49Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T22:35:51Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7tci","title":"Live build/console feed for preview_app","description":"preview_app emits writer.custom progress parts (generating / writing file / starting server / live URL) rendered in the artifact console, replacing the static 'Building live preview…'. writer.custom already flows agent-\u003eclient (connect-zapier, fork-conversation).","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-26T21:30:40Z","created_by":"HamChowderr","updated_at":"2026-06-26T21:58:28Z","closed_at":"2026-06-26T21:58:28Z","close_reason":"preview_app streams a non-transient data-preview-progress part per stage (design/build/ready); message.tsx renders them as a checkmark build feed. Verified in-browser: 'Designing the page…' -\u003e 'Writing into the sandbox…' -\u003e 'Preview is live.' stream live, replacing the opaque 'Building live preview…'.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-fq71","title":"Swap custom web-preview for the official Vercel AI Elements component","description":"Our inline preview used a hand-written 'AI Elements style' web-preview.tsx. Replace it with the official Vercel AI Elements web-preview component (fuller-featured: editable URL nav, WebPreviewNavigationButton, WebPreviewConsole). Pulled the verbatim source from registry.ai-sdk.dev/web-preview.json and wired message.tsx to the official compound API. Note: the bare 'npx ai-elements@latest' (no subcommand) tries to add ALL components interactively and pulls heavy unrelated deps (xyflow, rive, media-chrome) — reverted that; the real component needs zero new deps (button/collapsible/input/tooltip + lucide already present).","acceptance_criteria":"web-preview.tsx is the official registry source; message.tsx uses WebPreview/WebPreviewNavigation/WebPreviewUrl/WebPreviewNavigationButton/WebPreviewBody; no new deps added; biome clean; web tsc 0 errors.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-26T20:58:27Z","created_by":"HamChowderr","updated_at":"2026-06-26T20:58:49Z","closed_at":"2026-06-26T20:58:49Z","close_reason":"Official web-preview.tsx pulled from registry.ai-sdk.dev + message.tsx rewired to its compound API. Zero new deps; biome clean; web tsc 0 errors.","dependencies":[{"issue_id":"foreman-fq71","depends_on_id":"foreman-qq4x","type":"discovered-from","created_at":"2026-06-26T13:58:27Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-yhen","title":"Add Supabase Platform Kit on a page (cloud-only)","description":"Embed the Supabase Platform Kit UI on a page (manage the Supabase project/data in-app). CLOUD-ONLY: depends on the hosted Supabase Management API; does NOT work against the local supabase CLI stack. Gate it to cloud mode (hide/disable when self_hosted/local via FOREMAN_MODE). Research exact Platform Kit components + Management API scopes when building.","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:27:43Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-691a","title":"Hosted cloud sandbox provider (E2B or Daytona) + preview URLs + cost controls","description":"Hosted product: per-tenant cloud sandboxes (E2B or Daytona) with public preview URLs to iframe, plus Docker for self-host isolation. Pick E2B (mature AI DX, 150/mo base) vs Daytona (no base, 200 credit, fast starts) after the spike. Add lifecycle (idle shutdown) and per-tenant cost caps. ~1 cent/session; base fee is the cost driver.","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:21:29Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-691a","depends_on_id":"foreman-ltc7","type":"discovered-from","created_at":"2026-06-26T11:22:51Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-691a","depends_on_id":"","type":"discovered-from","created_at":"2026-06-26T11:21:28Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7m3f","title":"Data-out: live preview embed surface in Foreman (iframe a running sandbox server)","description":"Embed a running sandbox server in Foreman: expose the server port then provider preview URL (E2B getHost / Docker port-map / Local localhost) then iframe in a chat Artifact kind or a dashboard view. Security: iframe sandboxing, auth-scoped preview. Complements the existing constrained DashboardSpec path which stays for cheap/safe dashboards.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:21:23Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: live preview embed iframes running server (preview-panel.tsx WebPreview; cab81f9).","dependencies":[{"issue_id":"foreman-7m3f","depends_on_id":"foreman-ltc7","type":"discovered-from","created_at":"2026-06-26T11:22:45Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-7m3f","depends_on_id":"","type":"discovered-from","created_at":"2026-06-26T11:21:23Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gnd7","title":"Data-in bridge: agent fetches Zapier data into the workspace for the sandbox","description":"Agent calls a Zapier SDK tool (run-action/tables/fetch) then writes JSON into the mounted workspace FS then sandbox code reads it. Mostly system-prompt orchestration once the mount exists; optionally a helper tool. Net-new pattern.","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T18:21:18Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-gnd7","depends_on_id":"foreman-ltc7","type":"discovered-from","created_at":"2026-06-26T11:22:40Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-gnd7","depends_on_id":"","type":"discovered-from","created_at":"2026-06-26T11:21:17Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wko7","title":"Expose all Mastra memory types incl. shared team memory","description":"Foreman today uses per-conversation memory + semantic recall (search_history RAG). Expose the full Mastra memory engine: working memory, semantic recall, and a SHARED TEAM BRAIN (decisions/docs/context remembered across people) — parity with Zapier Shared Brain's core strength. The /compare matrix currently marks 'Shared team brain across people' as Soon for Foreman; this issue delivers it (then flip Soon -\u003e yes). Be honest in copy until shipped.","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T11:07:24Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-vb78","title":"User-installable skills shared across the team","description":"Let a user add skills the agent can use (Claude-Code-style skills), and share them across their workspace/team so the whole team's agent can use them. This is the Foreman analog to Zapier Shared Brain's 'shared skills'. Build on Mastra. NOTE: the /compare/zapier-shared-brain matrix intentionally does NOT yet claim this for Foreman — when shipped, add a 'User-installable / team-shared skills' row (Foreman yes). Related: epic foreman-jy1w (marketing).","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T11:07:19Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4gxt","title":"Landing + comparison honesty/UX pass (10k count, vs-matrix, hero multi-app, sticky nav)","description":"Refinement pass on the marketing surfaces (part of epic foreman-jy1w). (1) /compare/zapier-shared-brain: honest ICP framing — Shared Brain ICP = satisfied non-builder; removed false 'many teams will run both' claim; replaced prose table with a balanced 12-row checkmark feature matrix (yes/no/Soon); stopped framing shared-team-memory as Shared-Brain-only. (2) Hero agent animation cycles 5 apps (Slack/HubSpot/Stripe/Calendar/Notion), shows approve AND decline, fixed scenario bottom-\u003etop animation glitch via AnimatePresence mode=wait keyed per scenario. (3) More-in-Foreman: dropped Voice, promoted Dashboards + Workspaces to rich feature blocks with visual mockups; removed SQL/BI jargon. (4) Connection count corrected 9,000+ -\u003e 10,000+ everywhere (web + agents, 13 files). (5) Sticky nav fix: overflow-x-hidden -\u003e overflow-x-clip on landing/compare wrappers (overflow-x:hidden broke position:sticky). (6) Removed MCP from the hero chat-channel list (MCP/A2A are integration surfaces, not chat). next build green, biome clean.","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T11:06:59Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-zfxb","title":"[web] Foreman vs Zapier Sidekick (Shared Brain) comparison page — non-bashing","description":"New marketing page comparing Foreman to Zapier Sidekick ('The AI workspace that thinks alongside your team' / 'Shared Brain', sidekick.zapier.com). RESEARCH (2026-06-26): Sidekick = Zapier's first-party hosted AI workspace for TEAMS; a shared 'brain' that remembers every conversation/decision/document; shared skills ('skills anyone builds, everyone can run'); personal assistant taking real actions across 10,000+ integrations; team collaboration focus; requires a Zapier account; early access (used internally, 1M+ actions). FAIR/NON-BASHING framing: different shapes, not pure rivals. Foreman = open, multi-channel chat DRIVER for the Zapier account you already have (Slack/Discord/Teams/Telegram/etc.), self-hostable (MIT, one Docker container), approval-gated/audit-logged, your data/infra, built ON the Zapier SDK (complementary). Sidekick = all-in-one hosted team AI workspace w/ shared team knowledge/memory (a genuine strength Foreman doesn't match — say so honestly). Page: honest 'what each is', a balanced comparison table, 'when to choose which', note Foreman is built on Zapier. Route ~ /compare/zapier-sidekick, reuse SiteNav+SiteFooter.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-26T08:26:01Z","created_by":"HamChowderr","updated_at":"2026-06-26T08:52:34Z","closed_at":"2026-06-26T08:52:34Z","close_reason":"Shipped + verified live. New public route /compare/zapier-sidekick: honest, non-bashing Foreman vs Zapier Sidekick (Shared Brain) page — hero, two 'what each is' cards, a 9-row balanced comparison table (credits Sidekick's shared-team-brain as 'its core strength'), 'when to choose which' two-column, and a 'not really rivals — built on the Zapier SDK' close + CTA. Reuses SiteNav/SiteFooter. Fixed: added /compare to the web middleware public allowlist (was redirecting to /auth/login). Verified: next build green; page renders.","dependencies":[{"issue_id":"foreman-zfxb","depends_on_id":"foreman-jy1w","type":"discovered-from","created_at":"2026-06-26T01:26:00Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dph0","title":"[web] Homepage sections for new features — Automations (flagship), Dashboards, Workspaces, Voice","description":"Add landing sections (matching existing Reveal/section style) to app/page.tsx showcasing the new things: durable Automations (build from chat, durable execution, live run-status), Dashboards, Workspaces/multi-tenant, Voice. Default: sections in the single scroll (not separate pages).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-26T08:25:55Z","created_by":"HamChowderr","updated_at":"2026-06-26T08:36:04Z","closed_at":"2026-06-26T08:36:04Z","close_reason":"Homepage feature showcase done + verified live. Automations = full flagship section w/ live run-status demo (11ae5c0). Dashboards + Workspaces + Voice = one compact 3-card 'More in Foreman' section (avoids scroll bloat vs 3 more full sections). All four new capabilities now showcased on the landing page.","dependencies":[{"issue_id":"foreman-dph0","depends_on_id":"foreman-jy1w","type":"discovered-from","created_at":"2026-06-26T01:25:55Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jy1w","title":"[web][marketing] Homepage feature showcase + Zapier Sidekick comparison + UI polish sweep","description":"User-directed marketing/UX batch (2026-06-26): (1) add homepage sections showcasing the new capabilities; (2) a fair, non-bashing Foreman-vs-Zapier-Sidekick comparison page; (3) apply the make-interfaces-feel-better skill across app surfaces.","status":"open","priority":2,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T08:25:50Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pe0w","title":"[web][brand] Drop 'alpha', use Zapier logo as the mark, add not-affiliated disclaimer","description":"User-directed branding pass on the marketing site + auth: (1) remove every 'Alpha'/'alpha' label + stage copy across auth-shell, site-nav, site-footer, docs-banner, closing-cta, hosting; (2) replace the orange 'F' square mark with the Zapier logo (/zapier.svg) everywhere it appears (auth-shell desktop+mobile, site-nav, site-footer) to match brand-header; (3) add a footer disclaimer: Foreman is not affiliated with / endorsed by Zapier; it is an independent product built on the Zapier SDK. User accepts the Zapier-logo + disclaimer pairing (decided 2026-06-26).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-26T07:41:23Z","created_by":"HamChowderr","updated_at":"2026-06-26T07:47:13Z","closed_at":"2026-06-26T07:47:13Z","close_reason":"Done + visually verified on the running dev server. Removed every Alpha/alpha label + stage copy (auth-shell, site-nav, site-footer, hosting ×4, docs-banner, closing-cta; internal STORAGE_KEY left as-is, not user-visible). Swapped the orange 'F' square in auth-shell (desktop+mobile) to /zapier.svg — nav/footer/brand-header already used it. Added footer disclaimer: not affiliated/endorsed/sponsored by Zapier; independent product built on the Zapier SDK; Zapier is a trademark of Zapier, Inc. Biome clean; login + footer screenshotted.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-nk7s","title":"[durable] Stuck-run give-up cap in reconcile (bounded, not blunt)","description":"reconcilePendingRuns re-polls non-terminal runs forever. Add a bounded give-up that fails GENUINELY-stuck runs without killing legit long-running durables (waits/callbacks run for days).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:53:21Z","created_by":"HamChowderr","updated_at":"2026-06-26T05:53:33Z","closed_at":"2026-06-26T05:53:33Z","close_reason":"DONE. STUCK_RUN_TIMEOUT_MS (env FOREMAN_RUN_STUCK_TIMEOUT_MS, default 15min). reconcilePendingRuns now fails a run ONLY when genuinely stuck: (1) no trigger_id past timeout = claimed-but-never-dispatched (worker crash between claim and fire) — listPendingRuns broadened to include 'initialized' rows for this; (2) no durable_run_id past timeout = trigger never spawned a durable; (3) SDK/owner error (e.g. ZapierNotConnected) past timeout = reconcile gave up. A linked-and-still-running durable is NEVER capped (durables run for days; failures retry 5x over ~2-3min and reach 'failed' naturally — confirmed run-failed-probe.ts). Marks status='failed' with an error reason. Tests: 3 new cap cases (worker suite 12 green). biome+tsc clean.","dependencies":[{"issue_id":"foreman-nk7s","depends_on_id":"foreman-480k","type":"discovered-from","created_at":"2026-06-25T22:53:21Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jc12","title":"[durable] Surface durable failure/retry detail (execution.operations) on runs","description":"A failing step RETRIES (engine default) and the run stays 'started' during retries; the real failure lives in getDurableRun.execution (summary.last_error, operations[].retry_count/error/next_retry_at), not the top-level status (proven by run-failed-probe.ts). Today Foreman only stores top-level status+error, so a retrying/failing run looks like a stalled 'started'. Consider: reconcile reads execution.summary.last_error / retry state and surfaces it (a 'retrying' substatus or last_error on the run) so users see WHY a run is stuck, not just that it is.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:50:52Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-jc12","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T22:50:52Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dwf8","title":"[durable] Surface inbox initialization_failure on the automation","description":"When an inbox can't subscribe (missing/expired connection, bad inputs) it goes status=initialization_failure (seen in the spike). The worker's ensureInbox returns it but nothing marks the AUTOMATION as broken — the user sees an enabled automation that silently never fires. Fix: when runInboxCycleForAutomation sees inbox.status=initialization_failure, set automation.status='trigger_failed' (or similar) + surface in the /automations UI so the user knows to reconnect.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:50:45Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-dwf8","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T22:50:44Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-y4kc","title":"[durable] Cancel a running automation run (cancelDurableRun) — route + UI","description":"The SDK exposes cancelDurableRun({run}). Foreman has no way to cancel a long-running/stuck durable run. Add: lib/durable.cancelRun + service + DELETE/POST /automations/runs/:id/cancel + a Cancel action in the /automations Runs tab. On cancel, updateRun status='cancelled' (add to the vocabulary).","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:50:38Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-y4kc","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T22:50:37Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rm8z","title":"[durable] Human-approval callbacks: surface ctx.createCallback URL + resume endpoint","description":"Durables support ctx.createCallback (a callback URL + payloadSchema + timeoutSeconds up to days) for human-in-the-loop approval gates — the run pauses (execution.status=waiting) until the URL is POSTed. Foreman doesn't surface this yet: a paused automation_run needs its callback URL exposed (route + /automations UI 'approve/deny' action) and a way to resume. This is the big durable capability not yet wired. Reconcile already leaves waiting runs as 'started' (correct).","status":"open","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:50:28Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-rm8z","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T22:50:28Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-480k","title":"[durable] Worker run-status reconcile: poll trigger→durable_run_id to terminal status","description":"The live loop test (foreman-hnbx) showed the inbox worker records automation_run at TRIGGER time with status='started' and durable_run_id=null, because triggerWorkflow→durable_run_id is async (Zapier resolves it shortly after). So a run row never advances past 'started' in Foreman even though the durable finishes on Zapier — the /automations Runs tab would show stale status. FIX: a reconcile step (a later worker pass, or poll-with-backoff in dispatchMessage) that calls getTriggerRunStatus/getWorkflowRun until durable_run_id + terminal status resolve, then updateRun. Low-risk; the run DID fire (trigger_id recorded).","acceptance_criteria":"a completed durable run shows durable_run_id + terminal status (finished/failed) in automation_run, not 'started'.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:18:11Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-26T05:24:38Z","closed_at":"2026-06-26T05:37:57Z","close_reason":"Run-status reconcile DONE + lifecycle fully mapped (empirically, scripts/run-status-probe.ts). REAL state machine: the TRIGGER run (getTriggerRun) status stays 'started' for the run's whole life — it only exposes durable_run_id (which lags the trigger ~4s). The DURABLE run (getDurableRun) is authoritative: started→finished/failed (execution.status: running→waiting→completed). So the worker was reading the wrong field. FIX: (1) dispatchMessage now fire-and-records (status='started' + trigger_id, NO blocking poll — durables can run for days). (2) new reconcilePendingRuns(): lists non-terminal fired runs (store.listPendingRuns), resolves each owner's SDK, follows trigger_id→(getTriggerRun)durable_run_id→(getDurableRun)→terminal status+output/error, updateRun. Runs every worker tick after the inbox cycle. (3) status vocabulary documented in store.ts: initialized→started→finished/failed. PROVEN LIVE (durable-loop-smoke + reconcile): run advanced started→finished in ~12s with the durable's real output captured in automation_run. Gates: vitest 349 (+3 reconcile tests), biome, tsc clean. Test-harness note: reconcile self-resolves SDK per owner; the fake-user smoke needs FOREMAN_MODE=dev for CLI-login fallback (real automations have a real owner connection).","dependencies":[{"issue_id":"foreman-480k","depends_on_id":"foreman-hnbx","type":"discovered-from","created_at":"2026-06-25T22:18:11Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ut8n","title":"[durable] M4: web UI — /automations CRUD + trigger-inbox visibility","description":"Net-new web surface (parent foreman-l7xq; needs M2 routes). The entire old /workflows UI was removed with the engine (82b24fb) — nothing exists today. SCOPE: (1) /automations route — list, create, detail, run history (web-\u003eagent service_role pattern via data/ server actions + Bearer token, like data/workspaces.ts). (2) INBOX VISIBILITY view (explicitly requested): bound app/action/connection, inbox status (initializing/active/initialization_failure), recent leased messages with lease_count + possible_duplicate_data flags. (3) sidebar entry. Next.js 16 conventions (async createClient, Promise params, no react-hook-form — Field+useState).","acceptance_criteria":"next build passes with /automations route; create+list+inspect work end-to-end against the agent routes; inbox view renders live inbox state; biome green.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T02:30:52Z","created_by":"HamChowderr","updated_at":"2026-06-26T04:03:52Z","started_at":"2026-06-26T03:46:56Z","closed_at":"2026-06-26T04:03:52Z","close_reason":"M4 shipped: web /automations + trigger-inbox visibility. BACKEND: lib/trigger-inbox.listInboxMessages; service.getInboxView (live getTriggerInbox + listTriggerInboxMessages for an automation's trigger_inbox_id, workspace-scoped); route GET /automations/:id/inbox. WEB (Next.js 16, web-\u003eagent pattern): data/automations.ts server actions (list/get/inbox/run/enable/rename/delete forwarding the Supabase Bearer) + data/automations-types.ts; app/automations/page.tsx (auth-gated); components/automations/automations-manager.tsx — master list + detail with enable Switch, Run-now, Delete (2-step), and Runs/Trigger-inbox tabs (inbox shows status + app/action subscription + recent messages with lease_count/possible_duplicate_data); sidebar Automations link. Creation is chat-driven (agent authors the durable source) so no create form. Gates: next build exit 0 (/automations page artifact built), agent vitest 346 pass, tsc clean on all M4 backend files, biome clean (agent+web).","dependencies":[{"issue_id":"foreman-ut8n","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T19:30:51Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-ut8n","depends_on_id":"foreman-l23t","type":"blocks","created_at":"2026-06-25T19:31:28Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-37e6","title":"[durable] M3: trigger-inbox poll worker (lease -\u003e dedup -\u003e dispatch -\u003e ack)","description":"The runtime loop that turns inbox events into durable runs (parent foreman-l7xq; needs M1 lib + M2 schema). Replaces the removed cron-driver-server. SCOPE: a long-running worker (Mastra signal/cron or standalone loop, mirroring the old cron-driver-server lifecycle) that, per active automation: leases its trigger-inbox messages, dedups on lease_count/possible_duplicate_data + automation_run idempotency, dispatches each message to runWorkflow/triggerWorkflow (M1), records an automation_run, then acks (or releases on failure). Honor first-poll latency reality (the inbox spike showed \u003e7min cold-start). Wire into the same process model as the old cron-driver-server (review how it was started/registered before removal in 82b24fb).","acceptance_criteria":"worker leases+acks against a mocked inbox; dedup proven (a redelivered message with lease_count\u003e1 does not double-dispatch); failure path releases for retry; vitest green.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T02:30:45Z","created_by":"HamChowderr","updated_at":"2026-06-26T03:39:14Z","started_at":"2026-06-26T03:30:35Z","closed_at":"2026-06-26T03:39:14Z","close_reason":"M3 shipped: trigger-inbox poll worker (replaces the removed cron-driver-server). DESIGN PIVOT: the automation trigger model is now a trigger-inbox subscription {app,action,connection,inputs} (the locked design — Foreman owns the lease/ack loop), NOT the Zapier --trigger claim. Durables deploy as MANUAL workflows; the worker fires them via triggerWorkflow. (1) lib/automations/types.ts: InboxTriggerSpec + inboxNameFor. (2) lib/automations/worker.ts: dispatchMessage (claimInboxMessage dedup → triggerWorkflow → getTriggerRunStatus → updateRun; skip on already-claimed redelivery; failed→record+release), runInboxCycleForAutomation (ensureInbox idempotent + persist trigger_inbox_id → lease → dispatch batch → ack done+skipped / release failed), runInboxCycle (cross-workspace, per-owner SDK, isolates per-automation failures), startInboxWorker (interval, non-overlapping). (3) store.listActiveInboxAutomations (enabled + trigger has app/action). (4) service.provisionAutomation pivoted: deploy manual (no --trigger), store inbox spec; worker arms lazily. (5) create_automation tool trigger schema → inbox shape. (6) standalone src/inbox-worker-server.ts + npm start:inbox-worker (single instance, no distributed lock, FOREMAN_INBOX_WORKER_INTERVAL_MS). Dedup is a DB constraint (automation_run UNIQUE) so at-least-once redelivery can't double-fire. Gates: vitest 346 pass/0 fail (12 new worker tests + updated service test), biome clean, tsc clean on all M3 files. Trigger loop now closes end-to-end. Only M4 (ut8n, web UI) remains.","dependencies":[{"issue_id":"foreman-37e6","depends_on_id":"foreman-cjg5","type":"blocks","created_at":"2026-06-25T19:31:16Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-37e6","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T19:30:45Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-37e6","depends_on_id":"foreman-l23t","type":"blocks","created_at":"2026-06-25T19:31:23Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":2,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-l7xq","title":"Durable/workflow rebuild on Zapier Next-Gen Zaps (PoC -\u003e platform)","description":"Now that next-gen-Zaps/durable early access is GRANTED + the full durable+workflow API is confirmed usable (foreman-13mw: read+write proven, createWorkflow/deleteWorkflow round-trip OK), rebuild Foreman triggers/workflows on Zapier durables instead of the removed hand-rolled engine. SETUP (getting-started guide, Kenyon Sparks email 2026-06-25): Step3 install = paste into agentic harness (Claude Code) -\u003e 'npx skills add zapier/agent-skills --skill workflows-install' then run the workflows-install skill. It installs the Zapier SDK + zapier-sdk-cli + a set of agentic skills into the workspace AND prompts an interactive Zapier OAuth login (account auth path). Step4 connect apps at https://zapier.com/app/assets/connections. Step6 review deployed durables at https://zapier.com/durables-editor. Capabilities (durable engine): uncapped loops (process whole lists in batches to respect app rate limits), error-catch-and-continue, branch split/rejoin, nested loops, durable waits (pause/resume, cancelable). CAVEATS: (1) The installer changes the workspace Zapier SDK/cli + adds skills — Foreman pins @zapier/zapier-sdk@0.79.0 and enforces dep-uniqueness (@mastra pins), so do the PoC in a SCRATCH dir first, NOT the Foreman repo/branch, to avoid disrupting pinned deps; fold into Foreman deliberately afterward (proof-of-concept-then-platform). (2) Zapier security caution: start low-risk, do not connect sensitive accounts, consider a dedicated test workspace. (3) Interactive Zapier OAuth login required (user completes in browser). ALSO: foreman-13mw stability/sunset question still open -\u003e raise on the Tim Jones call next week before betting Foreman's trigger story fully on this beta.","notes":"SETUP POC COMPLETE 2026-06-25 (scratch dir ~/code/zapier-nextgen-poc, NOT the Foreman repo, to protect pinned deps). Ran the workflows-install recipe end-to-end: (1) env Node v24.16/npm 11.13/git 2.50 OK; (2) installed @zapier/zapier-sdk-cli@0.61.1 GLOBALLY (provides zapier-sdk + experimental binaries); (3) verified Code Workflows experimental commands + required flags (create-workflow --private, publish-workflow-version --connections/--trigger, run-durable --connections/--private, list-triggers, get-workflow-run, trigger-workflow --input); (4) auth = cached browser-login userJwt as admin@otakusolutions.io (NOT client-creds; the Infisical client-creds path returned 403 mid-session on an org-selection mismatch); (5) EA access confirmed via CLI: list-workflows -\u003e {data:[],errors:[]}; (6) installed 5 companion skills (workflows-doctor/create/list/history/modify) into scratch .agents/skills/. Toolchain ready + working. NOT YET DONE: build/publish/run a real workflow via workflows-create (the authoring format + source_files shape for publishWorkflowVersion lives in that skill -- KEY reference for the Foreman rebuild). Capstone build/deploy deferred pending go-ahead (creates real cloud state).\nCAPSTONE PROVEN 2026-06-25: full durable workflow loop works END-TO-END on admin@otakusolutions.io (account 16517571), then cleaned up (list-workflows back to []). Built a minimal no-connection manual workflow (defineDurable + one ctx.step echo + export default). FLOW: run-durable (ephemeral test) -\u003e finished; create-workflow --private -\u003e id; publish-workflow-version --enabled -\u003e version + get-workflow enabled:true; trigger-workflow --input -\u003e run finished (trigger_id -\u003e durable_run_id -\u003e workflow_version_id all linked); delete-workflow -\u003e clean. KEY AUTHORING FACTS for the rebuild: (1) deps must be AGED-pinned \u003e=24h because the run/publish sandbox uses pnpm minimumReleaseAge=1440; aged versions on 2026-06-25: @zapier/zapier-sdk 0.79.0, @zapier/zapier-durable 0.6.1, zod 4.4.3. (2) EVERY import in workflow.ts must appear in --dependencies (aged-pinned); @zapier/zapier-durable goes via --zapier-durable-version. (3) shape = defineDurable(name, async (ctx,input)=\u003e{...}) + export default; one ctx.step(name, async ()=\u003e sdk.runAction({appKey,actionType,actionKey,connection,inputs})) per app action, plain code outside steps. (4) manual input arrives as a JSON STRING -\u003e normalizeInput(JSON.parse) before zod (confirmed: echoed input came back double-encoded). (5) connections = nested {alias:{connectionId}} via --connections on run-durable AND publish. (6) trigger-backed publish uses --trigger JSON with a version-pinned selected_api (implementation_id e.g. GoogleSheetsAPI@2.3.0) or the trigger claim fails SILENTLY (enabled stays false); omit --trigger for manual/webhook. (7) editor link: https://zapier.com/durables-editor/\u003cid\u003e. Toolchain + 6 skills live in ~/code/zapier-nextgen-poc/.agents/skills/ (workflows-create SKILL.md = full authoring reference).\nDESIGN LOCKED 2026-06-25 (user, post-meeting): (1) TRIGGER-INBOX IS THE CHOSEN TRIGGER SUBSTRATE — confirmed will-be-used per the Zapier meeting. So Foreman owns the lease/ack loop (ensureTriggerInbox -\u003e lease -\u003e dedup via lease_count/possible_duplicate_data -\u003e dispatch -\u003e ack), NOT the Zapier-owns-everything durable --trigger path. Durables = the EXECUTION substrate (createWorkflow/publishWorkflowVersion/runDurable). (2) DEPLOY MECHANISM = SDK-PROGRAMMATIC, not CLI: @zapier/zapier-sdk@^0.79.0 is ALREADY pinned in packages/agents and carries the durable+inbox experimental surface; getSdkForUser currently builds from the STABLE import, so the one SDK-layer change is to build the client from '@zapier/zapier-sdk/experimental'. @zapier/zapier-durable + aged-pinned zod are NOT Foreman runtime deps — they go as call arguments (dependencies{}/--zapier-durable-version) into publish/run and install only in Zapier's Vercel sandbox; dep-uniqueness (@mastra pins) untouched. (3) NO STABILITY GATING — built fully on the SDK; if Zapier sunsets/changes the experimental surface we adjust. foreman-13mw stays a Zapier-feedback touchpoint, NOT a blocker. (4) UI GAP CONFIRMED: the entire /workflows web surface + components/workflows/* + workflows-client were removed with the engine (82b24fb); NOTHING in the UI shows inbox/triggers/runs today. Rebuild needs an inbox-visibility view (bound app/action/connection, inbox status, recent leased messages + dup flags) — net-new operational UI.\nAGENT-AUTHORING CONFIRMED 2026-06-25 (user): the foreman agent MUST be able to author + deploy automations from chat (generate the durable source from NL intent per the workflows-create SKILL format, create the Zapier workflow, ensure the trigger-inbox, deploy). So M1 includes an agent tool surface (create/deploy/run/inspect automation tools via createTool, registered through the ToolSearchProcessor like the other custom tools), not just a lib. Web UI is the second authoring path, not the only one.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-26T00:55:19Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-26T04:04:01Z","close_reason":"Durable/workflow rebuild COMPLETE on Zapier Next-Gen Zaps — all 4 milestones shipped + verified, end-to-end. M1 (cjg5): durable + trigger-inbox lib on @zapier/zapier-sdk/experimental + agent authoring tools. M2 (l23t): workspace-scoped automation+automation_run schema (dedup as a DB UNIQUE) + routes, one deploy+persist service path. M3 (37e6): trigger-inbox poll worker (lease→dedup→triggerWorkflow→ack/release) replacing the removed cron-driver-server; trigger model = inbox subscription (Foreman owns the loop, the locked design). M4 (ut8n): web /automations + live inbox-visibility view. Net result: the agent authors+deploys a durable automation from chat, it's a shared workspace resource, the worker fires it on real events with at-least-once dedup, and the web surfaces runs + inbox state. Built fully on the SDK, no stability gating (bd memory zapier-sdk-commitment). Remaining: foreman-13mw (Zapier stability/roadmap touchpoint for the Tim Jones call) stays open — it's feedback, not a build blocker.","dependencies":[{"issue_id":"foreman-l7xq","depends_on_id":"foreman-13mw","type":"discovered-from","created_at":"2026-06-25T17:55:19Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-w4uo","title":"[durable][marketing] Explain trigger-inbox + durable + SDK surfaces -\u003e artifacts -\u003e marketing copy","description":"LATER (owner-requested). Deep-dive what each Zapier SDK surface IS and DOES — start with trigger-inboxes (watchTriggerInbox/lease/ack/drain, the unwalled event-subscription API), then durable runs (runDurable), durable workflows, the ./define authoring DSL, connections, tables/records. Produce reference ARTIFACTS (vault/docs explainers, diagrams) for each, then translate into MARKETING COPY for Foreman positioning ('build automations from an agentic coding tool, deploy to Zapier; multi-channel; durable runtime'; ties to the next-gen-zaps beta). Source of truth: docs/zapier-sdk-capability-map.md (live-introspected this session) + sdk-surface-sweep.ts. Discovered-from the durable removal epic foreman-bazc.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-25T18:09:05Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependencies":[{"issue_id":"foreman-w4uo","depends_on_id":"foreman-bazc","type":"discovered-from","created_at":"2026-06-25T11:09:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xjyx","title":"[zapier] Relay SDK api:deprecation_notice events to logs/users (0.79.0)","description":"SDK 0.79.0 added the DEPRECATION_NOTICE_EVENT ('api:deprecation_notice') — the SDK sniffs zapier-sdk-deprecation-* response headers and emits an event once per notice id per process. Subscribe at SDK init (generateZapierTools/createZapierSdk in zapier-sdk-tools.ts) and surface: at minimum console.warn to server logs; optionally bubble to the user via the output processor. Keeps Foreman ahead of Zapier-side deprecations instead of finding out when an endpoint breaks.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-25T16:11:48Z","created_by":"HamChowderr","updated_at":"2026-06-25T16:22:26Z","closed_at":"2026-06-25T16:22:26Z","close_reason":"Shipped: lib/zapier/deprecation.ts onZapierSdkEvent handler wired into every createZapierSdk (zapier-sdk-tools, zapier/sdk x3, connect-zapier). Logs api:deprecation_notice once per id with [zapier:deprecation] prefix + getZapierDeprecations() registry. 4 unit tests; live read tier confirms no false positives.","dependencies":[{"issue_id":"foreman-xjyx","depends_on_id":"foreman-9t9g","type":"discovered-from","created_at":"2026-06-25T09:11:47Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9t9g","title":"Bump @zapier/zapier-sdk 0.69.3 -\u003e 0.79.0 + CLI 0.54.3 -\u003e 0.60.0","description":"Both packages 21-23 releases behind (latest 2026-06-24). Carries behavior changes: triggerWorkflow output shape (0.77.0), listWorkflowRuns drops output (0.75.0), listWorkflows paginates (0.72.0), kitcore plugin-model refactor removes sdk.addPlugin chain + no-arg createSdk (0.78.0), new deprecation-notice machinery (0.79.0). More deprecated input aliases since 0.69.3 (createWorkflow is_private-\u003eprivate 0.71.1; runDurable/publishWorkflowVersion camelCase 0.73.1). Unblocks foreman-mcwn (createConnection needs \u003e=0.71).","notes":"Bumped: zapier-sdk 0.79.0, cli 0.60.0, mcp 0.16.0. Lockfile had orphan nested 0.70.4 pin under packages/agents; regenerated lockfile to dedupe to hoisted 0.79.0. Mocked suite green (352 pass/10 skip/0 fail) — 10 skips are env-gated (7 protocols + 1 api-routes need live AGENT_URL; 1 provider-swap needs PG-tier foreman-z0kn; 1 devserver-startup needs RUN_DEVSERVER_STARTUP=1), NOT bump-related. Surface sweep 0.79.0: main mcp registry 37-\u003e40 — generator now AUTO-EMITS 3 connection tools (createConnection/getConnectionStartUrl/waitForNewConnection) but UNCATEGORIZED in READ_ONLY/APPROVAL_REQUIRED; createConnection blocks up to 5min waiting -\u003e needs categorization + background-task handling (ties foreman-7am4, unblocks foreman-mcwn). New export DEPRECATION_NOTICE_EVENT + api:deprecation_notice event. Fixed sdk-surface-sweep.ts pkg resolution (was hard-coded nested path). FOLLOW-UP: capability-map doc still 0.70.4 snapshot.","status":"closed","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-25T14:40:05Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-25T14:40:55Z","closed_at":"2026-06-25T15:05:21Z","close_reason":"Bumped sdk 0.79.0 / cli 0.60.0 / mcp 0.16.0; excluded 3 in-flow connection methods from auto-gen (createConnection blocks 5min + overlaps connect_zapier; adoption deferred to foreman-mcwn); mocked suite green; sweep script fixed; capability-map doc regenerated. Committed fb50b4b.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-b8b1","title":"Evaluate createConnection() (SDK 0.71.0) vs home-grown connect.ts -- adopt vs keep","description":"SDK 0.71.0 shipped createConnection() + getConnectionStartUrl() + waitForNewConnection() -- a first-class end-to-end OAuth flow w/ browser integration. Foreman hand-rolls ~240 lines of PKCE OAuth in src/lib/zapier/connect.ts that mints the ACCOUNT-LEVEL user JWT (public PKCE client grwWZD..., scope 'internal credentials offline_access') stored in zapier_identity -- the token that authorizes the SDK on behalf of the user. KEY UNKNOWN deciding adopt-vs-keep: does createConnection() create an APP-LEVEL connection (the 'connect your Gmail' step, same noun as listConnections/getConnection) or mint the account-level user JWT? If app-level, it COMPLEMENTS rather than replaces connect.ts. NOTE: createConnection does NOT unblock durable (needs internal scope, walled -- foreman-8bh9).","acceptance_criteria":"Documented decision: what createConnection authenticates (app vs account level), whether it replaces or complements connect.ts, and a concrete action (adopt / keep / both) with follow-up issues filed.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-22T22:38:23Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-22T22:40:19Z","closed_at":"2026-06-22T22:52:14Z","close_reason":"EVALUATED on SDK 0.76.0 via type signatures + zod schema. VERDICT: createConnection() is APP-LEVEL — options {app, browser:never|auto|always, timeoutMs?, pollIntervalMs?} -\u003e {data:{id, app, title}} (same noun as listConnections/getConnection). The plugin requires an ALREADY-AUTHENTICATED sdk (depends on getConnectionStartUrl/waitForNewConnection/getApp), so it CANNOT mint the account-level user JWT. DECISION: KEEP connect.ts (mints the account user JWT — no SDK equivalent); createConnection COMPLEMENTS it for in-flow 'connect your \u003capp\u003e' OAuth UX. Adoption needs SDK bump to \u003e=0.71 (repo on 0.70.4). Follow-up filed.","dependencies":[{"issue_id":"foreman-b8b1","depends_on_id":"foreman-xb68","type":"discovered-from","created_at":"2026-06-22T15:38:23Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xfof","title":"Onboarding demo: Foreman builds a real, tailored table (approval + rendered result)","description":"Replace the onboarding Step 3 'query' demo with a 'build' demo: based on the user's selected use-case, Foreman creates a real Zapier Table (tailored name + columns + sample rows) in their connected account. The demo surfaces the approval card (user clicks Approve — teaches the safety loop), streams the tool calls, then renders the created table with its rows + an 'Open in Zapier' link. Fallback to a simulated preview if Zapier isn't connected. Test with haiku to minimize spend. Per-use-case table specs needed (Leads/Deals/Contacts/etc).","design":"Real create with approval card in the mini-chat (StepTry currently has no approval handling — must replicate the main chat's addToolApprovalResponse + approval-card flow). Tailor table to use-case. Render result rows. Haiku for test.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-20T20:38:46Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-20T20:39:00Z","closed_at":"2026-06-20T21:57:00Z","close_reason":"Built + verified live on haiku. Step 3 now creates a real, use-case-tailored Zapier Table (per-use-case build prompts), surfaces the approval card (one approval, then auto-approves the follow-up steps via toolCallId dedup), streams the tool calls, gates 'done' on rows actually added, Zapier-logo avatars. Clean after the tool-gap fix (dwq9).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4n9j","title":"Onboarding: Zapier logo in top bar + capture display name on Welcome step","description":"Onboarding top bar still used the old 'F' mark (rest of app uses the Zapier logo). And there was no name capture — signup collects only email+password (no name, no OAuth), so user_metadata.full_name was always empty and the chat greeting never had a name. Added: Zapier logo in onboarding top bar; a 'What should we call you?' name field on the Welcome step that persists to user_metadata.full_name via supabase.auth.updateUser (optional, non-blocking). This is child (c) of the ndwr greeting epic.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-20T20:21:46Z","created_by":"HamChowderr","updated_at":"2026-06-20T20:22:08Z","closed_at":"2026-06-20T20:22:08Z","close_reason":"Done + verified in browser: Zapier logo replaces the F mark in the onboarding top bar; Welcome step now has a 'What should we call you?' field that persists to user_metadata.full_name (optional). Greeting reads it.","dependencies":[{"issue_id":"foreman-4n9j","depends_on_id":"foreman-ndwr","type":"discovered-from","created_at":"2026-06-20T13:21:45Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bf0q","title":"Search should match the generated thread title (and display it on results)","description":"During live verification, searching words that appear only in the Mastra-generated thread title (e.g. 'greeting', 'consistency') returned 0 — search covered conversation.title + message content but not the thread title the sidebar now shows. Also search results displayed 'New conversation' for thread-titled convos. Fix: load the user's mastra_threads titles once, match against them, include those threads' conversations, and coalesce the result title with the cleaned thread title.","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-20T20:11:49Z","created_by":"HamChowderr","updated_at":"2026-06-20T20:12:12Z","closed_at":"2026-06-20T20:12:12Z","close_reason":"Fixed + verified live: search now loads the user's thread titles once, matches them (greeting/consistency/appreciate now return results), includes those conversations, and coalesces result titles with the cleaned thread title (results show 'Automation Assistant Initial Greeting' not 'New conversation').","dependencies":[{"issue_id":"foreman-bf0q","depends_on_id":"foreman-pphw","type":"discovered-from","created_at":"2026-06-20T13:11:49Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7yha","title":"Sidebar conversation titles always show 'New conversation'","description":"generateTitle writes a title to the Mastra thread (mastra_threads.title) — the chat header reads it, but the sidebar list (GET /conversations) only returned conversation.title (never populated) so every item showed 'New conversation'. Also the generated titles were noisy (markdown '#', '**Title:**' labels, occasional full-response text). Fix: list endpoint batch-coalesces conversation.title with the cleaned thread title; GET /:id precedence corrected (user rename \u003e generated); added cleanTitle() to strip markdown/Title:/quotes and cap length; tightened generateTitle instructions (plain text, no markdown, don't answer).","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-20T19:34:39Z","created_by":"HamChowderr","updated_at":"2026-06-20T19:34:58Z","closed_at":"2026-06-20T19:34:58Z","close_reason":"Fixed: sidebar list now coalesces conversation.title with cleaned Mastra thread title (batched mastra_threads query); GET /:id precedence = rename\u003egenerated; cleanTitle() strips markdown/Title:/quotes + caps length; generateTitle instructions tightened. Verified live: sidebar shows real titles ('Automation Assistant Initial Greeting', 'Brief Greetings Exchange', etc.).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4jbc","title":"Sidebar reads as out-of-place grey/black slab with hard divider","description":"In every theme preset the sidebar rendered as a distinct grey slab (its own --sidebar token, a few % off --background) with a near-black border-r divider (Tailwind v4 border-r with no color falls back to currentColor = dark foreground). User: 'out of place / black / doesn't bend.' Fix: derive --color-sidebar from --background so it blends into the canvas in every preset+mode; remove the sidebar border-r so the floating chat card's own border is the only separator.","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-20T19:26:23Z","created_by":"HamChowderr","updated_at":"2026-06-20T19:26:45Z","closed_at":"2026-06-20T19:26:45Z","close_reason":"Fixed: --color-sidebar now derives from --background (blends in every preset+mode, verified bg-sidebar===bg-background across sunset-glow/underground/rose-garden/tangerine + dark); removed sidebar border-r divider (was currentColor near-black). Verified live in browser.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pphw","title":"[feature] Search through conversations","description":"User wants to search across conversations from the sidebar. Today there's a chat history list (paginated) but no search. Options: client-side filter over loaded titles (quick) vs server-side search endpoint over conversation titles + message content (proper; agent route + index). Scope TBD with user.","notes":"Implemented + committed (7035f00). Server-side debounced search over conversation titles + mastra_messages content (scoped by resourceId), merged/deduped, snippet per result. PostgREST access to mastra_messages verified (200 + content ilike + 13 'hello' matches). Static-verified tsc/biome. Live HTTP+UI loop awaiting user test (browser ext down).","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-20T17:09:17Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-20T19:57:43Z","close_reason":"Implemented + committed (7124559 archive, 7035f00 search); backend/DB/PostgREST verified. Live UI click-through still offered as a confidence check.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9jlg","title":"[feature] Archive conversations (in addition to delete)","description":"User wants to archive conversations, not just delete. Today the sidebar history supports delete. Archive = a non-destructive hide: needs a conversation.archived_at (or status) column + migration, an Archive action in the sidebar-history item menu (alongside Delete), filtering archived out of the default list, and an 'Archived' view/section to restore. Cross-check agent /conversations routes for list/update.","notes":"Implemented + committed (7124559). Migration 20260620000000 applied non-destructively to local DB (archived_at col + partial index, verified in psql). Agent GET ?archived filter + PATCH {archived} toggle; web /api/history passthrough; sidebar Archive/Unarchive menu item (optimistic + Undo toast) + on-demand Archived section. Static-verified: web tsc 0 err, biome clean. Live UI loop NOT yet verified — browser extension timing out; awaiting user quick test.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-20T17:09:11Z","created_by":"HamChowderr","updated_at":"2026-06-20T19:57:43Z","started_at":"2026-06-20T18:39:00Z","closed_at":"2026-06-20T19:57:43Z","close_reason":"Implemented + committed (7124559 archive, 7035f00 search); backend/DB/PostgREST verified. Live UI click-through still offered as a confidence check.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jbtq","title":"Settings -\u003e Profile: set display name (user_metadata.full_name)","description":"Add a Profile settings section so users can set a display name, stored in Supabase user_metadata.full_name via supabase.auth.updateUser. Feeds the chat greeting (foreman-1k9u). New: app/settings/profile/page.tsx + components/settings/profile-form.tsx; add 'Profile' to settings-shell NAV; thread name into auth.ts SessionUser.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T16:59:21Z","created_by":"HamChowderr","updated_at":"2026-06-20T17:08:04Z","closed_at":"2026-06-20T17:08:04Z","close_reason":"Profile settings section live (/settings/profile): display-name input -\u003e supabase.auth.updateUser({data:{full_name}}); feeds the greeting. Verified page renders with input/Save/nav. User sets their own real name.","dependencies":[{"issue_id":"foreman-jbtq","depends_on_id":"foreman-ndwr","type":"discovered-from","created_at":"2026-06-20T09:59:21Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1k9u","title":"Chat greeting: time-of-day + first name (display)","description":"Replace static 'What can I help with?' heading with a personalized time-based greeting ('Good morning/afternoon/evening, \u003cFirst\u003e' / 'Welcome back' late-night), keeping 'What can I help with?' as subtext. Read first name client-side from supabase user_metadata (full_name/name/given_name); graceful fallback to no-name greeting when absent. greeting.tsx becomes a client component using @/lib/client getUser in useEffect (no SSR hydration mismatch).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T16:50:15Z","created_by":"HamChowderr","updated_at":"2026-06-20T16:53:45Z","closed_at":"2026-06-20T16:53:45Z","close_reason":"Greeting shows time-based + first name from user_metadata with graceful no-name fallback. Verified live ('Good morning' at 9am, no-name fallback since current account has no metadata name).","dependencies":[{"issue_id":"foreman-1k9u","depends_on_id":"foreman-ndwr","type":"discovered-from","created_at":"2026-06-20T09:50:15Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ndwr","title":"[epic] Personalized chat greeting + user display name (storage, settings, onboarding)","description":"User wants the chat empty-state to greet by first name + time of day ('Good morning, \u003cName\u003e' / 'Welcome back, \u003cName\u003e'). Today greeting.tsx is static 'What can I help with?'. Findings: Foreman user table has NO name field; only user_metadata.avatar_url is read. Proposed storage = Supabase user_metadata.full_name (no migration; set via supabase.auth.updateUser). Children: (a) greeting display — time-based + first name from metadata, graceful fallback when absent; (b) Settings -\u003e Profile section to set display name (updateUser); (c) onboarding step to capture name; (d) thread name through auth.ts SessionUser + chat layout.","notes":"VERIFY: all 4 parts checked in source. (a) greeting.tsx — time-of-day buckets + firstNameFrom(full_name/name/given_name/first_name), clean fallback (no name -\u003e bare greeting + 'What can I help with?', no 'undefined'). (b) settings/profile-form.tsx — loads + saves full_name via updateUser, dirty-tracked. (c) step-welcome.tsx — writes full_name to user_metadata. (d) SessionUser threading NOT done but MOOT — greeting reads metadata directly client-side; SessionUser carries only id/email/image. Children 1k9u/4n9j/jbtq all closed + confirmed.","status":"closed","priority":2,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-20T16:48:33Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-20T16:50:19Z","closed_at":"2026-06-20T22:24:18Z","close_reason":"Greeting + Settings + onboarding all shipped and verified in code. Epic part (d) (name on SessionUser) superseded — greeting reads user_metadata.full_name directly client-side, so SessionUser threading wasn't required. Children 1k9u/4n9j/jbtq closed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-r36j","title":"[feature] Context-window usage indicator in the chat composer (AI Elements Context)","description":"User wants a 'context in the chat bar' — a token/context-window usage indicator in the composer. Vercel AI Elements has a Context component (used/max tokens, % gauge, optional cost). Project ai-elements/ does NOT have it yet. Work: (1) add the Context AI Element (npx ai-elements add context; likely pulls tokenlens for model window sizes); (2) surface token usage + model context-window from the chat stream — the Mastra agent /chat SSE must emit usage (totalUsage) so useChat exposes it; (3) place it in prompt-input/multimodal-input toolbar. Verify model id -\u003e window-size mapping for the Foreman models.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-20T16:48:29Z","created_by":"HamChowderr","updated_at":"2026-06-20T18:37:11Z","closed_at":"2026-06-20T18:37:11Z","close_reason":"Context gauge confirmed rendering live + accurate. 16% on fresh haiku chat = ~32k tokens = system prompt + tool catalog floor, matches verified backend totalTokens 31872.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mcla","title":"Landing: lock brand tokens to Foreman orange (presets washed out accent)","description":"Landing uses accent/text-accent/variant=accent for brand elements. Theme presets repurpose --accent as a light neutral and move the brand to --primary, so logged-in users with a preset see washed-out brand (Connect Zapier button, 'chat driver' badge, 'Drive the one...' heading, Builder-vs-driver badge). User chose: keep the home page on the fixed Foreman orange regardless of the in-app theme. Fix: .landing-brand-lock class re-pins --primary/--accent/--ring to orange on the landing root.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T16:45:06Z","created_by":"HamChowderr","updated_at":"2026-06-20T16:46:57Z","closed_at":"2026-06-20T16:46:57Z","close_reason":"Added .landing-brand-lock (re-pins --primary/--accent/--ring to Foreman orange, light+dark) on the landing root. Verified live under sunset-glow: brand elements render vivid orange again.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-nwpf","title":"Home page: replace the 'F' Foreman mark with the Zapier logo (nav + footer)","description":"The landing page still shows a legacy 'F'-in-accent-box brand mark in the top nav (site-nav.tsx ~L26) and the footer (site-footer.tsx ~L48). User wants the F sign gone entirely and the Zapier asterisk (/zapier.svg) used instead, matching the sidebar/dashboards brand. Keep the 'Foreman' wordmark + Alpha badge.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:46:46Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:48:54Z","closed_at":"2026-06-20T05:48:54Z","close_reason":"Replaced the 'F' accent-box mark in site-nav.tsx + site-footer.tsx with the Zapier asterisk (/zapier.svg). Verified: nav/footer render the zapier img (computed 24x24, loaded), no 'F' boxes remain. Brand wordmark + Alpha badge kept.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ltnn","title":"SlashCommandMenu -\u003e ui/Command (cmdk); SuggestionDialog -\u003e ui/Dialog","description":"chat/slash-commands.tsx hand-builds a command palette (filter + manual keyboard nav, no role=listbox/aria-selected) — ui/command.tsx (cmdk) already powers the model selector. chat/suggestion.tsx SuggestionDialog is a hand-rolled modal (custom backdrop, no focus-trap/Esc/scroll-lock) -\u003e ui/dialog.tsx. Both are real a11y wins.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:15Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-ltnn","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:15Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-sx4f","title":"Chat artifact/document subsystem: raw button -\u003e ui/Button, rename input -\u003e ui/Input","description":"Artifact/document controls hand-roll Button variants: chat/version-footer.tsx (prev/next/diff/restore/latest), artifact-actions.tsx, artifact-close-button.tsx, document.tsx (2 card triggers), multimodal-input.tsx (cancel). Also sidebar-history-item.tsx rename field -\u003e ui/input.tsx (+aria-label). Note: cursor-pointer typo in document.tsx already fixed separately.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:10Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-sx4f","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:10Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-33w6","title":"Settings/workflows/onboarding: raw button/input/checkbox/toggle -\u003e ui primitives","description":"These slices hand-roll form controls with inline styles. Swap: raw \u003cbutton\u003e -\u003e ui/button.tsx and raw \u003cinput\u003e -\u003e ui/input.tsx in settings/mcp-page, settings/channel-connect-page, workflows/workflow-detail-actions (rename input + 5 buttons), onboarding/step-connect. Also: enable/disable toggle in workflows/trigger-controls -\u003e ui/switch.tsx; native checkbox in editor/tools-picker -\u003e ui/checkbox.tsx.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:03Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-33w6","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:03Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-zo1e","title":"Standardize status pills on ui/Badge","description":"'Connected'/'Coming soon'/draft/published/archived pills are hand-rolled 3+ ways: settings/integrations-hub, settings/channel-connect-page, workflows/[id] StatusBadge, editor/version-history-panel, editor/editor-sidebar-agents. ui/badge.tsx already used for this exact purpose in agent-list-view/agent-editor — make the rest match.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:11:59Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-zo1e","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:11:58Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wyhs","title":"Standardize error feedback on ui/Alert across the app","description":"Errors are hand-rolled ~6 ways (red \u003cp\u003e/\u003cdiv\u003e/\u003cspan\u003e inline colors, no role=alert): auth forms x3, chat/message.tsx x3, workflows/trigger-controls + workflow-detail-actions, onboarding/step-connect, app/dashboards/page.tsx. settings/mcp-page.tsx surfaces NO error UI at all (silent createKey/revokeKey failures). Consolidate on ui/alert.tsx (variant=destructive) + add missing error states.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:11:54Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-wyhs","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:11:53Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-to5b","title":"[epic] UI consistency: adopt vendored shadcn primitives across the app","description":"Audit (3 parallel readers, 2026-06-20) found the app splits cleanly: chat core, ai-elements/, auth forms, dashboard renderer, and landing are primitive-first and clean. Gaps cluster in settings/, workflows/, onboarding/, and the chat artifact/document subsystem, which hand-roll buttons/inputs/alerts/badges/empty-states/skeletons with inline styles instead of using the 55 vendored ui/ primitives. This epic tracks bringing those onto the design system. Net effect: consistent focus/disabled/a11y states, themeable (no inline hex), testable (no native confirm()).","status":"closed","priority":2,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:11:10Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-20T05:35:57Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9m7h","title":"Move Settings out of sidebar nav into the bottom-left user menu","description":"User wants the Settings entry removed from the left sidebar nav (Workflows/Dashboards/Settings group) and relocated into the bottom-left user dropdown (SidebarUserNav), alongside theme toggle / color theme / sign out. Links to /settings/integrations.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-20T04:56:48Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:03:15Z","started_at":"2026-06-20T04:56:58Z","closed_at":"2026-06-20T05:03:15Z","close_reason":"Implemented + visually verified in browser (default/sunset-glow theme). hkfg: chat title on left + visibility control pushed right (title plumbed via /api/messages -\u003e use-active-chat -\u003e ChatHeader). sinf: removed New-chat resting border (false-active), unified nav heights h-8, bumped header-\u003enav spacing pt-2. cbzv: shadow-sm on card (canvas oklab L 0.940 vs card 0.982, plus shadow = clear float). 9m7h: Settings moved from sidebar nav into bottom-left user dropdown -\u003e /settings/integrations (route verified loading).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hkfg","title":"Chat container: more defined/rounded outline + fix share-icon crowding","description":"User feedback: the chat outline can be more defined and rounded; the chat header/title is too close to the share icon (the private/public visibility control). Tighten the chat container border-radius/border and add spacing between the title and the share/visibility control. Files: components/chat-pane.tsx / chat header component. Verify visually.","notes":"UPDATE: the chat-container outline/rounding is DONE via the floating-card surface (11ef88c) — conversation is now a rounded bordered card with a gap. REMAINING (the header polish): the in-card header is sparse (just the share/visibility control floating at the left). Add the conversation TITLE and move the share/visibility control to the RIGHT with proper spacing (fixes the 'too close to the share icon' crowding). chat-header.tsx + visibility-selector.tsx.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-19T20:53:10Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:03:15Z","closed_at":"2026-06-20T05:03:15Z","close_reason":"Implemented + visually verified in browser (default/sunset-glow theme). hkfg: chat title on left + visibility control pushed right (title plumbed via /api/messages -\u003e use-active-chat -\u003e ChatHeader). sinf: removed New-chat resting border (false-active), unified nav heights h-8, bumped header-\u003enav spacing pt-2. cbzv: shadow-sm on card (canvas oklab L 0.940 vs card 0.982, plus shadow = clear float). 9m7h: Settings moved from sidebar nav into bottom-left user dropdown -\u003e /settings/integrations (route verified loading).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-82vf","title":"Chat header: proper model selector (Vercel AI Elements) replacing 'Foreman + star'","description":"Chat header currently shows a static 'Foreman' label with a star icon instead of a real model selector. User wants a proper model selector built from Vercel AI Elements. Locate the chat header component, wire a model dropdown. Confirm with user which models to expose (foreman agent is fixed to sonnet 4.6 server-side; selector may be cosmetic/future or pick agent personas).","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-19T20:53:05Z","created_by":"HamChowderr","updated_at":"2026-06-20T04:42:20Z","closed_at":"2026-06-20T04:42:20Z","close_reason":"Done — real multi-model selector shipped (eca1ba8); model-selector cards spaced out (44a9fb8).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-sinf","title":"Chat UI polish: sidebar borders/spacing + false-hover states","description":"User feedback: (1) sidebar nav options borders/spacing can be improved; (2) items appear hovered/active when they are NOT hovered (likely default vs data-[active] state styling in SidebarMenuButton); (3) the header icon (MessageSquare/PanelLeft) above the New chat nav group is not spaced properly above the nav options (SidebarHeader pt-3 pb-0 vs SidebarGroup pt-1). Files: components/chat/app-sidebar.tsx, components/ui/sidebar.tsx. Verify visually in browser.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-19T20:53:00Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:03:15Z","closed_at":"2026-06-20T05:03:15Z","close_reason":"Implemented + visually verified in browser (default/sunset-glow theme). hkfg: chat title on left + visibility control pushed right (title plumbed via /api/messages -\u003e use-active-chat -\u003e ChatHeader). sinf: removed New-chat resting border (false-active), unified nav heights h-8, bumped header-\u003enav spacing pt-2. cbzv: shadow-sm on card (canvas oklab L 0.940 vs card 0.982, plus shadow = clear float). 9m7h: Settings moved from sidebar nav into bottom-left user dropdown -\u003e /settings/integrations (route verified loading).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-v2i1","title":"Reconsider 'Delete all chats' placement in sidebar","description":"Delete all is a destructive permanent action (DELETE /api/history wipes every conversation) sitting as a always-visible primary sidebar item (app-sidebar.tsx:147-158), right under New chat/Workflows/Settings. User questioned why it is there. Proposal: remove from the primary nav and keep it as the /purge slash command (already exists) and/or move to settings or the user-nav menu. Decide with user.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-19T20:52:54Z","created_by":"HamChowderr","updated_at":"2026-06-19T21:34:59Z","closed_at":"2026-06-19T21:34:59Z","close_reason":"Removed Delete all from sidebar nav; /purge slash command retained. Verified in browser.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gw5n","title":"mastra dev incremental rebuild crashes on hot-reload (Windows)","description":"On packages/agents, mastra dev's incremental rebuild crashes on nearly every file save with ERR_MODULE_NOT_FOUND (Cannot find package @/lib imported from .mastra/output/index.mjs) or 'generateZapierTools is not defined'. The server then crash-loops on the bad bundle. Workaround that reliably recovers: stop dev, rm -rf packages/agents/.mastra/output, restart via infisical run. Slows iteration significantly. Investigate the bundler alias/incremental-cache handling (rollup @/ alias on partial rebuilds).","notes":"REPRO + WORKAROUND confirmed 2026-06-20: adding a NEW source file (lib/dashboards/share.ts) while mastra dev runs breaks the incremental rebuild — ALL routes then 500 with 'Cannot find package @/lib imported from .mastra/output/index3.mjs' (the alias isn't re-resolved in the stale bundle). Editing existing files hot-reloads fine; NEW files are the trigger. Fix (no code change): kill the mastra dev tree + 'rm -rf .mastra/output' + relaunch. Clean rebuild resolves @/ aliases and the server is healthy (~12s).","status":"open","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T19:29:21Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:55Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ej41","title":"Delete dead Vercel canvas/artifacts scaffolding (careful refactor)","description":"Research flagged web canvas/artifacts (web/src/artifacts/*, chat/{artifact*,document*,create-artifact,data-stream-handler,version-footer,toolbar,text-editor,code-editor,suggestion}.tsx, hooks/use-artifact, Document/Vote/Suggestion stub types in lib/db/schema.ts) as DEAD: /api/document route doesn't exist (404s), no DB table/migration, no agent tool emits documents. User approved deletion (2026-06-19). CAUTION: my own grep shows it's woven across ~35 files into the WORKING chat render path (shell.tsx mounts \u003cArtifact\u003e; messages/message render document-preview/artifact-actions; data-stream-handler wired in chat). NOT a blind rm — trace every importer, strip the mount+wiring from chat, delete files, then VERIFY chat still renders + web builds before calling done. Frees the 'Artifact' name for the new agent-server artifact model.","notes":"CORRECTED PLAN (2026-06-27, supersedes sub-agent's): the data-stream is NOT artifact-only — it's LIVE shared infra. data-stream-provider + use-auto-resume.ts (reads dataStream to resume) + use-active-chat onData/setDataStream MUST STAY. data-stream-handler.tsx handles data-chat-title (live sidebar title) + drains the stream, alongside dead artifact deltas → SIMPLIFY it (keep data-chat-title + drain, strip artifactDefinitions/useArtifact imports), do NOT delete. message.tsx: KEEP data-preview-progress (line 261) + tool-preview_app (line 336) branches (LIVE preview) + useDataStream; REMOVE only the dead tool-createDocument/updateDocument/requestSuggestions branches + DocumentPreview/DocumentToolResult imports. Vote IS dead (no /api/vote) → remove Vote type + vote UI in message-actions + the votes SWR in use-active-chat. SAFE TO DELETE (pure artifact): src/artifacts/* (actions, text/code/image/sheet client), components/chat/{artifact,artifact-actions,artifact-close-button,create-artifact,document,document-preview,document-skeleton,version-footer,toolbar,text-editor,code-editor,image-editor,sheet-editor,suggestion,diffview,console}.tsx, hooks/use-artifact.ts; lib/editor/* (only used by text-editor). schema: remove Document/Suggestion/Vote types. EXECUTE as a focused effort: un-wire shell.tsx (Artifact mount + useArtifact) → simplify data-stream-handler → message.tsx dead branches → vote removal → delete files → tsc + RUN chat (verify preview/auto-resume/title still work). Partial progress this session: removed 28 unrelated orphan files (22 unused shadcn ui + 6 others) + integrated Fallow.","status":"in_progress","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T18:43:22Z","created_by":"HamChowderr","updated_at":"2026-06-28T01:19:02Z","started_at":"2026-06-28T01:11:04Z","dependencies":[{"issue_id":"foreman-ej41","depends_on_id":"foreman-xl8m","type":"discovered-from","created_at":"2026-06-19T11:43:22Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-sjyc","title":"Dashboards Phase 3: public sharing (dashboard_share token, /dashboards routes, public page)","description":"dashboard_share table (share_token unique, dashboard_id, user_id, expires_at). New routes/dashboards.ts: private CRUD + POST :id/share; public GET /dashboards/public/:shareToken (no authMiddleware, validate token, return spec+snapshot). Register in routes/index.ts + add /dashboards to CUSTOM_ROUTE_PREFIXES in mastra/index.ts. web app/d/[shareToken]/page.tsx ISR reusing DashboardRenderer.","notes":"VERIFY: unit dashboards-share.test.ts (8 pass: ownership-gate, expiry, owner-scoped revoke) + integration api-routes (3: public 200 w/o auth, unknown 404, share 401) on the REAL @/routes/index app. next build green; biome clean. LIVE smoke on restarted 4111 (clean rebuild fixed gw5n): GET /dashboards/public/faketoken -\u003e 404 (route ran, auth bypassed); artifacts/share/shares no-auth -\u003e 401. Carve-out confirmed. NOT done live: full browser e2e with a real artifact (none exists; needs Phase1 snapshot + Phase2 create-dashboard first) — DashboardRenderer + page render covered by next build.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T17:01:05Z","created_by":"HamChowderr","updated_at":"2026-06-20T23:37:24Z","started_at":"2026-06-20T22:48:08Z","closed_at":"2026-06-20T23:37:24Z","close_reason":"Phase 3 public sharing shipped (c868ed4) + verified (unit 8, integration 3, next build, live auth-carveout smoke: public 404 no-auth / private 401).","dependencies":[{"issue_id":"foreman-sjyc","depends_on_id":"foreman-c0p5","type":"discovered-from","created_at":"2026-06-19T10:01:04Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-sjyc","depends_on_id":"foreman-xl8m","type":"blocks","created_at":"2026-06-19T10:01:17Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xl8m","title":"Dashboards Phase 2: dashboard table + spec zod schema + create-dashboard tool + web DashboardRenderer + in-app view","description":"dashboard table (spec jsonb, visibility, user_id/workspace_id). zod spec schema in lib/validation.ts (blocks: kpi|table|chart). New agent tool create-dashboard.ts (sets poll trigger, builds spec, stores row) registered in foreman.ts (NO strict:true). web components/dashboard/dashboard-renderer.tsx mapping spec-\u003eui/chart.tsx(recharts)/react-data-grid/shadcn. app/dashboards list + [id] embedded view via /api proxy.","notes":"RE-SCOPED (user decision 2026-06-19): ARTIFACT-SHAPED FOUNDATION. Store as 'artifact' table (kind='dashboard'), discriminated-union spec; build dashboard kind ONLY now, generalize later. Zod spec schema in lib/validation.ts = security boundary (validate field refs vs snapshot columns; format enums currency/percent/date; no html/url/onClick; caps; .strict()). create-dashboard agent tool writes spec server-side (NO strict:true). Wire /dashboards to read stored artifact by id; keep defaultSpecFromRecords as fallback. Renderer slice DONE+verified live (commit 9329345).","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T17:01:01Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-19T18:09:58Z","closed_at":"2026-06-19T22:51:41Z","close_reason":"Done: dashboard table + spec zod schema + create-dashboard tool + DashboardRenderer + in-app /dashboards view all built and merged; the /dashboards route 500 (missing CUSTOM_ROUTE_PREFIXES entry) fixed and verified (401 JSON). Sidebar now links Dashboards.","dependencies":[{"issue_id":"foreman-xl8m","depends_on_id":"foreman-gnr0","type":"blocks","created_at":"2026-06-19T10:01:13Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-xl8m","depends_on_id":"foreman-c0p5","type":"discovered-from","created_at":"2026-06-19T10:01:01Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-gnr0","title":"Dashboards Phase 1: app_data_snapshot table + poll-driven append-only refresh + read endpoints","description":"Migration for append-only app_data_snapshot (user_id, workspace_id?, app_key, source_config jsonb, records jsonb, row_count, refreshed_at; index user_id,app_key,refreshed_at DESC). Regenerate db:types. Add snapshot-save (INSERT, not upsert) step to zapier-poll-provider.ts after the runAction read. Read endpoints: GET latest + ?history/since for trends. Reuse workflow_trigger(type poll) + cron-driver-server; reads need no approval.","notes":"Poll wiring done: PollConfig.snapshot flag; pollOne saves full record set to app_data_snapshot each cycle (append-only, best-effort, additive to workflow firing). Lint + 308 tests green. REMAINING P1: read endpoint (latest + ?history/since) + unit test for snapshot lib.\nP1 COMPLETE: read endpoint added (routes/dashboards.ts → GET /dashboards/snapshots/:appKey, latest + ?history/\u0026since/\u0026limit), registered in routes/index.ts (dynamic mount, no prefix-list needed). Unit test tests/unit/dashboards-snapshot.test.ts (8 tests: save row-shape/defaults/error, latest parse/null/corrupt-json, history series/since/empty). Full suite 316 pass, Biome clean, new files typecheck clean.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T17:00:58Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-19T17:01:25Z","closed_at":"2026-06-19T17:43:59Z","close_reason":"Phase 1 shipped: app_data_snapshot migration (applied), snapshot lib (save/getLatest/getHistory), poll-provider append-only snapshot wiring, read endpoint (GET /dashboards/snapshots/:appKey + history), 8 unit tests. 316 suite green.","dependencies":[{"issue_id":"foreman-gnr0","depends_on_id":"foreman-c0p5","type":"discovered-from","created_at":"2026-06-19T10:00:57Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-c0p5","title":"EPIC: Foreman data dashboards (pull connected-app data → generate, embed + share)","description":"Let a Foreman user (technical or non-technical) turn connected-app data (HubSpot/Airtable leads, etc.) into a dashboard that's embedded in-app and shareable via a public URL — no code, no hosting. Spec-driven (agent emits JSON spec; web renderer composes installed shadcn/recharts/react-data-grid). Stored snapshot (append-only Postgres). Plan: C:/Users/HamCh/.claude/plans/delightful-meandering-fog.md","status":"closed","priority":2,"issue_type":"epic","owner":"admin@otakusolutions.io","created_at":"2026-06-19T17:00:29Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-21T03:39:42Z","close_reason":"EPIC complete — all 4 dashboards phases shipped + verified.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5xih","title":"Seed app catalog into local Postgres (app_catalog empty -\u003e app search returns nothing locally)","description":"Local app_catalog has 0 rows, so catalog semantic search returns nothing until seeded. Run 'npm run catalog:seed' (fetches Zapier catalog + embeds via fastembed at 384d). Heavy op (needs Zapier creds + embeds many apps). Not required for core chat; needed for app-discovery features locally.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T09:08:12Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependencies":[{"issue_id":"foreman-5xih","depends_on_id":"foreman-1fjd","type":"discovered-from","created_at":"2026-06-19T02:08:12Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1fjd","title":"Verify local dev setup is complete + correct (fastembed, embeddings, vector, etc.)","description":"User wants confirmation that everything for LOCAL dev is set up correctly — fastembed (local embeddings), PgVector, RAG indexing, env vars, and any other local-only services. Audit the local stack and report gaps.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T08:46:54Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE (verify): fastembed bge-small 384-dim + PgVector + catalog_vectors all present/correct.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-f6s4","title":"Color theme presets render too light/washed-out when applied","description":"User reports colors in the color-theme selector (sidebar user-nav \u003e Color theme) are very light. Applied light presets (Lake View oklch 0.765, Underground/Forest Whisper low-chroma) + the subtle 3-7pct surface color-mix in globals.css @theme inline produce near-white, low-contrast UIs. Need user direction on scope (darken presets vs strengthen tinting vs swatch visibility) before changing colors. Files: app/globals.css, lib/theme-presets.ts","notes":"Global pass DONE (verified in browser): (1) tint strength bumped in globals.css @theme inline — bg 3-\u003e4, card/popover 5-\u003e8, secondary 7-\u003e12, muted 7-\u003e10, accent 20-\u003e25, border/input 10-\u003e16, sidebar 4-\u003e7pct — presets now visibly recolor UI (ocean-breeze shows clear blue, was near-white). (2) default light neutrals deepened: --muted-foreground #6b7280-\u003e#52525b, --border/--input #e5e7eb-\u003e#d4d4d8. (3) swatch dots size-3-\u003e3.5 + contrast ring. PENDING user review: per-preset darkening of pale presets (Lake View oklch 0.765 is the worst; Underground/Forest low-chroma) — holding for user to confirm which, to avoid blind palette rework.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-19T08:46:49Z","created_by":"HamChowderr","updated_at":"2026-06-19T09:07:51Z","closed_at":"2026-06-19T09:07:51Z","close_reason":"Theme refinement done+verified: (a) global tinting/neutrals/swatches; (b) normalized 3 washed-out presets — Lake View oklch 0.765-\u003e0.62, Underground chroma 0.069-\u003e0.15, Forest Whisper chroma 0.107-\u003e0.15, with matching swatch values in theme-presets.ts. Verified in browser. Biome clean.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jmuu","title":"Homepage Toolbox search (ToolDiscovery) too faint/washed-out","description":"On the homepage 'Every action. Every table.' section: unmatched tool chips render at opacity 0.35 + text-foreground/50 (~17pct effective) and matched/typing chips at 0.45 — nearly invisible. The left checklist checkmarks use a faint bg-accent/10 circle. User wants the actions + checkmarks darker/more defined, esp. on mobile. Files: components/landing/demos/tool-discovery.tsx, components/landing/sections/tool-discovery-section.tsx","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-19T08:46:44Z","created_by":"HamChowderr","updated_at":"2026-06-19T08:56:22Z","closed_at":"2026-06-19T08:56:22Z","close_reason":"Toolbox contrast fixed: unmatched chips opacity 0.35-\u003e0.6 + text/50-\u003e/70 + border-border; checklist checkmarks now solid accent circle w/ white check. Verified at desktop, opacity-based so mobile matches. Biome clean.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-py1n","title":"Improve mobile responsiveness of Foreman web UI","description":"Several parts of the web frontend (chat shell, sidebar, message composer, approval cards, etc.) are not optimized for mobile viewports. Audit on real mobile viewport sizes via the agent browser and fix layout/sizing/overflow issues.","notes":"Homepage mobile fixes done+verified (Chrome agent browser at mobile-base breakpoint): channels.tsx grid-cols-3 -\u003e grid-cols-2 sm:grid-cols-3; tool-discovery.tsx grid-cols-3 -\u003e grid-cols-2 (long tool names were truncating); site-nav.tsx px-6 -\u003e px-4 sm:px-6. Both grids confirmed 2-col via computed styles; no horizontal overflow; biome clean. Chat suggested-actions left as-is (intentional horizontal carousel on mobile). Remaining optional: full sweep of authed app surfaces.\nUser approved FULL APP SWEEP. Surfaces to cover: chat thread (bubbles/code/approval cards/composer/sidebar), settings + settings/integrations/*, workflows + [id] + runs, editor. Method: per-surface runtime diagnostic (overflow scan + multi-col grid check + nowrap-wide) then fix confirmed offenders only.\nFULL SWEEP COMPLETE. Fixed: (1) homepage channels+tool-discovery grids 3-\u003e2 col, nav padding; (2) settings-shell.tsx now stacks nav rail above content on mobile (flex-col md:flex-row, horizontal scrollable nav, px-8/px-10 -\u003e responsive px-4); (3) dev-console.tsx w-[600px] -\u003e w-[min(100%,600px)] (dev-only, prevents narrow-viewport overflow). Verified clean (no overflow, no bad grids, biome): chat empty-state, chat thread components (code analysis - min(100%,X)/max-w patterns are mobile-safe; chat agent's 'critical' findings were false positives misreading min(100%,500px)), editor list+detail/[id], settings + all sub-pages (mcp/telegram), workflows list+detail code. All changes scoped to \u003c640px, no desktop regression. NOTE: changes UNCOMMITTED pending user OK.\nVERIFY (this session, Chrome agent browser live-DOM): homepage channels grid renders 'grid grid-cols-2 sm:grid-cols-3' (2-col base, 3-col \u003e=640); /settings live shell='flex flex-1 flex-col md:flex-row', nav='flex flex-row md:flex-col gap-1 overflow-x-auto', 0 horizontal-overflow offenders. NOTE: extension pins render viewport at 1920 so no true mobile screenshot — verified via applied classes + controlled live-DOM overflow measures (same method prior session used). Fixes committed 998a6a3 + c67333c. Only open child sse0 closed (321d6c3).","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T07:58:29Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-19T07:58:40Z","closed_at":"2026-06-20T22:42:29Z","close_reason":"Mobile sweep complete + committed (998a6a3 homepage grids/nav/dev-console width; c67333c settings-shell stack). Live-DOM verified this session: responsive classes applied, 0 overflow on settings. Stale 'UNCOMMITTED' note superseded — changes are in main tree. Child sse0 fixed+closed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-aj6m","title":"Delete conversation: wrong endpoint (404) + navigates to landing","description":"Frontend handleDelete (sidebar-history.tsx) DELETEs to /api/chat?id= which does NOT exist (only /api/history exists) -\u003e 404 -\u003e row never deleted -\u003e reappears on revalidation. Also router.replace('/') sends user to marketing landing. FIX: DELETE to agents ${agentUrl}/conversations/:id with auth (like Rename), optimistic mutate with revalidate:false, navigate to /chat not /. Also noted: 'Delete all' button hits no-op /api/history DELETE (same class, still broken).","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-18T18:47:20Z","created_by":"HamChowderr","updated_at":"2026-06-18T20:29:46Z","closed_at":"2026-06-18T20:29:46Z","close_reason":"Completed this session (commit ffc4837).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bk69","title":"Sidebar nav renders as solid-filled brand pills (data-active presence-match bug)","description":"app-sidebar nav items (New chat/Workflows/Settings/Delete all) rendered as solid saturated-colored pills at rest. Root cause: ui/sidebar.tsx sidebarMenuButtonVariants used Tailwind presence-form data-active:bg-sidebar-accent, but SidebarMenuButton renders data-active={isActive} with isActive=false default -\u003e data-active='false' attribute is PRESENT -\u003e presence variant fires on every inactive button. Template worked around it on history items (data-active:bg-transparent) but not nav items. Compounded by theme presets defining --sidebar-accent as a saturated brand color (shadcn expects a subtle hover gray). FIX: changed CVA to value-form data-[active=true]: (canonical shadcn). Verified: nav now clean ghost rows. Aligns with user's sidebar-07 preference.","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-18T17:42:30Z","created_by":"HamChowderr","updated_at":"2026-06-18T17:42:41Z","closed_at":"2026-06-18T17:42:41Z","close_reason":"Fixed: ui/sidebar.tsx CVA changed data-active: -\u003e data-[active=true]:. Nav now renders clean ghost rows, verified in browser.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-fkoh","title":"Color theme presets: tint main chat surfaces, not just sidebar nav","description":"The bottom-left color theme switcher works (tokens change on \u003chtml\u003e) but only visibly repaints the left sidebar nav buttons + focus rings. The whole center conversation area (background, cards, input, message bubbles, history rows) stays neutral near-black across every preset because presets only saturate --primary/--ring/--sidebar-*/--chart-*, leaving --background/--card/--muted/--border neutral. Also a default-vs-preset inconsistency: default --accent is brand orange, every preset --accent is neutral gray. Make the preset hue reach the surfaces the user actually looks at: subtle brand tint on elevated surface tokens via @theme inline color-mix, plus targeted --primary on send button, user message bubble, active conversation row, suggested-card hover.","notes":"Implemented bolder surface tinting (user chose 'tint surfaces'). 6 edits: (1) globals.css @theme inline surface tokens color-mix toward --primary [bg 3%, card/popover 5%, secondary/muted 7%, accent 20%, border/input 10%, sidebar 4%] - one DRY change auto-scales to every preset incl default. (2) send button bg-foreground-\u003ebg-primary. (3) user bubble bg-secondary-\u003ebg-primary. (4) active history row dashed-underline -\u003e bg-primary/10 pill. (5) suggested cards hover:border-primary/40. Verified live: ocean-breeze blue nav/send/bubble; rose-garden -\u003e nav+bubble+bg-wash all rose. Biome clean. NOT committed (awaiting user reaction). Unrelated chat-500 persists.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-18T17:18:57Z","created_by":"HamChowderr","updated_at":"2026-06-18T20:29:46Z","closed_at":"2026-06-18T20:29:46Z","close_reason":"Completed this session (commit ffc4837).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-v9z3","title":"Redesign bottom-left account menu (sidebar-user-nav) + fix nonsensical scroll","description":"DropdownMenuContent width pinned to narrow sidebar (w-(--radix-popper-anchor-width)), unpolished; Color theme preset submenu likely causes odd scroll. Fix: proper width (w-56), header row + icons, max-h on submenu.","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-18T16:21:17Z","created_by":"HamChowderr","updated_at":"2026-06-18T20:29:46Z","closed_at":"2026-06-18T20:29:46Z","close_reason":"Completed this session (commit ffc4837).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-shg7","title":"Settings sidebar double-highlights Integrations + API Keys","description":"settings-shell.tsx active logic uses pathname.startsWith(href); API Keys route /settings/integrations/mcp is a sub-path of /settings/integrations so both highlight. Fix: most-specific match wins.","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-18T16:21:11Z","created_by":"HamChowderr","updated_at":"2026-06-18T20:29:46Z","closed_at":"2026-06-18T20:29:46Z","close_reason":"Completed this session (commit ffc4837).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-x8rj","title":"CI: db-types Docker pull of postgres-meta hits AWS ECR rate-limit (toomanyrequests)","description":"The 'db types fresh' job runs 'supabase gen types --local', which pulls public.ecr.aws/supabase/postgres-meta unauthenticated. On shared runners this intermittently fails with 'docker: toomanyrequests: Rate exceeded' (exit 125), producing empty type output and a false diff failure. Distinct from foreman-fjl3 (the supabase-CLI GitHub-API rate-limit, fixed by pinning). Harden by authenticating Docker pulls (docker/login-action with a token) or pre-pulling/caching the postgres-meta image. Hit twice this session; a re-run currently clears it.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-18T04:06:29Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-fjl3","title":"CI: pin/auth Supabase CLI in db-types job to stop rate-limit flakes","description":"The 'db types fresh' job uses supabase/setup-cli which resolves the LATEST release via an unauthenticated GitHub API call. That got rate-limited on PR #18 ('Failed to resolve latest Supabase CLI release: rate limit exceeded'), failing the job in 9s with no real type drift. Pin the CLI to a fixed version (and/or pass GITHUB_TOKEN to the setup action) so the job is deterministic and not subject to anonymous API rate limits.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-18T02:10:09Z","created_by":"HamChowderr","updated_at":"2026-06-18T03:38:15Z","closed_at":"2026-06-18T03:38:15Z","close_reason":"Merged to main via PR #19 (squash); db-types verified green in CI with pinned supabase-cli 2.107.0.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-g0tf","title":"README: document Zapier SDK CLI, login methods, sdk:check + add .env.example","description":"Update README for Zapier-community newcomers: new 'Working with the Zapier SDK' section (two packages, four login methods, npm run sdk:check, explore-yourself docs links), fix stale tool count 34-\u003e28 (x6) and 17-\u003e16 read-only, repoint dead 'see CLAUDE.md for env vars' pointer, and add packages/agents/.env.example + packages/web/.env.example (no .env.example existed).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-17T22:54:14Z","created_by":"HamChowderr","updated_at":"2026-06-17T22:57:31Z","closed_at":"2026-06-17T22:57:31Z","close_reason":"Applied: new 'Working with the Zapier SDK' README section (CLI, 4 login methods, sdk:check, explore-yourself docs links), 34-\u003e28 (x6) + 17-\u003e16 count fixes, env-var pointer repointed, and packages/agents+web/.env.example created. Uncommitted pending user's commit decision.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0yra","title":"Re-verify Zapier durable 403 on latest SDK 0.70.4 before sending engineer brief","description":"Bump @zapier/zapier-sdk 0.69.3 -\u003e 0.70.4 and re-run scripts/durable-pkce-probe.ts to confirm the runDurable userJwt 403 still reproduces on the latest SDK. Closes the 'are you on latest?' gap in docs/zapier-durable-questions-for-engineers.md. Changelog review (0.70.0-0.70.4) showed no durable-auth changes; this is the empirical confirmation.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-16T16:58:24Z","created_by":"HamChowderr","updated_at":"2026-06-16T17:02:57Z","started_at":"2026-06-16T16:58:47Z","closed_at":"2026-06-16T17:02:57Z","close_reason":"Durable 403 reproduced on latest SDK 0.70.4; brief tightened. Version gap + endpoint-coverage honesty both addressed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-sg23","title":"Vercel preview build fails (module_not_found) on alpha branch — align install with CI","description":"PR #17 Vercel preview deploy errors at buildStep with errorCode module_not_found ('cd packages/web \u0026\u0026 npm run build' exit 1), while all 5 GHA gating jobs (incl. web next build via npm ci) are GREEN on the same commit, and a clean local build passes. Install succeeds; .source self-regenerates via withMDX so it is not the cause. Build-log API is 403 (CLI token lacks build-log scope), so the exact module is dashboard-only. Divergence: Vercel installCommand 'npm install' (+ possible stale cached node_modules on a fresh branch) vs GHA 'npm ci'. Non-gating (main production deploys are Ready), does not block merge. Fix: set vercel.json installCommand to 'npm ci' to force a clean lockfile-exact install matching the proven-green CI path.","notes":"FIXED properly: root cause was a duplicated react in the alpha-regenerated lockfile — root node_modules/react 19.2.7 (ecosystem ^19.2.0) + nested packages/web/node_modules/react 19.2.4 (web's exact pin). next (hoisted to root) could not resolve react on Vercel's npm. Fix: root overrides react/react-dom=19.2.7 → clean reinstall dedupes to a SINGLE root react 19.2.7 (no nested copy), verified locally (lockfile single entry + web next build exit 0). Reverted the two wrong guesses (npm ci 3e8a5ec, rm -rf a5bb049); installCommand back to npm install.","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T17:14:15Z","created_by":"HamChowderr","updated_at":"2026-06-21T03:37:19Z","started_at":"2026-06-12T17:14:36Z","closed_at":"2026-06-21T03:37:19Z","close_reason":"Root cause (duplicate react: root 19.2.7 vs nested web 19.2.4) is gone from the tree — web react is ^19.2.0 (caret), no nested react copy, single lockfile entry. Fix landed via the caret dedupe; bead was just never closed. Was non-gating (production deploys stayed Ready).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hlh0","title":"[web] Surface run fired_by/error_message + fix failed-status badge","description":"The agent API (GET /workflows/:id/runs) now returns fired_by/error_message/trigger_id (foreman-2afc), but the web doesn't render them, and there's a pre-existing display bug: the engine writes status 'failed' but workflows-client WorkflowRun.status + the StatusBadge map only know 'error', so failed runs render as 'running'. Fix: (1) WorkflowRun.status -\u003e 'running'|'success'|'failed' + add fired_by/error_message/trigger_id; (2) [id]/page.tsx StatusBadge map key error-\u003efailed + show how each run fired; (3) run detail page show fired_by + error_message. First visible slice of the broader 'surface new backend in UI' work (foreman-tbjb/7am4/ezsm).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-12T16:30:49Z","created_by":"HamChowderr","updated_at":"2026-06-12T16:34:48Z","closed_at":"2026-06-12T16:34:48Z","close_reason":"Done (ada01c9): WorkflowRun type gains status=failed + fired_by/error_message/trigger_id; run list shows how each run fired + inline error on failure; run detail shows 'started by' + an error box. Fixed the pre-existing bug where failed runs rendered as 'running' (engine writes 'failed', web only knew 'error'). next build green.","dependencies":[{"issue_id":"foreman-hlh0","depends_on_id":"foreman-2afc","type":"discovered-from","created_at":"2026-06-12T09:30:48Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-tbjb","title":"[signals] notify() is inert — driving processes don't connect the providers","description":"The poll + channel SignalProviders are hosted on the foreman agent for notify(), but the processes that DRIVE them don't reliably CONNECT them, so notify() is a no-op (provider.agent undefined -\u003e notifyOwner returns early). (1) cron-driver-server drives zapierPollProvider.runDuePolls() but never calls getMastra()/builds the foreman agent, so poll notify() never fires. (2) channel: slack/bot.ts builds the agent lazily inside generateReply, AFTER matchAndFireChannelTriggers, so the channel provider isn't connected for trigger-only messages until the process first runs generateReply. (3) even when fired, notify targets synthetic threads (poll:\u003cid\u003e, channel:\u003cch\u003e:\u003croom\u003e) and no web UI consumes the notification store, so it's not user-visible. Workflow FIRING is unaffected/correct (doesn't need the agent). FIX: have the driving processes construct the agent at startup (cron-driver-server: getMastra() so the provider connects; webhook-server: build foreman at startup) + a web consumer of the notification store / thread to surface it. Until then notify() is scaffolding, not delivered.","notes":"CONNECT FIX DONE (commit 177c281): cron-driver-server + webhook-server now call getMastra() at startup -\u003e foreman agent built in-process -\u003e providers connected (+ notification storage available). Live-verified: cron logs 'poll provider connected: true'. So notify() now FIRES (writes to the notification store) on poll/channel trigger hits. REMAINING (the user-visible half): a web consumer of the notification store / agent thread to surface the notification in chat — bundles with the deferred background-tasks /background-tasks/stream consumer. Also: notify targets synthetic threads (poll:\u003cid\u003e, channel:\u003cch\u003e:\u003croom\u003e) — revisit thread targeting when wiring the UI.","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T05:22:51Z","created_by":"HamChowderr","updated_at":"2026-07-05T05:12:49Z","closed_at":"2026-07-05T05:12:49Z","close_reason":"SUPERSEDED by bazc: the signal providers this bug targets (notify() inert) were removed with the hand-rolled workflow/signals subsystem (82b24fb). App runs on trigger-inbox + durable now. File fresh against current arch if notify/signals is wanted.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7am4","title":"[agent] Adopt Mastra background tasks for long-running Zapier tools + web stream consumer","description":"backgroundTasks is enabled and /background-tasks/stream is built, but no tool opts in and nothing consumes the stream. Opt long-running read-only Zapier tools into background:{enabled:true} with a waitTimeoutMs so the agent loop proceeds (non-blocking chat). Add a web consumer of /background-tasks/stream to surface running-\u003edone + injected results. Keep approval-required write/delete tools synchronous (don't disturb the proposal flow). Live-verify on the dev server. 3rd Mastra primitive on its designed surface.","notes":"RESOLVED + VERIFIED LIVE (2026-06-28). The non-blocking background path now actually works. KEY DISCOVERY via real e2e: tool-level `background` config is a SILENT NO-OP under Foreman's lazy `tools: () =\u003e buildForemanTools()` resolver — search_history ran synchronously (no task event, no onTaskComplete) despite the config. The AGENT-level `backgroundTasks.tools` map IS what dispatches. Final impl: (1) /chat switched stream()→streamUntilIdle(maxIdleMs=120s) so a bg result folds into the SAME response; (2) lib/background.ts backgroundToolsConfig() builds the agent-level opt-in from READ_ONLY_TOOL_IDS (kebab read-only Zapier ids, exported from zapier-sdk-tools) + search_history, waitTimeoutMs=30s; writes/destructive EXCLUDED (stay sync for approval flow); (3) manager config: backpressure='fallback-sync', concurrency 10/5, cleanup, onTaskComplete/Failed logging. NO env flag (removed FOREMAN_BACKGROUND_TOOLS entirely — user wanted no settings; hang is gone on alpha so no need). Verified: bg-task-running→completed on /background-tasks/stream + [bg-task] log + result injects; normal chat unaffected; lazy-init guard + unit tests + tsc green. NOTE: only search_history e2e'd (test user has no Zapier connection) — read-only Zapier tools use the identical agent-level opt-in by matching ids. UNCOMMITTED.","status":"in_progress","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T04:38:20Z","created_by":"HamChowderr","updated_at":"2026-06-28T16:30:55Z","started_at":"2026-06-12T04:42:18Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ueep","title":"[workflow] Live-verify the poll driver against a real Zapier read action","description":"poll-driver.ts (foreman-ld7s) is unit-tested only. Verify the real run path: bind a type=poll trigger to a real Zapier read action (e.g. gmail/new_email), run cron-driver-server, create a new record, assert exactly one workflow run fires and zero duplicates on re-poll; confirm baseline (first poll fires nothing) and intervalMinutes gating. Per verify-behavior-not-just-logic.","notes":"ORCHESTRATION LIVE-VERIFIED (commit 278246a): tests/live/poll-driver.test.ts, 4/4 green against real local Postgres. Proves attach_trigger(poll) -\u003e runDuePolls -\u003e executeWorkflow -\u003e real workflow_run row (fired_by=poll, trigger_id, status=success) + baseline (first poll no fire, cursor set) + dedup (no double-fire). Only the external Zapier read (runAction) is stubbed — DB was reset, no OAuth-connected app to create records in. REMAINING (thin, user-driven): smoke the literal real Zapier read by connecting an app (gmail) + creating a record while cron-driver-server runs; the SDK network call itself is covered by the tests/sdk live tier. The whole machinery around that call is now proven.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T00:35:12Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:43Z","closed_at":"2026-07-05T03:26:43Z","close_reason":"Live poll-driver verification done: 278246a test(live) end-to-end poll driver against real Postgres.","dependencies":[{"issue_id":"foreman-ueep","depends_on_id":"foreman-ld7s","type":"discovered-from","created_at":"2026-06-11T17:35:12Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ld7s","title":"[workflow] Un-stub the poll trigger as a Foreman-native poll driver (tickPoll)","description":"Poll trigger type is documented in the migration and accepted by list/detach but hidden by attach-trigger and has no driver. Build src/workflows/poll-driver.ts mirroring cron-driver: read workflow_trigger type=poll, run the Zapier read action via runAction, diff results by config.dedupeKey field against last_dedupe_key cursor, fire executeWorkflow on new records, persist cursor. Un-stub attach_trigger (add poll + pollConfig). Wire into cron-driver-server. Rationale (explored alpha API hands-on): Mastra SignalProvider.poll() skips when zero in-memory subscriptions and notify() requires an in-process agent — it is built for provider-lives-in-agent/notify-thread, not a singleton worker firing DB workflows. SignalProvider will be adopted on the webhook/channel path instead. Keeps door open to Zapier watchTriggerInbox SSE later (iyq6).","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T00:27:10Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-12T00:27:27Z","closed_at":"2026-06-12T00:35:07Z","close_reason":"Poll driver implemented + unit-tested; full agents suite green (288). Live Zapier integration tracked as follow-up.","dependencies":[{"issue_id":"foreman-ld7s","depends_on_id":"foreman-c63f","type":"discovered-from","created_at":"2026-06-11T17:27:10Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-22c3","title":"Evaluate Mastra signals/signal-providers/notifications vs Foreman's home-grown triggers","description":"Foreman is on @mastra/core 1.41 (post-bump). Mastra now ships native primitives that overlap with Foreman's hand-built trigger/workflow/notification system: (1) SignalProvider (poll OR webhook an external source -\u003e push notifications into agent threads) ~= Foreman's channel-trigger + cron-driver + the stubbed poll trigger (c63f); (2) built-in dedupeKey on notify() directly solves the dedup gap in tv5p (Foreman hand-rolls idempotency); (3) @mastra/github-signals is a production provider and Foreman already has a GitHub channel; (4) background-task suspend/resume for human approval + notification inbox ~= Foreman's proposal/approval flow. Sibling to iyq6 (Zapier-durable eval). Decide adopt-Mastra-native vs keep-own BEFORE building the v8k1 workflow epic. Confirmed code-side: backgroundTasks enabled in mastra/index.ts; pubsub is default in-process EventEmitter (no distributed backend — matters for 2-process + multi-instance); signals/signal-providers not used at all.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T22:33:47Z","created_by":"HamChowderr","updated_at":"2026-07-05T05:12:52Z","closed_at":"2026-07-05T05:12:52Z","close_reason":"SUPERSEDED by bazc: evaluates Mastra signals vs home-grown triggers, but the home-grown signal/trigger system was removed (82b24fb); app now runs on trigger-inbox + durable. Re-scope if signals adoption is revisited.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rpsr","title":"Fix flaky db-types CI job — 'supabase gen types --local' intermittently errors 'Access token not provided'","description":"CI job 'db types fresh' (.github/workflows/test.yml) is flaky: passes on some commits (4dd20ff, 25b1ed1), fails on others (51e2065, f677794, b1070ae, 040b6a6) with 'Access token not provided' from 'npx supabase gen types typescript --local', producing empty output → diff shows 0a1,4128 (empty vs committed 4128-line database.types.ts). NOT a stale-types problem and NOT caused by the SDK/mastra bump. Root cause: supabase/setup-cli@v1 uses version:latest (unpinned), and the drifted CLI intermittently requires an access token even for --local. Fix options: (1) pin setup-cli to a known-good supabase version; (2) ensure 'supabase start' is fully healthy before gen; (3) set SUPABASE_ACCESS_TOKEN (project avoids secrets). Verify locally by starting Foreman's own supabase (note: a different project's supabase '*_Zillow' was running during diagnosis).","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-11T19:40:46Z","created_by":"HamChowderr","updated_at":"2026-06-11T20:18:52Z","closed_at":"2026-06-11T20:18:52Z","close_reason":"Fixed (379d9b4): added a placeholder SUPABASE_ACCESS_TOKEN to the CI db-types step. The latest supabase CLI demands a token's presence before local type-gen in Linux CI (value unused for --local). All 5 CI jobs green on main (run 27374657799). Also switched scripts to --local --workdir ../.. (cwd-independent) + documented the gotcha in CLAUDE.md.","dependencies":[{"issue_id":"foreman-rpsr","depends_on_id":"foreman-9zsp","type":"discovered-from","created_at":"2026-06-11T12:40:46Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-chxx","title":"Reskin README to myrp-build product-launch style (hero+badges, emoji sections, narrative, FAQ)","description":"Current README is content-complete but dry/dev-doc-toned. Rewrite to mirror hamchowderr/myrp-build README: centered hero + shields.io badges, emoji-prefixed sections split by ---, benefit-led narrative with example-prompt blockquotes, collapsible concrete example, ASCII pipeline diagram, dev-vs-self-hosted comparison table, annotated file-tree architecture, testing-tiers table, FAQ, acknowledgments, license stance. Preserve all factual content (5 agents, 34 Zapier tools, channel statuses, modes, testing tiers, deploy targets, live URLs, MIT license, contact). User-authorized.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-11T19:17:43Z","created_by":"HamChowderr","updated_at":"2026-06-11T19:28:04Z","closed_at":"2026-06-11T19:28:04Z","close_reason":"README reskinned to myrp-build product-launch style; committed b1070ae, pushed to origin/main, rendered + reviewed in Chrome.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-d8qq","title":"Durable auth proof — mint userJwt via standalone PKCE, confirm runDurable accepts it","description":"Replicate Foreman's PKCE OAuth flow (connect.ts: public client grwWZD..., login ports, scope 'internal credentials offline_access') in a standalone script to mint a real per-user userJwt, then call experimental runDurable with it. Goal: (1) prove a Foreman-style userJwt passes durable's userJwt security scheme (we've only confirmed client-creds FAILS); (2) capture the exact source_files/runtime contract error, since the entry-point contract is undocumented publicly (docs.zapier.com has zero durable refs; defineDurable is a Phase-2 stub). Output = precise question for Zapier engineers.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T19:02:11Z","created_by":"HamChowderr","updated_at":"2026-06-11T19:09:27Z","started_at":"2026-06-11T19:02:21Z","closed_at":"2026-06-11T19:09:27Z","close_reason":"Auth proof complete: per-user PKCE userJwt 403s on durable (internal-scope wall). Disproved the 'usable via Foreman userJwt' claim; doc + 8bh9 corrected. Durable inaccessible to all public-SDK auth pending Zapier.","dependencies":[{"issue_id":"foreman-d8qq","depends_on_id":"foreman-8bh9","type":"discovered-from","created_at":"2026-06-11T12:02:11Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0795","title":"Upgrade @mastra ecosystem to latest (core 1.32.1-\u003e1.41.0 + family) alongside Zapier SDK bump","description":"User requested everything on latest in one coordinated upgrade. Bump @mastra/core override 1.32.1-\u003e1.41.0 and the whole family to latest: memory 1.20.2, pg 1.12.1, observability 1.14.1, editor 0.11.1, ai-sdk 1.4.4, evals 1.2.4, loggers 1.1.2, duckdb 1.4.1, voice-openai 0.12.2, deployers 1.1.42/1.1.36, mastra CLI 1.12.2. Root cause this resolves: newer @mastra/pg requires core\u003e=1.34 and memory uses modelSupportsAttachments (core\u003e=~1.34) absent in pinned 1.32.1. Done jointly with foreman-8ujc (Zapier SDK 0.48-\u003e0.69.3) as a single clean-reinstall. Risk: core jumps 9 minors, expect breaking API changes -\u003e fix code, build+test must pass.","notes":"GREEN 2026-06-11 on branch chore/bump-zapier-mastra-latest. @mastra/core override 1.32.1→1.41.0 + family to latest (memory 1.20.2, pg 1.12.1, observability 1.14.1, editor 0.11.1, ai-sdk 1.4.4, evals 1.2.4, loggers 1.1.2, duckdb 1.4.1, voice-openai 0.12.2, deployers 1.1.42/1.1.36, mastra CLI 1.12.2). check:deps PASS (single core), mocked tests 276 passed/0 failed, mastra build exit 0 — no code changes needed, core 1.41 API back-compatible for Foreman's usage. Build's 'Invalid Mastra config' warning is the pre-existing lazy getMastra() pattern (index.ts:33), not a regression. NOT yet committed.","status":"closed","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T15:21:53Z","created_by":"HamChowderr","updated_at":"2026-06-11T16:51:50Z","started_at":"2026-06-11T15:22:35Z","closed_at":"2026-06-11T16:51:50Z","close_reason":"@mastra ecosystem→latest (core 1.41.0), committed 5a89e66, on main via catch-up FF. check:deps/test/build green.","dependencies":[{"issue_id":"foreman-0795","depends_on_id":"foreman-2xdk","type":"discovered-from","created_at":"2026-06-11T08:21:52Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7jn1","title":"[workflow] Decision: per-user Slack isolation sufficient vs build shared group-channel context","description":"Foreman already isolates per Slack user (resourceId per user; slack/bot.ts:58; foreman.ts memory scope resource). Mastra natively supports scope thread|resource but NO shared-group memory, and slack/bot.ts:137 never persists the channel thread to the conversation table. Decide: (A) per-user is enough (lock it), or (B) build shared group context = new channel_conversation table + group memory scope + thread persistence. If B, spawn the feature issue.","acceptance_criteria":"Decision recorded; if B, a scoped feature issue (channel_conversation table + group scope + persist channel thread) is filed.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:31:18Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependencies":[{"issue_id":"foreman-7jn1","depends_on_id":"foreman-v8k1","type":"discovered-from","created_at":"2026-06-11T01:31:17Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ezsm","title":"[workflow] Build the /workflows UI page (list saved automations + run history)","description":"foreman-v8k1 calls for a UI so users can see saved automations; it does not exist. Build a /workflows page in packages/web listing workflows + triggers + recent runs (status, error_message from the observability issue), using the existing /workflows/* API routes and the shadcn stack. Per-workflow run-history view.","acceptance_criteria":"/workflows lists the user's workflows + triggers; clicking shows run history incl. failed-run errors; reads from existing API routes.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:31:13Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:50Z","closed_at":"2026-07-05T03:26:50Z","close_reason":"SUPERSEDED: the /workflows page + /workflows API routes it depended on were removed and replaced by /automations (foreman-v8k1/bazc). Not to be built as specced.","dependencies":[{"issue_id":"foreman-ezsm","depends_on_id":"foreman-v8k1","type":"discovered-from","created_at":"2026-06-11T01:31:13Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8fcs","title":"[workflow] Tests: params.ts substitution + engine step-failure paths","description":"params.ts (extract/substitute/validate) and engine.ts step-failure handling (~80-122) are untested. Add unit tests: substituteParams (partial replace, unknown keys left as-is, nested/arrays), validateParams (missing detected), engine step failure (runAction throws -\u003e failed + error captured), generator-throw cleanup, empty-steps early-exit.","acceptance_criteria":"params + engine error paths covered; npm test green.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:31:09Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"SUPERSEDED by bazc: workflow engine + params.ts these tests targeted were removed (82b24fb).","dependencies":[{"issue_id":"foreman-8fcs","depends_on_id":"foreman-v8k1","type":"discovered-from","created_at":"2026-06-11T01:31:08Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2afc","title":"[workflow] Run-state \u0026 observability: orphaned 'running' rows on crash; persist error_message + trigger context","description":"engine.ts inserts workflow_run status=running (~line 56) and never sets failed if executeWorkflow throws before completing -\u003e rows orphaned forever. Wrap generator consumption in try/finally at each call site (routes/workflows.ts, channel-trigger.ts, cron-driver.ts) to mark failed with the error. Persist error_message + fired_by(manual/cron/channel) + trigger_id on workflow_run; trigger-fired runs only console.warn today and never appear in run history. Surface in GET /workflows/:id/runs.","acceptance_criteria":"A failed run shows status=failed + error_message within ~1s; cron/channel-fired runs appear in run history with trigger context; no rows stuck in running.","notes":"Part 1 DONE (4c5da4c): engine try/finally + settled flag = no run stuck in running; 3 unit tests. Part 2 GATED on user go: workflow_run migration (error_message, fired_by, trigger_id), thread trigger context through executeWorkflow + 3 driver sites, surface in GET /workflows/:id/runs, regen db types (needs Foreman local supabase up; a Zillow stack currently holds default ports).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:31:04Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-12T04:25:28Z","close_reason":"Part 1 (4c5da4c): no run stuck in running. Part 2 (c039220): workflow_run migration + error_message/fired_by/trigger_id persisted + surfaced in GET runs. db:types:check clean, migration applies on clean reset, 300 tests green.","dependencies":[{"issue_id":"foreman-2afc","depends_on_id":"foreman-v8k1","type":"discovered-from","created_at":"2026-06-11T01:31:03Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-tv5p","title":"[workflow] BUG: trigger dedup/idempotency — channel-trigger has no dedup; cron can double-fire on same-minute restart","description":"channel-trigger.ts (matchAndFireChannelTriggers ~43-79) fires with NO dedup despite an unused workflow_trigger.last_dedupe_key column — a retried webhook = duplicate runs. Add a dedupe key (channel+sender+ts+text hash or delivery id) checked against last_dedupe_key before firing. Separately cron-driver.ts (~164-167) can double-fire if the process restarts mid-minute; add a guard/lock. runOne also swallows errors silently.","acceptance_criteria":"Duplicate webhook =\u003e 1 run not 2 (unit test); a new message =\u003e new run; cron fires once per minute even across a same-minute restart (unit test).","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:30:59Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-12T03:15:08Z","closed_at":"2026-06-12T03:29:21Z","close_reason":"Channel dedup + cron same-minute atomic claim implemented and unit-tested per acceptance criteria. Error-surfacing portion tracked under 2afc.","dependencies":[{"issue_id":"foreman-tv5p","depends_on_id":"foreman-v8k1","type":"discovered-from","created_at":"2026-06-11T01:30:58Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wzmx","title":"[aimock] Resolve declared-but-unfixtured MCP/A2A mocks (write fixtures or remove declarations)","description":"aimock.json declares 8 MCP tools + 5 A2A agents but tests/fixtures/aimock/ has no mcp/ or a2a/ fixtures — a declared-vs-real mismatch that 503s under strict mode. Either write minimal fixtures for the tools/agents tests actually exercise, or remove the unused declarations so config reflects reality.","acceptance_criteria":"Every MCP/A2A declaration has a fixture OR is removed; npm test passes under strict mode with no unmatched MCP/A2A requests.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:30:27Z","created_by":"HamChowderr","updated_at":"2026-06-11T21:42:33Z","started_at":"2026-06-11T21:37:23Z","closed_at":"2026-06-11T21:42:33Z","close_reason":"MCP/A2A declarations made real; orphaned mcp/tools.json folded in and removed","dependencies":[{"issue_id":"foreman-wzmx","depends_on_id":"foreman-9zsp","type":"discovered-from","created_at":"2026-06-11T01:30:27Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wrrd","title":"[aimock] Enable strict mode and tighten/remove the empty-match catch-all fixture","description":"@copilotkit/aimock supports strict:true (verified config-loader.d.ts:101) so unmatched requests 503 instead of silently matching z-catchall.json (match {}), which currently risks false-green tests. Enable strict in packages/agents/aimock.json and remove/convert z-catchall to a strict error, fixing any tests that relied on the fallback.","acceptance_criteria":"aimock.json has strict:true; z-catchall removed/converted; npm test passes with every test hitting an explicit fixture.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:30:22Z","created_by":"HamChowderr","updated_at":"2026-06-11T21:43:26Z","closed_at":"2026-06-11T21:43:26Z","close_reason":"strict:true enabled in aimock.json; z-catchall.json deleted; npm test 278 passed/10 skipped under strict; strict 503 verified via probe","dependencies":[{"issue_id":"foreman-wrrd","depends_on_id":"foreman-9zsp","type":"discovered-from","created_at":"2026-06-11T01:30:21Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xnis","title":"[bump] Surface getProfile as an agent tool; confirm trash option auto-surfaces on table-list tools","description":"Post-bump, surface worthwhile new stable methods. Add getProfile to READ_ONLY in zapier-sdk-tools.ts (agent can answer who-am-I-on-Zapier). Confirm the 0.57 trash option (exclude/include/only) auto-surfaces in listTableRecords/listTableFields tool schemas via the registry (likely no code change). Keep client-credentials mgmt + listTriggers excluded (documented in capability map).","acceptance_criteria":"getProfile in READ_ONLY and callable; trash param present in table-list tool input schema; tests pass.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:30:17Z","created_by":"HamChowderr","updated_at":"2026-06-11T21:50:31Z","closed_at":"2026-06-11T21:50:31Z","close_reason":"getProfile already surfaced as a read-only tool (in READ_ONLY set, generated via sdk.getRegistry; added 7wks ago in 2092317) — agent can answer who-am-I-on-Zapier, no change needed. 'Trash option': no 'trash' field exists anywhere in @zapier/zapier-sdk@0.69.3; tool params auto-surface from SDK Zod schemas (mechanism verified) but there is nothing to surface — note is stale.","dependencies":[{"issue_id":"foreman-xnis","depends_on_id":"foreman-8ujc","type":"discovered-from","created_at":"2026-06-11T01:30:17Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-98j3","title":"[durable] Decision: keep home-grown workflow engine for v1; Zapier durable API is post-v1","description":"Exploration verdict: KEEP-OWN-ENGINE. Zapier durable workflows (createWorkflow/publishWorkflowVersion/runDurable/triggerWorkflow) are experimental, server-shape-passthrough, still churning (0.69.3 field-drop fix), and lack conversation-context linkage; Foreman's engine is stable, conversation-aware, full DB control. Record decision + revisit criteria (durable API stable AND need durable/async execution AND conversation linkage solvable).","acceptance_criteria":"Decision recorded (capability map or an ADR) with the what-Zapier-gives / what-we-give / revisit-criteria table.","notes":"NEEDS ENGINEER VALIDATION before locking — this is a real tradeoff, not a clean win. Adopting Zapier's durable API would OFFLOAD durability/retry, hosted execution, versioning, and real-time triggers that we otherwise build+maintain ourselves; keeping our own engine means carrying that burden. Ask engineering: (1) projected maintenance cost of our own engine's reliability over the next 6-12mo; (2) is the durable API stable enough to bet a core feature on, and can we bridge conversation-context into it; (3) incremental (a few steps) vs all-in vs not-yet. Recommendation (keep-own for v1) is reversible — revisit criteria in the description. Do not close without engineering sign-off.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:29:40Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"SUPERSEDED by bazc: keep-home-grown-engine decision reversed; engine removed (82b24fb), rebuilt on durable.","dependencies":[{"issue_id":"foreman-98j3","depends_on_id":"foreman-iyq6","type":"discovered-from","created_at":"2026-06-11T01:29:40Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-c63f","title":"[trigger-inbox] Design + decide: implement the stubbed poll trigger via trigger-inbox vs build-own","description":"Foreman's poll trigger type is a stub (attach-trigger.ts, routes/workflows.ts) with no driver; the trigger-inbox API is the natural implementation (app-event subscriptions). After the spike, design: workflow_trigger schema additions (trigger_inbox_id, app/action), a TriggerInboxClient wrapper, attach_trigger extension to accept type=poll, and a poll-driver worker (drain/watch). Decide incremental (poll alongside cron/channel) vs full. Gate before implementation issues are spawned. Relates to foreman-v8k1.","acceptance_criteria":"Written design + decision (incremental/full/skip) with schema diff and the implementation issues it spawns. Blocked by the spike.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:29:29Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: trigger-inbox decision recorded (docs/trigger-inbox-spike.md f01e9eb); acted on via worker.ts lease/ack loop.","dependencies":[{"issue_id":"foreman-c63f","depends_on_id":"foreman-iyq6","type":"discovered-from","created_at":"2026-06-11T01:29:29Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-c63f","depends_on_id":"foreman-bdjp","type":"blocks","created_at":"2026-06-11T01:31:50Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bdjp","title":"[trigger-inbox] Spike: prototype a poll-driver against one app (ensure/lease/ack/drain)","description":"Access confirmed empirically 2026-06-11 (iyq6 notes: listTriggerInboxes-\u003e[], listTriggers(github)-\u003e23). Build a throwaway poll-trigger driver on the SDK /experimental trigger-inbox API: ensureTriggerInbox for one app (e.g. GitHub new-issue), lease messages with a timeout, run a workflow per message, ack on success / release on error, log lease+dup metrics. Goal: learn the real lifecycle (connection binding, input schema via getTriggerInputFieldsSchema, watchTriggerInbox SSE) before wiring it in. Needs SDK bumped or a local /experimental install.","acceptance_criteria":"Prototype creates an inbox, drains/acks \u003e=1 message, shows correct lease/ack/release; findings in docs/trigger-inbox-spike.md with a go/no-go rec.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:29:19Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:31Z","closed_at":"2026-07-05T03:26:31Z","close_reason":"Trigger-inbox poll-driver spike executed (5 commits 1c5f995..f01e9eb); scripts/trigger-inbox-spike.ts present. Spike complete.","dependencies":[{"issue_id":"foreman-bdjp","depends_on_id":"foreman-iyq6","type":"discovered-from","created_at":"2026-06-11T01:29:19Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-x944","title":"SDK update watcher — detect new @zapier/zapier-sdk releases when working in Foreman","description":"Why: Foreman is a PRODUCT built on @zapier/zapier-sdk. We were 21 versions behind (0.48 vs 0.69) and nearly rebuilt durable-workflows + an 18-method trigger-inbox subsystem that Zapier already shipped. We need a standing mechanism so we never silently fall behind again — surfaced automatically when working in this project, not via manual luck. Build: (1) scripts/zapier-sdk-watch.mjs — compares the installed @zapier/zapier-sdk version against the npm 'latest', lists how many versions behind + release dates, and in full mode npm-packs latest to print the CHANGELOG delta tagged [NEW CAPABILITY]/[BEHAVIOR CHANGE]/[BUGFIX]/[DEPRECATION]; fail-safe (offline =\u003e exit 0, never blocks). (2) npm scripts sdk:check (full) + used by hook in --quiet mode. (3) SessionStart hook in .claude/settings.json running the quiet check (throttled ~once/day via a gitignored state file) so opening the project surfaces 'N new SDK versions since you last looked -\u003e run npm run sdk:check'. Phase 2 (optional): --file-issue flag to auto-open a bd issue, and/or a weekly CI job.","acceptance_criteria":"Running npm run sdk:check from repo root prints installed 0.48.0 vs latest 0.69.x, the version gap, and the changelog delta. The SessionStart quiet check prints a one-line notice only when a newer version exists, is throttled so it doesn't hit npm every session, and never blocks/errors session start (offline-safe). State file gitignored.","notes":"BUILT \u0026 TESTED (2026-06-11): scripts/zapier-sdk-watch.mjs watches BOTH @zapier/zapier-sdk (0.48.0 -\u003e 0.69.3, 28 behind) AND @zapier/zapier-sdk-cli (0.44.0 -\u003e 0.54.3, 33 behind — found pinned in root devDeps). Pure-fetch (npm registry + jsdelivr CHANGELOG), no child procs/tar, Node 18+ global fetch, offline-safe (always exit 0). Modes: full (per-pkg installed/latest/gap + changelog delta), --quiet (one-line per pkg, throttled ~once/day via gitignored scripts/.zapier-sdk-watch.json, only pings once per new latest), --json, --force, --no-changelog. Wired: root package.json scripts sdk:check + sdk:check:quiet; .gitignore for state file. BLOCKED: the SessionStart hook line in .claude/settings.json (node scripts/zapier-sdk-watch.mjs --quiet) was denied by the CC permission classifier as self-modification of startup config — needs explicit user approval to apply. Until then, run manually via npm run sdk:check.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T07:59:42Z","created_by":"HamChowderr","updated_at":"2026-06-11T16:55:56Z","started_at":"2026-06-11T08:00:56Z","closed_at":"2026-06-11T16:55:56Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-iyq6","title":"Evaluate Zapier experimental durable-workflow API vs Foreman's own workflow engine","description":"MAJOR FINDING that contradicts foreman-v8k1's founding premise. v8k1 (filed 2026-05-09, verified against SDK 0.48) asserts 'the Zapier SDK/CLI is single-shot only — no API to create/save/trigger Zaps.' That WAS true at 0.48. As of 0.61-0.69, @zapier/zapier-sdk/experimental now exposes a full durable-workflow API (stable subpath still does NOT surface it): createWorkflow/updateWorkflow/enable/disable/deleteWorkflow, publish/list/getWorkflowVersion (publish source_files as a workflow version), runDurable/cancelDurableRun/list/getDurableRun, listWorkflowRuns/getWorkflowRun/getTriggerRun, triggerWorkflow (POSTs to a tokenized trigger_url), and watchTriggerInbox (0.69 SSE near-real-time trigger subscription). This is Zapier's 'durableworkflowzaps' / code-substrate product (durable hosted execution of published workflow code), NOT the classic Zap editor. Decision needed: Foreman already built its own workflow persistence + cron-driver + channel-trigger (works, full control). RECOMMENDATION: keep Foreman's engine as source of truth (the experimental API is /experimental-only, server-shape-authoritative, and a different execution model), but TRACK watchTriggerInbox + triggerWorkflow as a potential future replacement for the cron-driver polling loop (real-time vs minute-tick).","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T07:49:50Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: durable-vs-own eval recorded in docs/durable-workflow-spike.md; acted on (migrated to lib/durable/).","dependencies":[{"issue_id":"foreman-iyq6","depends_on_id":"foreman-v8k1","type":"discovered-from","created_at":"2026-06-11T00:49:50Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8ujc","title":"Bump @zapier/zapier-sdk 0.48.0 -\u003e 0.69.3","description":"We are 21 minor versions behind (0.48.0 installed; 0.69.3 latest, released 2026-06-10). Foreman constructs the SDK via the stable createZapierSdk({...}) factory (lib/zapier/sdk.ts, lib/zapier-sdk-tools.ts, lib/catalog/seed.ts, tools/connect-zapier.ts) and calls sdk.runAction() (lib/zapier/execution.ts:86). Per the SDK changelog, createZapierSdk + every SDK method + the Zapier* error hierarchy keep their names across 0.61-0.69, so the bump is low-risk at the API surface. Foreman does NOT use the deprecated createSdk().addPlugin chain. Behavior changes to verify: (1) 0.67 normalizeError no longer wraps Error subclasses; (2) 0.69.1 pagination consume-once semantics. Value of the bump = action-layer hardening Foreman already depends on: FIFO concurrency semaphore (rate-limit safety), error-classification isPermanentHttpError (smarter retry: 4xx permanent vs 5xx/network/429 transient), staged polling backoff, 0.69.1 pagination truncation fix, stdout/stderr separation for clean CLI piping.","acceptance_criteria":"package.json bumped to ^0.69.x; npm install clean (dedup check passes); next build + full vitest (mocked tier) green; sdk.runAction call path verified working against a live action in test:sdk tier.","notes":"GREEN 2026-06-11 on branch chore/bump-zapier-mastra-latest (done jointly w/ foreman-0795 @mastra upgrade). @zapier/zapier-sdk ^0.69.3 (agents resolve 0.69.3), @zapier/zapier-sdk-cli ^0.54.3. Clean reinstall. check:deps PASS, mocked tests 276 passed/0 failed, mastra build exit 0. NOT yet committed; test:sdk (live) not run (awaiting consent).","status":"closed","priority":2,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-06-11T07:49:45Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-06-25T16:09:27Z","close_reason":"Superseded by foreman-9t9g — bumped straight to 0.79.0 (past the 0.69.3 target) on 2026-06-25.","dependencies":[{"issue_id":"foreman-8ujc","depends_on_id":"foreman-2xdk","type":"blocks","created_at":"2026-06-11T01:31:55Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5rph","title":"next dev --turbo OOM-storms on Windows (web dev server unusable)","description":"npm run dev (next dev --turbo, Next 16.2.4) reaches Ready then, while compiling '/', spawns 200+ node processes that each FATAL OOM at ~8MB heap — a spawn storm that hangs the machine. next build is FINE. ROOT CAUSE: known/open Turbopack-dev-on-Windows memory bug (vercel/next.js #81161, #88614, #66326, #91396; #91396 notes Tailwind CSS compilation can spawn infinite node processes). Aggravators on this box: only ~6GB free RAM of 15.4GB; Node v24 (very new); aggressive experimental stack in next.config.ts (cacheComponents:true + turbopackFileSystemCacheForDev:true + prefetchInlining/cachedNavigations/appNewScrollHandler/inlineCss); our large globals.css (8 theme presets) increases Tailwind work. Also harmless noise: 'Found lockfile missing swc dependencies, patching' -\u003e Next misdetects pnpm in the npm workspace -\u003e ENOWORKSPACES (silence with NEXT_IGNORE_INCORRECT_LOCKFILE=1). swc native binary IS present, so not a missing-binary issue. CANDIDATE FIXES (to test): webpack dev (next dev --webpack); disable turbopackFileSystemCacheForDev; preloadEntriesOnStart:false; NODE_OPTIONS heap bump. Goal: a working local dev so the real chat can be verified.","notes":"ROOT CAUSE CONFIRMED + Defender RULED OUT. Disabling experimental turbopackFileSystemCacheForDev (+ preloadEntriesOnStart:false) in next.config.ts ELIMINATES the storm: peak 3 node procs (was 200+), no OOM. Defender is NOT the cause — measured MsMpEng=0 CPU-sec during compile; node ~0.5 CPU-sec/25s. With the mitigation, dev is FAST for app routes: /auth/login first-compile 720ms, cached 85ms, HTTP 200. The only slow route is the heavy marketing landing '/' (many client demos + framer-motion + cacheComponents prerender) — not relevant to chat verification. FIX: keep turbopackFileSystemCacheForDev disabled; keep preloadEntriesOnStart:false; optionally add NEXT_IGNORE_INCORRECT_LOCKFILE=1 to the dev script to silence the harmless 'patching lockfile'-\u003epnpm ENOWORKSPACES noise. Do NOT disable Windows Defender. Upstream: vercel/next.js turbopack-dev-on-Windows memory bugs (#81161/#88614/#66326/#91396).","status":"closed","priority":2,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-02T10:11:28Z","created_by":"HamChowderr","updated_at":"2026-06-02T11:08:10Z","closed_at":"2026-06-02T11:08:10Z","close_reason":"Fixed + verified (committed 8d06637). Disabled experimental turbopackFileSystemCacheForDev (Windows OOM-storm trigger) + preloadEntriesOnStart:false; set turbopack.root to workspace root; dev script uses cross-env NEXT_IGNORE_INCORRECT_LOCKFILE=1 to silence the false-positive lockfile patch. Clean npm run dev: no noise, no storm, Ready ~0.5s, /auth/login 200 \u003c0.1s. outputFileTracingRoot recommended only if/when output:'standalone' is adopted (PM2 deploy doesn't need it now).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-te0c","title":"Re-skin web chat UI to match myrp-build (Cursor/ChatGPT style)","description":"Make Foreman web chat look + feel like myrp-build's chat. Streaming/tool/reasoning logic is already near-identical; this is a re-skin. Scope (user chose Full match + port 8 theme presets): (1) restyle messages — drop assistant bubble to plain text, keep subtle user bubble, add 7px Bot/User avatars; (2) restyle tool cards — bordered card not iMessage bubble, amber approval banner w/ Approve/Decline; (3) swap design tokens to OKLch palette + Sora/JetBrains Mono fonts; (4) port 8 OKLch theme presets + switcher; (5) port checkpoint (restore/undo) + conversation stick-to-bottom wrapper. Transport stays HTTP/SSE (web app), not Electron IPC. Source of truth: C:/Users/HamCh/code/myrp-build/src/renderer/src.","notes":"IMPLEMENTED + VERIFIED (not committed). Full re-skin done: globals.css token set in orange brand + dark variant + tw-animate-css + 8 presets; codemod text-muted-\u003etext-muted-foreground (33 files); tool.tsx bordered card; message.tsx avatars+plain assistant+subtle user bubble+amber approval; link color-\u003eprimary; checkpoint.tsx + conversation.tsx ported (+deps tw-animate-css, use-stick-to-bottom); theme-presets.ts + picker in sidebar-user-nav + no-flash bootstrap. next build PASS x2, tsc PASS. Browser-verified via temp /preview route (since removed): light + dark + ocean-breeze preset all correct; landing brand preserved. NOTE: dev server (next dev --turbo) OOMs on this Windows box (Next16 Cache Components) — used next start on the production build to verify. FOLLOW-UPS: (1) checkpoint restore needs a backend undo endpoint before wiring into live chat; (2) optionally wire Conversation stick-to-bottom into messages.tsx (kept existing scroll). Awaiting user review before commit/push.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-02T09:03:13Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-06-02T09:03:45Z","closed_at":"2026-06-02T10:04:19Z","close_reason":"Chat re-skin complete + verified (light/dark/preset, landing brand preserved, clean next build). Conversation wrapper wired (foreman-u5j7). Checkpoint restore skipped (foreman-9hoq). Committing to feature/chat-ui-myrp-reskin.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rqvj","title":"Capture Mastra runtime tables in migrations","description":"Mastra creates these tables at runtime that aren't in supabase/migrations/: mastra_channel_config, mastra_channel_installations, mastra_schedule_triggers, mastra_schedules. They appeared in the local DB during normal dev and caused database.types.ts drift in PR #14 — see commit 25b1ed1. Capture their exact DDL (via npx supabase db dump --local) into a new migration so CI's clean DB matches local and db:types:check stays meaningful locally. Also worth auditing 20260426000019_mastra.sql for any other Mastra tables that have been added in newer @mastra/core versions.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-05-14T07:41:54Z","created_by":"HamChowderr","updated_at":"2026-05-14T14:45:57Z","closed_at":"2026-05-14T14:45:57Z","close_reason":"Resolved by commit 4dd20ff on feature/workflow-tools-crud — new migration 20260514000000_mastra_channels_and_schedules.sql captures all four @mastra/pg@1.10.0 runtime tables (mastra_channel_config, mastra_channel_installations, mastra_schedules, mastra_schedule_triggers). CI db types fresh passes; foreman-9zsp PR #14 fully green.","dependencies":[{"issue_id":"foreman-rqvj","depends_on_id":"foreman-9zsp","type":"discovered-from","created_at":"2026-05-14T00:41:53Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8ktu","title":"Fix self_hosted mode description — should mirror cloud, not share single account","description":"Current text describing FOREMAN_MODE=self_hosted in code or docs claims it 'uses shared Zapier client credentials for all users (single account). Ideal for personal/team deployments where everyone shares one Zapier connection.'\n\nThis is wrong. Self-hosted is just cloud running on the user's own infra. Each user still gets their own per-user Zapier OAuth, same as cloud. The 'shared single account' description is from an earlier design that was reversed.\n\nScope:\n1. Find every occurrence describing self_hosted (probably in agents/src/lib/env.ts, mode docs in CLAUDE.md/AGENTS.md, prompt template, README).\n2. Update text to reflect: self_hosted = same per-user OAuth flow as cloud, just self-deployed infra.\n3. Verify code paths actually behave that way — env.ts, providers.ts, anywhere FOREMAN_MODE is branched on.\n4. If any code path actually treats self_hosted as 'shared single account', fix that to match docs.\n\nAcceptance: 'self_hosted' is documented as 'cloud, but on your own infra — same per-user auth model'. Code does not branch differently between cloud and self_hosted for connection ownership.","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:23:46Z","created_by":"HamChowderr","updated_at":"2026-05-09T22:27:56Z","started_at":"2026-05-09T22:24:30Z","closed_at":"2026-05-09T22:27:56Z","close_reason":"Docs + code fixed. README and zapier-sdk.mdx now describe self_hosted as 'same per-user OAuth as production, on your own infra'. Removed the special-case getSharedSdk branch in zapier/sdk.ts — self_hosted now falls through to the same per-user OAuth path as production. Dev fallback narrowed to mode==='dev'.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0cvh","title":"Install all shadcn/ui components in packages/web","description":"Bulk-install every shadcn component into packages/web/src/components/ui so upcoming /workflows UI work (foreman-1oxu) and dashboards (foreman-8yff) have everything available without piecemeal adds.\n\nVerify with shadcn CLI before running — registry changes; do not assume from training data. Use 'npx shadcn@latest add --help' first to find the official 'all' or registry-wide flag.\n\nFiles affected: packages/web/src/components/ui/*.tsx, packages/web/package.json (peer deps), components.json untouched.\n\nAcceptance: every component listed in 'npx shadcn@latest registry' (or equivalent) is present in src/components/ui, build still passes ('npm run build' in packages/web).","status":"closed","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:15:20Z","created_by":"HamChowderr","updated_at":"2026-05-09T22:31:05Z","started_at":"2026-05-09T22:15:28Z","closed_at":"2026-05-09T22:31:05Z","close_reason":"All 55 shadcn components installed. Restored custom 'accent' variant on button + badge that the overwrite dropped. Removed dead 'table:' classNames key in calendar.tsx that was never valid in react-day-picker (verified v9 and v10 use identical strict { [key in UI | SelectionState | DayFlag | Animation]: string } typing — table is not in any of those enums). Build passes.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8yff","title":"Data sinks — persist pulled data to queryable tables for dashboards","description":"Why this exists: Zapier read actions can pull data from any of 9000+ apps, but the result currently only lands in workflow_run.output as a JSON blob. That is fine as an audit log but useless as a dashboard source — you cannot 'SELECT pulled_at, count(*) GROUP BY week' against a JSONB column at scale.\n\nTo support the planned UI dashboards (revenue, leads-over-time, channel activity, anything that pulls from connected apps), workflows need a 'sink' concept — a typed destination where each row of pulled data lands as its own queryable record.\n\nScope:\n\n1. **New table: pulled_record** (or per-domain tables — TBD).\n Schema sketch:\n id uuid PK\n workflow_id uuid FK\n workflow_run_id uuid FK\n source_app text (e.g. 'hubspot')\n source_action text (e.g. 'list_deals')\n external_id text (dedupe key, e.g. HubSpot deal ID)\n payload jsonb (full row)\n pulled_at timestamptz\n UNIQUE(workflow_id, external_id) for upsert-on-rerun\n RLS: per-user via existing patterns.\n\n2. **Workflow step extension**.\n Add a step type 'persist' that takes a previous step's output + a dedupe key path and upserts into pulled_record. e.g., step 1 = run_action HubSpot.list_deals, step 2 = persist with dedupeKey='id'.\n In schema: workflow_step.kind enum gains 'persist' alongside 'run_action' / future kinds.\n\n3. **Agent tools**.\n - persist_to_sink — agent-facing helper that the agent inserts into a workflow's step list when the user wants ongoing data collection. Examples in prompt.\n - query_sink — agent-facing read tool: SELECT against pulled_record by source_app/source_action/date range. Lets the agent answer 'how many deals did I close this month?' without re-pulling.\n\n4. **Dashboard primitives**.\n Web UI: a /dashboards page or per-workflow analytics tab that queries pulled_record. Charts via whatever the web stack uses (Recharts is fine if not already chosen).\n\n5. **Migration to per-domain tables (optional, post-v1)**.\n pulled_record(payload jsonb) is fine for v1 but will get slow at volume. v2 can typed-shred frequently-queried sources into their own tables (hubspot_deal, gcal_event, etc.) generated from action schemas. Defer.\n\nAcceptance:\n- User says 'every morning sync my HubSpot deals so I can chart them later' — agent calls save_workflow with run_action + persist steps + cron trigger\n- Next morning's run leaves N rows in pulled_record\n- Re-running the workflow upserts (no duplicates) by external_id\n- A simple /dashboards page renders 'deals pulled per day' from pulled_record without re-hitting Zapier\n\nDepends on: foreman-8k0g (save_workflow), foreman-8dyy (run_workflow), foreman-caqf (cron trigger). Without those, the persist step has no caller.","notes":"UI stack decision: stay on shadcn. Web package already has full shadcn setup (components.json style=radix-maia, 23 components, Tailwind v4, Lucide). Charts via 'npx shadcn add chart' — zero new runtime deps, wraps Recharts but reads our CSS variables for theming. Tables via existing react-data-grid plus shadcn data-table recipe. Tremor explicitly rejected — would clash with shadcn design language. Realtime via SWR + Supabase postgres_changes when added.","status":"open","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:05:00Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-vld2","title":"Prompt v3 — point existing workflow offers at new tools, drop zapier.com fallback","description":"Once save/run/trigger tools exist, the prompt rewrite is small: replace the dangling 'Want me to save this as a workflow?' line with concrete tool examples, and add a hard rule that the agent NEVER tells a user to go to zapier.com — instead it offers save_workflow + attach_trigger.\n\nScope:\n1. agents/src/lib/prompt-template.ts:\n - Replace the existing 'save as workflow' offers (lines 127, 243) with multishot examples showing save_workflow + attach_trigger calls.\n - Add a new \u003cdo_not_redirect\u003e section: 'You never instruct the user to use zapier.com. If a request is multi-step or event-triggered, propose save_workflow + attach_trigger.'\n - Strengthen Phase 4 read-execution: example of running a read without confirmation.\n - Add anti-exploration-loop rule: 'If you have already called list-connections + list-apps once in this turn, stop discovering and propose run-action or save_workflow.'\n2. Re-run npm run datasets:experiment -- --full + npm run datasets:analyze.\n3. Compare per-category averages against the 0.094 trajectory / 0.264 judge baseline. Per-category targets:\n - channel-triggered-workflow: 0.226 → 0.50+\n - save-as-workflow: 0.150 → 0.55+\n - scheduled-workflow: 0.208 → 0.45+\n - data-question: 0.117 → 0.50+\n - overall judge: 0.264 → 0.45+\n\nDepends on the workflow tool tasks landing first — without those, the agent still cannot deliver on the prompt's offers.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:03:10Z","created_by":"HamChowderr","updated_at":"2026-05-10T20:15:22Z","started_at":"2026-05-10T20:12:02Z","closed_at":"2026-05-10T20:15:22Z","close_reason":"Prompt v3 shipped: \u003cdo_not_redirect\u003e, \u003cno_exploration_loops\u003e, sharper Phase 4 read example, Phase 5 chained save+trigger guidance, new scheduled-workflow + channel-triggered-workflow examples. 4 new unit tests cover the additions. Eval re-run (datasets:experiment --full) deferred since it costs credits — run when ready to compare against the 0.094/0.264 baseline.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1oxu","title":"Web UI: /workflows page + /workflows/:id detail + run history","description":"So users can see, rename, run, and disable their saved automations from the dashboard. This is also the 'pulling data into UI/dashboards' surface you mentioned wanting.\n\nScope:\n1. packages/web/src/app/workflows/page.tsx — list view: name, description, last run, enabled toggle, run-now button.\n2. packages/web/src/app/workflows/[id]/page.tsx — detail view: step list (read-only or editable), trigger list, run history panel.\n3. packages/web/src/app/workflows/[id]/runs/[runId]/page.tsx — single run detail: per-step inputs, outputs, errors, duration. Mirrors the SSE stream from run_workflow.\n4. packages/web/src/lib/api-client.ts — typed client methods for /workflows/* routes.\n5. Server components fetch via fetch() with the user's Supabase JWT; client components use SWR for the toggles/run-now interactions.\n6. Add a 'Workflows' nav entry to the existing layout.\n\nOut of scope here: workflow editor (drag-drop step builder). Editing happens via agent chat for now — UI is read-mostly for v1.\n\nAcceptance:\n- New workflow saved via agent appears on /workflows within seconds\n- Clicking through to detail shows steps and any run history\n- Disable toggle persists and prevents future runs\n- Run-now button kicks off /workflows/:id/run and surfaces stream output\n- Mobile layout works (this is a primary UI for non-power users)","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:02:47Z","created_by":"HamChowderr","updated_at":"2026-05-10T20:26:55Z","started_at":"2026-05-10T20:16:55Z","closed_at":"2026-05-10T20:26:55Z","close_reason":"Web /workflows pages shipped: list, detail (steps/triggers/runs), and run detail. Agent server gained PATCH for workflow name + PATCH for trigger.enabled. Same-origin /api/workflows/* proxy keeps the Supabase JWT off the browser. Sidebar entry added. Per-step run trace is the only roadmap item left for a v2.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-caqf","title":"Workflow triggers — attach_trigger tool + cron driver + channel-binding","description":"Triggers are the 'when Y happens' half of 'make X happen when Y happens'. Without them, saved workflows are just on-demand scripts. With them, Foreman closes the loop — exactly what users go to zapier.com for today.\n\nThree trigger types to support, in order:\n\n1. **Channel webhook trigger** (cheapest — handlers already exist).\n - Bind a saved workflow to a channel event (e.g., 'when I get a Slack DM in #ops, run workflow X')\n - New table: workflow_trigger { id, workflow_id, type: 'channel'|'cron'|'poll', config jsonb, enabled bool }\n - Channel handlers (slack/discord/telegram/webhook-handler.ts) look up matching triggers and dispatch to /workflows/:id/run\n - Agent tool: attach_trigger({ workflowId, type: 'channel', config: { channel: 'slack', match: { ... } } })\n - DB migration in supabase/migrations/\n\n2. **Cron trigger** (for 'every morning at 9 am send me my GCal').\n - New service: agents/src/lib/triggers/cron-runner.ts — long-running node-cron-style worker that polls workflow_trigger WHERE type='cron' AND enabled=true and fires runs on schedule.\n - On VPS: PM2 process. On Vercel: deferred (cron jobs there have a 60s wall-clock limit unsuitable for chained Zapier actions).\n - Agent tool extension: attach_trigger({ workflowId, type: 'cron', config: { schedule: '0 9 * * *' } })\n\n3. **Polling trigger** (for 'when a new row appears in this Sheet').\n - Until Zapier's Triggers API ships (May 2026), Foreman polls a Zapier 'read' action periodically and diffs against last-seen state to detect new items.\n - Same cron-runner infrastructure, type='poll', config: { app, action, connection, inputs, dedupeKey }.\n - This is the only sketchy part — relies on Zapier read actions being deterministic and orderable. Can defer until v2 of triggers.\n\nAcceptance:\n- 'When someone DMs me on Slack starting with !standup, run my standup workflow' works end-to-end\n- 'Every weekday at 8am email me my GCal' works end-to-end\n- workflow_trigger has soft-delete or enable/disable so users can pause without losing config\n- Polling trigger explicitly out-of-scope for v1 if it adds risk","notes":"Bookkeeping layer landed: workflow_trigger table (cron|channel|poll), POST/GET/DELETE /:id/triggers routes, attach_trigger + list_workflow_triggers + detach_trigger tools wired into Foreman, prompt updated, 9 unit tests + 3 live tests pass. Next: cron driver process + channel webhook integration.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:02:33Z","created_by":"HamChowderr","updated_at":"2026-05-10T20:06:05Z","started_at":"2026-05-10T19:37:22Z","closed_at":"2026-05-10T20:06:05Z","close_reason":"Workflow triggers shipped: workflow_trigger table + 3 routes + 3 agent tools (attach/list/detach) + cron driver worker (timezone-aware 5-field cron, last-fired dedup) + channel-trigger matcher wired into all 8 chat bots (slack/discord/telegram/linear/github/gchat/teams/whatsapp). 27 new unit tests + 3 new live tests.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ajqu","title":"Foreman prompt v3 — fix top-3 failure modes from baseline","description":"The v2 baseline (trajectory=0.094, judge=0.264 across 80 items) revealed three systemic problems in agent behavior, all visible in LLM judge reasoning:\n\n1. **Zapier.com redirects.** Agent tells users to go to zapier.com instead of walking through the action shape and offering to save as a Foreman workflow. The current prompt says 'do not redirect' but agent still does it for save-as-workflow and channel-triggered-workflow categories. These are the two largest buckets (47+7=54 of 80 items). Need a stronger, examplar-backed rule.\n\n2. **Premature clarification on clear read intents.** For data-question items like 'Show me my recent contacts in HubSpot tagged lead', agent asks 'which lead status?' instead of immediately running the read action. Phase 4 says read actions execute without confirmation but the agent does not internalize this.\n\n3. **Exploration loops.** Agent calls list-connections -\u003e list-apps -\u003e list-connections repeatedly without progressing to run-action. find-first-connection used in place of find-unique-connection. Need a 'don't re-call the same discovery tool with the same args' rule and explicit guidance on which connection finder to use.\n\nPer-category baseline:\n- channel-triggered-workflow (n=47): traj=0.000, judge=0.226\n- save-as-workflow (n=7): traj=0.000, judge=0.150\n- scheduled-workflow (n=6): traj=0.000, judge=0.208\n- data-question (n=3): traj=0.000, judge=0.117\n\nWorking: platform-meta=0.95, connect-app=0.90, clarification-needed=0.675\n\nWORK:\n1. Edit src/lib/prompt-template.ts to add a \u003cdo_not_redirect\u003e XML section with two negative examples (showing what NOT to do — generic Zapier guidance) and two positive ones (walking through action shape + save-as-workflow offer).\n2. Strengthen Phase 4 read-execution rule with an example.\n3. Add anti-exploration-loop rule: if you've called list-connections and list-apps in this turn, stop discovering and propose run-action.\n4. Replace find-first-connection guidance with find-unique-connection where appropriate.\n5. Re-run npm run datasets:experiment -- --full and npm run datasets:analyze. Compare per-category averages against this baseline.\n\nACCEPTANCE:\n- judge avg improves from 0.264 by at least +0.10 (target 0.36+)\n- channel-triggered-workflow judge from 0.226 to 0.40+\n- data-question judge from 0.117 to 0.40+\n- save-as-workflow judge from 0.150 to 0.35+\n\nFiles to touch: src/lib/prompt-template.ts only. No tooling changes needed — pipeline is working.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-05-09T21:38:29Z","created_by":"HamChowderr","updated_at":"2026-05-09T22:03:19Z","closed_at":"2026-05-09T22:03:19Z","close_reason":"Superseded by foreman-v8k1 epic. The original v3 prompt issue assumed prompt was the bottleneck, but SDK audit confirmed the real gap is missing agent tools (no save_workflow, no attach_trigger). Prompt v3 is now scoped under foreman-v8k1 as a child task that depends on tool work landing first.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gkwa","title":"Foreman dataset experiment scorer — build custom trajectory scorer","description":"The Mastra built-in createTrajectoryAccuracyScorerCode silently returns score 0 for all Foreman experiment items. Root cause: its extractTrajectory function reads message.content.toolInvocations (legacy AI SDK shape), but Mastra's current agent output uses output.toolCalls[].payload.toolName. The trace-store extraction path also doesn't activate (observability tracing isn't wired into the scorer's preprocess step).\n\nVALIDATED:\n- Pipeline runs end-to-end. mini experiments succeed 2/2 fail 0.\n- Agent executes the expected tool sequence correctly (confirmed by inspecting output.toolCalls in the experiment results API).\n- expectedTrajectory and requestContext are correctly populated on all 80 items in foreman-baseline-v1 (must be set via updateItem — addItem silently drops them).\n- observationalMemory was disabled on foreman agent to unblock the experiment runner (input processor required threadId in RequestContext that the runner doesn't inject).\n\nWORK:\n1. Build a custom scorer with createScorer({type: 'agent'}) that:\n - Reads run.output.toolCalls (the actual Mastra shape)\n - Compares the actual tool sequence to run.expectedTrajectory.steps\n - Returns score 0.0-1.0 based on relaxed-ordering match\n - Honors blacklistedTools from run.expectedTrajectory\n - Score 1.0 when expected is empty steps AND no tools were called (handles clarification/out-of-scope cases that the built-in scorer rejects with error)\n2. Wire it into scripts/datasets-experiment.ts replacing createTrajectoryAccuracyScorerCode.\n3. Validate with mini before re-running on all 80.\n4. Add an LLM-judge accuracy scorer against groundTruth.expected_behavior as a second dimension.\n\nACCEPTANCE:\n- Mini experiment scores 1.0 on each test case (Slack write hits all expected tools; ambiguous case has no tools and matches empty expected).\n- Full 80-item experiment baselines a real avg score that we can compare against after prompt v2 changes (foreman-dqzb).\n\nDEPENDS ON: foreman-ib6z (still in_progress; this is the next step within it)","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T19:44:02Z","created_by":"HamChowderr","updated_at":"2026-05-09T20:01:05Z","started_at":"2026-05-09T19:46:15Z","closed_at":"2026-05-09T20:01:05Z","close_reason":"Validated end-to-end. v1 prompt rewrite passes 4 example tests; custom trajectory scorer produces signal (mini scored 1.0 on ambiguous, 0 on Slack with detailed reason; full 80-item run produced 0.20 avg trajectory match across 41 successful items).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mebm","title":"Improve Foreman 9-step run-action prompt","description":"The current Action Execution Flow in lib/prompt-template.ts:48-58 works but has 5 specific friction points that show up across real automation requests.\n\nPROPOSED IMPROVEMENTS:\n\n1. Two-pass schema fetch is buried mid-flow.\n Currently steps 4 + 6 alternate with selector resolution. Move to its own labeled 'Schema Discovery' subsection so the agent doesn't conflate fetch with selector resolution.\n\n2. Confirmation step (step 8) is free-form.\n Tighten to a structured template (app, action, key fields, connection name). Stable confirmation behavior makes it scoreable in the dataset.\n\n3. Pre-flight check missing.\n Before find-unique-connection, no nudge to opportunistically run list-connections when a request mentions multiple apps. Saves round-trips for multi-app flows.\n\n4. No save-as-workflow nudge after success.\n The 9-step flow ends at run-action. Add step 10: offer to save successful chains as a reusable workflow. Surfaces the saved-workflows feature naturally.\n\n5. Tables vs run-action triage missing up front.\n Existing prompt warnings (lines 46, 60) are reactive — agents have hallucinated run-action({app: 'zapier-tables'}). Add a one-sentence triage rule before step 1: 'If the user is asking about Zapier Tables (tables, records, rows in my Zapier Table), STOP and use the Tables flow.'\n\nACCEPTANCE:\n- Updated prompt at lib/prompt-template.ts\n- Before/after diff visible\n- Re-run dataset experiment after change to measure quality delta (this depends on the dataset issue being far enough along to baseline)\n\nDEPENDS ON: dataset baseline (so we know if changes regress quality)","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T17:11:52Z","created_by":"HamChowderr","updated_at":"2026-05-09T20:01:04Z","started_at":"2026-05-09T17:13:14Z","closed_at":"2026-05-09T20:01:04Z","close_reason":"Validated end-to-end. v1 prompt rewrite passes 4 example tests; custom trajectory scorer produces signal (mini scored 1.0 on ambiguous, 0 on Slack with detailed reason; full 80-item run produced 0.20 avg trajectory match across 41 successful items).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ib6z","title":"Build Foreman quality regression dataset","description":"Use Mastra Datasets API to track agent quality across prompt/model changes.\n\nCURRENT STATE:\n- 80 raw cases collected at packages/agents/datasets/foreman-cases-raw.json (gitignored)\n- @mastra/pg PostgresStore confirmed to support datasets domain (DatasetsStorage class verified at node_modules/@mastra/pg/dist/index.js:4835)\n- @mastra/core 1.32.1 (well past 1.4.0 when Datasets shipped)\n- MastraCompositeStore in packages/agents/src/mastra/index.ts:50 already routes datasets to Postgres by default\n\nWORK REMAINING:\n1. Filter raw cases — drop platform-meta and pure support-question entries unless we want Foreman to handle those too\n2. Label each case with expected_behavior grounded in the actual system prompt (lib/prompt-template.ts) and Foreman's capabilities (run-action, save-as-workflow, scheduled workflows, channel triggers, Tables, connect_zapier)\n3. Decide on scoring approach — accuracy + trajectory scorers most likely\n4. Smoke test: create dataset via mastra.datasets.create, add 5 items, list them back\n5. Wire npm run test:quality script that runs the dataset against Foreman agent\n6. CI integration on PR\n\nACCEPTANCE:\n- mastra_datasets / mastra_dataset_items tables visible in Supabase Studio\n- At least 30 labeled cases with expected_behavior\n- Reproducible experiment that scores Foreman against the dataset\n- Documented baseline score before next prompt change\n\nDESIGN NOTES:\n- Categories: one-shot-action, save-as-workflow, scheduled-workflow, channel-triggered-workflow, tables-crud, data-question, connect-app, clarification-needed, support-question, out-of-scope\n- Trajectory scoring matters (did agent call the right tools in the right order) at least as much as text quality\n- Dataset versioning lets us pin experiments to a snapshot — use it","notes":"BASELINE ESTABLISHED 2026-05-09: 80/80 items succeeded with prompt caching enabled. Cost $2.45, runtime 7.9 min, 93.3% cache hit rate. Avg trajectory-match score 0.094 across 80. The score is artificially deflated by over-strict template-generated expected_tools labels (e.g., requiring two-pass schema fetch for actions that don't have dynamic columns). Real quality is materially higher. The 0.094 is now the baseline number for future prompt-change comparisons. Experiment id: visible in Studio at /datasets/1daa52c0-3a9a-49f1-89d3-f698946619cc → Experiments tab. To improve label calibration: rewrite expected_tools to match observed agent flows for each category, or add an LLM-judge accuracy scorer as a second dimension.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T17:11:39Z","created_by":"HamChowderr","updated_at":"2026-05-09T20:16:49Z","started_at":"2026-05-09T17:13:11Z","closed_at":"2026-05-09T20:16:49Z","close_reason":"Baseline established with 80/80 success and $2.45 cost. Real quality measurement is the comparison delta on future runs, not the absolute 0.094. Open follow-ups: foreman-dqzb (prompt v2 refinements), label calibration is a future-Tuesday.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-buf4","title":"Wire Mastra Studio Editor + Observability + DuckDB","description":"Three Studio surfaces broken in dev: (1) Editor tab missing because no MastraEditor instance was registered on the Mastra config; (2) Observability tab gated behind OTEL_ENABLED=true env var so empty by default; (3) Logs/Metrics/Traces tabs returning 500 because PostgresStore doesn't implement the observability domain (Mastra docs say Postgres is unsupported for observability — needs OLAP). Fix: add MastraEditor, make Observability always-on, wrap PostgresStore in MastraCompositeStore routing observability domain to DuckDB.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-05-09T01:37:57Z","created_by":"HamChowderr","updated_at":"2026-05-09T01:38:11Z","closed_at":"2026-05-09T01:38:11Z","close_reason":"Implemented in 2b93e00 + b7a309d (depends on duckdb).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ol1e","title":"Upgrade Foreman dependencies one-by-one","description":"Methodical dep upgrade pass on packages/agents — apply each bump independently, build + test after each, stop on first regression. Order: chat-adapter family, ai, hono, supabase-js, mastra side-deps (evals/observability/pg/memory/editor/deployers), then coordinated mastra core+CLI, then zod override bump. Skip majors (hono/node-server 2.x, types/node 25, typescript 6, zapier-sdk 0.48) — those need explicit decisions.","notes":"Completed upgrade pass: chat-adapter family 4.26→4.28.1 (9 pkgs + chat), ai 6.0.168→6.0.177, hono 4.12.14→4.12.18, supabase-js 2.104→2.105.4, @mastra/evals 1.2.1→1.2.2, @mastra/observability 1.10→1.11.1. Caught conflict at @mastra/pg 1.10 (peer requires core\u003e=1.32) — pivoted to coordinated mastra core+CLI bump: @mastra/core 1.26→1.32.1, mastra CLI 1.6→1.8.1, @mastra/memory 1.16→1.17.5, @mastra/pg 1.10.0, @mastra/editor 0.7.23, @mastra/deployer-* 1.1.32/1.1.26. Also bumped zod override 4.3.6→4.4.3 and Zapier SDK 0.41.2→0.48.0 + CLI 0.39.11→0.44.0 (after changelog read). Discovered hoisting issue: workspace root node_modules pinned old core via subpackage transitive deps; fixed with @mastra/core override to 1.32.1. mastra dev boots in 2.6-5.6s. All 224 tests pass (incl. 7 new regression tests in foreman-854t). Skipped majors: @hono/node-server 2.x, @types/node 25, typescript 6 — need explicit decisions.","status":"closed","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-08T22:48:40Z","created_by":"HamChowderr","updated_at":"2026-05-09T00:14:12Z","started_at":"2026-05-08T22:48:50Z","closed_at":"2026-05-09T00:14:12Z","close_reason":"Upgrade pass complete; all bumps verified, regression tests added in foreman-854t.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-g8pl","title":"Upgrade @mastra/* stack and mastra CLI to fix Studio toJSONSchema error","description":"Even with Zapier SDK removed, mastra dev errors with [toJSONSchema]: Non-representable type encountered: optional from a Mastra Studio internal route schema. mastra@1.6.0 + @mastra/core@1.26.0 + zod 4.3.6 is the broken combo. mastra@1.8.1 bundles past the previous failure point but @mastra/core@1.26 lacks the agent/durable/index.js that 1.8.1 expects — needs a coordinated upgrade. Bump to mastra@1.8+ and @mastra/core@1.32+ together (matches blank-mastra-test which boots cleanly).","notes":"No longer needed — zod dedup (foreman-iibc) resolves the toJSONSchema issue without requiring a Mastra core upgrade. The 'Non-representable type' error was triggered by inconsistent zod state across 9 copies, not an actual @mastra/core 1.26 bug. With single zod 4.3.6 in node_modules, mastra@1.6.0 + @mastra/core@1.26 + zod 4.3.6 boots cleanly. Defer this upgrade until there's a concrete need (security, new feature).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-05-08T07:59:58Z","created_by":"HamChowderr","updated_at":"2026-05-08T22:44:18Z","closed_at":"2026-05-08T22:44:18Z","close_reason":"Obsolete after zod dedup — see notes.","dependencies":[{"issue_id":"foreman-g8pl","depends_on_id":"foreman-i2se","type":"discovered-from","created_at":"2026-05-08T00:59:58Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-iibc","title":"Deduplicate zod across packages/agents workspace","description":"5 copies of zod exist in node_modules: 4.2.1 inside @zapier/zapier-sdk-*, 4.3.6 in packages/agents and various mastra deps, 3.25.76 at repo root. Multiple zod copies share state via Symbol(_zod) which can cause toJSONSchema hangs/loops when packages disagree on schema internals. Pin a single zod version via npm overrides in root package.json and verify mastra dev no longer hangs even without lazy-init fix.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-08T07:59:54Z","created_by":"HamChowderr","updated_at":"2026-05-08T22:43:29Z","started_at":"2026-05-08T22:39:24Z","closed_at":"2026-05-08T22:43:29Z","close_reason":"Combined fix: lazy-init Zapier SDK (foreman-dt3u) + zod dedup via npm override to 4.3.6 (foreman-iibc) unblocks mastra dev. Verified: builds clean, all 221 unit tests pass, mastra dev boots in 3.3s with API at :4111/api and Studio at :4111. Single zod copy (4.3.6) consolidates from 9 versions across @zapier/* and other deps.","dependencies":[{"issue_id":"foreman-iibc","depends_on_id":"foreman-i2se","type":"discovered-from","created_at":"2026-05-08T00:59:54Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-i2se","title":"Bisect mastra dev hang in packages/agents init","description":"Hypothesis confirmed: bug is Foreman-specific (blank Mastra works). Bisect packages/agents/src/mastra/index.ts by stripping pieces (5 agents, workflow, observability, custom middleware, apiRoutes, validateAgentCapabilities) until mastra dev boots, then re-add to find the trigger. Reference: vault note reference_foreman_mastra_dev_hang.md","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-08T07:33:44Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","started_at":"2026-05-08T07:33:54Z","closed_at":"2026-05-08T07:59:46Z","close_reason":"Bisect complete. Trigger: createZapierSdk() called before new Mastra() during mastra dev. Filed follow-ups for fix paths. Findings written to vault note reference_foreman_mastra_dev_hang.md.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-j391","title":"Parallel tool calls for bulk operations","description":"Added instruction to system prompt telling the agent to issue all run-action calls in a single response step for bulk operations (e.g., adding 5 contacts). Claude supports parallel tool calls natively — the agent just wasn't instructed to use them. Also updated confirmation to summarize all items at once instead of per-item.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-29T17:52:07Z","created_by":"HamChowderr","updated_at":"2026-04-29T17:52:16Z","closed_at":"2026-04-29T17:52:16Z","close_reason":"Implemented","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1isf","title":"Seed app catalog for semantic app suggestions","description":"The app catalog vector search is fully wired into the contextInjector input processor but the app_catalog table has never been seeded. Running seedCatalog() will pull 9,000+ Zapier apps, store them in app_catalog, and embed them into catalog_vectors PgVector index. Until seeded, the app suggestion hints injected on every message return nothing. Need to run the seed script once against the production DB.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-29T17:51:52Z","created_by":"HamChowderr","updated_at":"2026-04-29T18:22:38Z","closed_at":"2026-04-29T18:22:38Z","close_reason":"Seeded 6,243 apps from Zapier SDK, all embedded into catalog_vectors PgVector index. Fixed Supabase 1000-row pagination cap in seed.ts.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-c2ke","title":"Update CLAUDE.md: remove Clerk refs, add Supabase auth/env docs","description":"CLAUDE.md Auth section still documents Clerk JWT + @mastra/auth-clerk. Env vars section lists Clerk keys. Both need updating to reflect Supabase Auth (SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY on agents; NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY on web).","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-26T07:32:11Z","created_by":"HamChowderr","updated_at":"2026-04-26T07:34:02Z","started_at":"2026-04-26T07:32:25Z","closed_at":"2026-04-26T07:34:02Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mmsw","title":"Workflow template sharing across users","description":"Today the workflow table is hard user-scoped (schema.ts:89-101, userId NOT NULL, no template/public flag). Steps embed raw connection IDs tied to the owner's Zapier account (engine.ts:92, save.ts:109). To support sharing:\\n\\n1. Schema: add is_template flag (or separate workflow_template table) + share/clone mechanism\\n2. Depends on foreman-qv24 (named connections) so step JSON is portable across users\\n3. UI: template browse/clone flow; on clone, prompt importer to map each named connection to their own Zapier connection\\n4. API routes: /workflows/templates list, /workflows/:id/clone\\n5. Decide scope: org-shared only, or public marketplace-style","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-22T07:27:09Z","created_by":"HamChowderr","updated_at":"2026-04-22T17:44:12Z","closed_at":"2026-04-22T17:44:12Z","close_reason":"Phase 1 done: workflow template sharing implemented. Schema: added is_template and cloned_from columns (migration 0002). Routes: GET /workflows/templates (public list), PATCH /workflows/:id (toggle isTemplate), POST /workflows/:id/clone (copy to caller; strips numeric connectionIds, preserves alias strings). Verified server boots and routes respond (401 = auth working). Root cause of earlier Mastra boot hang was @mastra/core@1.26.0 observability schema bug — pinned core to 1.25.0 + mastra CLI to 1.6.0 as part of this fix. Phase 2 (UI for browse/clone/publish) separate work.","dependencies":[{"issue_id":"foreman-mmsw","depends_on_id":"foreman-qv24","type":"blocks","created_at":"2026-04-22T00:27:15Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-qv24","title":"Named connections in workflow step definitions","description":"Workflow steps currently embed raw numeric connection IDs (e.g. 12345) in proposalTemplate JSON, tying workflows to a specific user's Zapier account. Named connections let step JSON reference aliases like 'slack_work', with per-user/per-env mapping supplied via createZapierSdk({ manifest: { connections: {...} } }). Only worth it if we plan to share workflow definitions across users/environments or want human-readable JSON.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-22T07:14:46Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-22T07:35:15Z","close_reason":"Phase 1 done: added connection_alias table (migration 0001), resolveConnection() helper in lib/zapier/aliases.ts, wired into runAction + rawFetch in execution.ts. Numeric IDs pass through unchanged (backward compatible); alias strings are looked up per-user. Phase 2 (auto-create aliases on connect, API routes, UI for mapping) is separate work — file a new bead if/when needed, this ticket unblocks the workflow sharing dependency.","dependencies":[{"issue_id":"foreman-qv24","depends_on_id":"foreman-blmn","type":"blocks","created_at":"2026-04-22T00:14:55Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-4j9","title":"Refactor getSharedSdk to use native SDK client_credentials","description":"sdk.ts:16-58 manually POSTs to zapier.com/oauth/token with grant_type=client_credentials and caches expiry. The SDK natively supports this via createZapierSdk({ credentials: { clientId, clientSecret } }) and handles refresh internally. Removing the manual flow deletes ~40 lines with no behavior change.","status":"closed","priority":2,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-22T07:13:30Z","created_by":"HamChowderr","updated_at":"2026-04-22T07:18:00Z","closed_at":"2026-04-22T07:18:00Z","close_reason":"Replaced manual client_credentials POST + cache (sdk.ts:13-58) with native createZapierSdk({ credentials: { clientId, clientSecret } }). SDK handles token exchange and refresh internally. ~40 lines removed, dev server hot-reloaded cleanly.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mh4","title":"Port maxSteps to stopWhen(stepCountIs(N)) — AI SDK v6 migration","description":"AI SDK v6 removed maxSteps. Linter flags it on packages/agents/src/mastra/index.ts line ~189 (the /chat/:agentId handler calling agent.stream with { maxSteps: 15 }). Migration: import { stepCountIs } from 'ai'; change maxSteps: 15 to stopWhen: stepCountIs(15). Also appears in channel bots (discord/slack/telegram/teams/gchat/imessage/github/linear/whatsapp) — verify all sites. Blocks clean builds on newer ai-sdk releases.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T15:43:28Z","created_by":"HamChowderr","updated_at":"2026-04-25T20:50:08Z","started_at":"2026-04-25T20:42:57Z","closed_at":"2026-04-25T20:50:08Z","close_reason":"Replaced maxSteps with stopWhen(stepCountIs(N)) across all 10 call sites (9 bots + mastra/index.ts). tsc clean, 18 SDK tests pass.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-d2o","title":"Duplicate ChatShell render in web chat layout","description":"/chat route renders the AppSidebar + ChatShell twice — both ref_22 and ref_46 \u003cmain\u003e regions in the a11y tree show the same empty state ('What can I help with?'), same sample prompt buttons, same input textbox. Root cause is likely the layout.tsx rendering ChatShell inside SidebarInset while the page.tsx (which returns null) still mounts something via its route tree. Needs investigation into whether shadcn sidebar is rendering both desktop + mobile Sheet (expected, hidden via CSS) or a genuine duplicate. Either remove the duplicate, or add 'hidden md:flex' / 'md:hidden' gating so only one renders at each breakpoint.","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T07:40:13Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:29:01Z","started_at":"2026-04-25T20:43:02Z","closed_at":"2026-04-25T22:29:01Z","close_reason":"False positive / stale. Static analysis confirms only one SidebarInset (\u003cmain\u003e) in the chat route, one ChatShell render, and both page.tsx files return null. No duplicate found. Issue was filed the day after the AI Elements restructure commit — likely saw a transient state during initial development or a11y tool mis-identification.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-qk1","title":"Port multi-provider/prompt-caching work to SDK-based tools","description":"The claude/add-multiple-providers-wXhQJ branch adds: (1) per-agent provider config (AGENT_MODELS, modelSettingsFor, systemPromptFor in lib/providers/), (2) Anthropic prompt caching + tool-schema caching (toolsWithCacheControl), (3) per-provider cost tracking (onFinishCostLogger via Agent.defaultOptions.onFinish), (4) per-agent generation params (temperature, maxOutputTokens, topP). Cannot squash-merge cleanly because the branch predates the MCP→SDK tool migration (PR #3) and its toolsWithCacheControl helper assumes MCP tool shape. Work needed: port the lib/providers/ module, rewrite toolsWithCacheControl for SDK tool shape (from generateZapierTools), apply per-agent config to all 5 agents on current main, port test suites (providers.test.ts 447 lines, provider-swap.test.ts 68 lines, AIMock smoke test). Branch at origin/claude/add-multiple-providers-wXhQJ, 14 commits ahead of old base.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-21T07:40:06Z","created_by":"HamChowderr","updated_at":"2026-04-26T00:07:40Z","closed_at":"2026-04-26T00:07:40Z","close_reason":"Ported providers layer from claude/add-multiple-providers-wXhQJ: AGENT_MODELS, modelSettingsFor, systemPromptFor, toolsWithCacheControl, onFinishCostLogger, validateAgentCapabilities. Deleted request dead code from execution agent.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hak","title":"Pre-seed connection aliases per conversation","description":"The Zapier SDK supports string aliases resolved to numeric connectionIds via a connections map passed at createZapierSdk() time. For Foreman's multi-tenant model, generateUserZapierTools(credentials) could also accept the user's known connections and pre-seed aliases like { 'sheets': 12345, 'slack': 67890 }. The agent then says connection: 'sheets' instead of re-calling find-unique-connection each turn. Saves a tool call per action. Needs: (1) fetch user's connections once at conversation start, (2) pass connections map into createZapierSdk, (3) update prompt to prefer aliases when available. Discovered from foreman-mk9.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T02:16:20Z","created_by":"HamChowderr","updated_at":"2026-04-25T22:45:32Z","started_at":"2026-04-25T22:29:46Z","closed_at":"2026-04-25T22:45:32Z","close_reason":"Done. loadUserConnectionsMap() added to aliases.ts; generateZapierTools/generateUserZapierTools accept connections; getSdkForUser pre-seeds map; contextInjector injects [Connection Aliases] system message so agent skips find-unique-connection per action.","dependencies":[{"issue_id":"foreman-hak","depends_on_id":"foreman-mk9","type":"discovered-from","created_at":"2026-04-20T19:16:20Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-tct","title":"Improve error handling and visibility in chat stream","description":"Errors are swallowed in catch blocks. Need proper error states, retry UI, and visible error messages when stream fails or agent returns errors.","status":"closed","priority":2,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T23:23:43Z","created_by":"HamChowderr","updated_at":"2026-04-20T23:47:32Z","closed_at":"2026-04-20T23:47:32Z","close_reason":"Improved error handler with specific messages for offline agent server, network errors, and aborted streams. All errors logged to dev console.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-vmt","title":"Remove dead /api/chat proxy route","description":"The /api/chat/route.ts in Next.js does manual SSE→UIMessageStream translation but is not used — transport goes directly to agent server /conversations/chat. Either remove it or repurpose as the actual proxy (for CORS/auth).","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T23:23:35Z","created_by":"HamChowderr","updated_at":"2026-04-20T23:47:25Z","closed_at":"2026-04-20T23:47:25Z","close_reason":"Removed dead /api/chat/route.ts and /api/chat/[id]/stream/route.ts plus unused schema.ts. Transport goes directly to agent server.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8o1","title":"Add speech-input voice component","description":"Wire AI Elements speech-input component to existing /voice/transcribe endpoint. TTS and ElevenLabs removed — STT only.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-20T17:31:47Z","created_by":"HamChowderr","updated_at":"2026-04-30T12:43:00Z","closed_at":"2026-04-30T12:43:00Z","close_reason":"Web Speech API mic button added to chat input toolbar. Appends transcript to input on recognition end. Returns null on unsupported browsers (Firefox).","dependencies":[{"issue_id":"foreman-8o1","depends_on_id":"foreman-km8","type":"blocks","created_at":"2026-04-20T10:32:10Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-fx0","title":"Expand app catalog coverage beyond 907 apps","description":"Current seed discovers 907 apps via 50 category keywords. Zapier has 9000+. Expand by: adding alphabetical search (a-z), adding 150+ niche keywords, paginating search results with cursors. Target: 3000+ apps.","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-20T05:43:09Z","created_by":"HamChowderr","updated_at":"2026-04-20T14:36:18Z","closed_at":"2026-04-20T14:36:18Z","close_reason":"1,889 apps discovered via 206 search terms (alphabetical + niche keywords). All embedded.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pgy","title":"Replace fragile Clerk token access with official hooks","description":"api-client.ts:8-12 accesses Clerk session via (window as any).__clerk?.session which is an internal implementation detail. Replace with Clerk's official useAuth() hook or getToken() pattern from @clerk/nextjs.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T23:57:33Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:04:55Z","closed_at":"2026-04-19T00:04:55Z","close_reason":"Replaced (window as any).__clerk with useAgentFetch() hook using Clerk's official useAuth().getToken(). Updated all 8 callers across chat-shell, chat-pane, approval-card, save-workflow-dialog, workflows/page, workflows/[id]/page.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ogo","title":"Replace custom SSE streaming layer with Mastra built-in streaming","description":"After research: Mastra MastraModelOutput does NOT have toUIMessageStreamResponse() or similar helpers — only fullStream and textStream getters. The custom SSE encoding (encodeSSE, sseHeaders) is therefore necessary for HTTP streaming. However the transformer can be improved: 1) Import and reference Mastra's actual ChunkType instead of assuming shapes 2) Remove the duplicated AppChunk type from packages/web (use a shared types package or generate from the server) 3) The transformer correctly handles chunk.payload.text, chunk.type etc — these match Mastra's real chunk format. Priority lowered since this is more of a cleanup than a bug.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T23:57:17Z","created_by":"HamChowderr","updated_at":"2026-04-19T00:11:34Z","closed_at":"2026-04-19T00:11:34Z","close_reason":"After research: Mastra MastraModelOutput does NOT have HTTP response helpers — only fullStream and textStream getters. The custom SSE encoding layer (encodeSSE, sseHeaders, createChunkTransformer) is necessary and correct. Chunk shapes (chunk.type, chunk.payload, chunk.runId) match Mastra's actual ChunkType. The duplicated AppChunk type between packages is a minor cleanup, not a functional issue. No changes needed — the custom streaming layer is the right approach for Mastra.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-370","title":"Voice input/output — OpenAI + Google","description":"Voice I/O: STT via OpenAI Whisper, TTS via ElevenLabs (OpenAI fallback). Channels: Web UI (mic button), Telegram (voice messages), Discord (voice messages), WhatsApp (ready, test later). Skip Slack and Google Chat. Optional per-user via capability flag. Env: ELEVENLABS_API_KEY, ELEVENLABS_VOICE_ID.","status":"closed","priority":2,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T17:51:37Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:59:45Z","closed_at":"2026-04-18T17:59:45Z","close_reason":"Done: Whisper STT + ElevenLabs TTS (OpenAI fallback), voice routes, capability flag, web UI mic button + speaker playback on agent messages.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-a6c","title":"iMessage channel setup","description":"Configure iMessage adapter, test locally. Requires macOS with Messages app access.","status":"deferred","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T16:21:12Z","created_by":"HamChowderr","updated_at":"2026-06-11T08:32:58Z","defer_until":"2026-12-11T08:00:00Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dtn","title":"WhatsApp channel setup","description":"Set up Meta Business account, WhatsApp Business API, configure webhook, test locally via ngrok","status":"closed","priority":2,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-18T16:20:00Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: WhatsApp channel fully built — whatsapp/bot.ts, webhook, env, identity, docs; 81a3dd5.","defer_until":"2026-12-11T08:00:00Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-6qm","title":"Complete Teams setup — need M365 license or developer program","description":"Teams bot is registered in Azure (foreman-bot, foreman-rg), endpoint set, Teams channel enabled. Blocked on M365 license — admin@otakusolutions.io has Azure sub but no M365. Options: join M365 dev program (free 90-day sandbox) or add M365 Business Basic. Manifest zip ready at packages/agents/foreman-teams-app.zip.","status":"deferred","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T15:09:28Z","created_by":"HamChowderr","updated_at":"2026-06-11T08:33:08Z","defer_until":"2026-12-11T08:00:00Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-x1b","title":"Zapier connect flow for non-web channels","description":"For Telegram/MCP users who need to connect Zapier: generate a one-time connect URL that links to the OAuth flow. Bot sends the URL, user clicks, completes OAuth in browser, tokens stored against their Foreman user ID. Works for any channel.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:49Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:31:45Z","closed_at":"2026-04-18T05:31:45Z","close_reason":"Connect flow: one-time token URL, Zapier OAuth round-trip, encrypted token storage. connect_zapier tool for agents. Telegram/MCP users click link to connect.","dependencies":[{"issue_id":"foreman-x1b","depends_on_id":"foreman-53m","type":"blocks","created_at":"2026-04-17T22:13:07Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-eii","title":"Add HTTP trigger workflows (Zapier webhooks)","description":"Accept incoming Zapier webhooks and process events via Mastra workflow steps. Complement existing cron workflows.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:56Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:31:46Z","closed_at":"2026-04-18T05:31:46Z","close_reason":"POST /webhooks/zapier route, webhook-handler workflow (validate → process by event type), optional secret, fire-and-forget pattern.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-285","title":"Add model routing (multi-model strategy)","description":"Haiku for tool discovery (fast/cheap), Sonnet for execution, Opus for complex reasoning. Configure per-tool or per-subagent model routing.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:54Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:33:32Z","closed_at":"2026-04-18T04:33:32Z","close_reason":"MODELS constant: Sonnet 4 (default), Haiku 4.5 (fast). Title gen uses fast model. Scorers use fast model.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-33b","title":"Add dynamic config (template-based system prompt)","description":"Template system prompt with user context: connected apps, recent actions, preferences. Swap instructions per user via dynamic config pattern.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:53Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:33:31Z","closed_at":"2026-04-18T04:33:31Z","close_reason":"Dynamic prompt template with connectedApps/recentActions/preferences context injection. Per-request override via body.context.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ast","title":"Add RAG/document chunking for action history","description":"Index user's Zapier action history and past conversations into vector store for better action recommendations. Use Mastra's document chunking pipeline.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:52Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:42:25Z","closed_at":"2026-04-18T05:42:25Z","close_reason":"RAG pipeline: indexActionRun() chunks and embeds action history, searchActionHistory() for semantic search, search_history tool on agent. Auto-indexes after action approval.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-upk","title":"Add structured output for proposals and summaries","description":"Use agent structured output for typed proposal generation, action summaries, and conversation exports instead of raw text parsing.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:51Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:33:32Z","closed_at":"2026-04-18T04:33:32Z","close_reason":"Title generation uses structured output with Zod schema (z.object({ title: z.string().max(80) })). Reads titleResult.object.title.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-zcq","title":"Integration tests for A2A and MCP protocol endpoints","description":"Build the agent server, start it, and test: POST /a2a/foreman (JSON-RPC), GET /.well-known/foreman/agent-card.json, /mcp/* endpoints. Verify protocols respond correctly with the Foreman agent.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:46:46Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:53:15Z","closed_at":"2026-04-18T03:53:15Z","close_reason":"7 integration tests: agent card discovery (2), A2A JSON-RPC (3), MCP endpoints (2). Auto-skip when server not running.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-a90","title":"Add Mastra Workspace (file/sandbox access)","description":"Enable workspace on Foreman agent: LocalFilesystem + LocalSandbox. Lets agent read/write files and execute commands for data export, config generation.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:13Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:54:23Z","closed_at":"2026-04-18T03:54:23Z","close_reason":"Workspace added: LocalFilesystem (./data/workspace, contained), LocalSandbox, BM25 search, requireApproval on writes. Available in @mastra/core@1.25.0.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-omd","title":"Add scheduled workflows (daily summary, health checks)","description":"Mastra cron workflows: daily Zapier activity summary, connection health check, stale conversation cleanup. Use .then() .parallel() patterns.","status":"closed","priority":2,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:12Z","created_by":"HamChowderr","updated_at":"2026-04-18T04:00:15Z","closed_at":"2026-04-18T04:00:15Z","close_reason":"Two workflows created: daily-summary (conversations + actions in last 24h) and health-check (Zapier connections). Registered on Mastra instance. Cron scheduling deferred to runtime config.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-84r","title":"Error surfaces for all known failure modes","description":"Every typed error has a matching user-facing message and suggested remediation. AC: Manual QA checklist: expired token, rate limit, action failure, capability denied, no connection for app.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:28:12Z","created_by":"HamChowderr","updated_at":"2026-04-17T21:59:16Z","closed_at":"2026-04-17T21:59:16Z","close_reason":"Implemented: error styling, Zapier error code mapping (RATE_LIMITED, CAPABILITY_DENIED, ACTION_FAILED, REAUTH_REQUIRED), better network error messages","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7ca","title":"Conversation title auto-generation","description":"After first user message, generate 3-5 word title via small LLM call. Store on conversation. AC: New conversations show meaningful titles in sidebar.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:28:11Z","created_by":"HamChowderr","updated_at":"2026-04-17T21:59:15Z","closed_at":"2026-04-17T21:59:15Z","close_reason":"Implemented: LLM-generated 3-5 word titles after first response, title-updated SSE chunk, sidebar real-time update","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-q23","title":"Hosted multi-tenant mode","description":"Default mode. No change needed if T45 (token refresh) works — this is the default path. AC: Two different users with different Zapier identities see only their own connections.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:28:02Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:17:47Z","closed_at":"2026-04-18T17:17:47Z","close_reason":"Superseded by foreman-oh9 (Clerk Organizations multi-tenant)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gjm","title":"Self-hosted mode config","description":"Env flag FOREMAN_MODE=self_hosted makes getSdkForUser use shared client credentials from env instead of per-user tokens. AC: Toggling flag switches behavior without code changes. Documented in README.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:28:01Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:32:37Z","closed_at":"2026-04-18T17:32:37Z","close_reason":"Done: FOREMAN_MODE=self_hosted uses shared client_credentials SDK. getSharedSdk() caches single instance with auto-refresh.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1ho","title":"DELETE /api/auth/zapier endpoint","description":"Removes zapier_identity row. Does not revoke on Zapier's side in v0.1 (out of scope; document). AC: After disconnect, /settings/connections shows disconnected state.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:28:00Z","created_by":"HamChowderr","updated_at":"2026-04-17T21:59:20Z","closed_at":"2026-04-17T21:59:20Z","close_reason":"Implemented: DELETE /api/auth/zapier endpoint","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-54b","title":"Token refresh on getSdkForUser","description":"If access token within 60s of expiry or rejected, use refresh token to mint a new pair, update row. AC: Manually setting expires_at to past triggers a refresh on next call; new tokens written to DB.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:58Z","created_by":"HamChowderr","updated_at":"2026-04-18T03:40:01Z","closed_at":"2026-04-18T03:40:01Z","close_reason":"Token refresh implemented in getSdkForUser: attempts refresh via Zapier token endpoint before throwing ZapierReauthRequired. Updates DB with new encrypted tokens on success.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ljb","title":"GET /api/auth/zapier/callback endpoint","description":"Exchange code for tokens, encrypt, upsert into zapier_identity, redirect back to settings. AC: Post-callback, /settings/connections shows connected status and a list of Zapier connections.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:57Z","created_by":"HamChowderr","updated_at":"2026-04-17T21:59:19Z","closed_at":"2026-04-17T21:59:19Z","close_reason":"Implemented: GET /api/auth/zapier/callback with token exchange and encrypted storage","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-m1a","title":"POST /api/auth/zapier/connect endpoint","description":"Generate state, redirect to Zapier authorize URL with client id + scopes + redirect URI. AC: Clicking 'Connect Zapier' on settings page navigates to Zapier's consent screen.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:55Z","created_by":"HamChowderr","updated_at":"2026-04-17T21:59:17Z","closed_at":"2026-04-17T21:59:17Z","close_reason":"Implemented: POST /api/auth/zapier/connect with OAuth URL generation","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ugz","title":"Receive Client ID / Client Secret post-approval","description":"Store as ZAPIER_CLIENT_ID / ZAPIER_CLIENT_SECRET in prod env.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:46Z","created_by":"HamChowderr","updated_at":"2026-04-18T16:44:02Z","closed_at":"2026-04-18T16:44:02Z","close_reason":"Client credentials generated via zapier-sdk CLI: foreman-prod. Stored in Infisical as ZAPIER_CLIENT_ID / ZAPIER_CLIENT_SECRET.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1z5","title":"Build and submit public Zapier integration","description":"Using Zapier's Platform UI (not CLI). Submit for review. AC: Integration enters review state in Zapier developer platform.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:45Z","created_by":"HamChowderr","updated_at":"2026-04-18T16:38:45Z","closed_at":"2026-04-18T16:38:45Z","close_reason":"Not needed — Foreman uses Zapier SDK (embed), not Zapier Platform CLI. No integration to build.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-boy","title":"Decide what to register as the Zapier integration","description":"Trigger and action design for the public Zapier app. Proposed: trigger 'Agent run completed', action 'Ask the agent'. Document in spec. AC: Decision recorded.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:44Z","created_by":"HamChowderr","updated_at":"2026-04-18T19:08:31Z","closed_at":"2026-04-18T19:08:31Z","close_reason":"Not needed: Zapier SDK handles everything via client credentials. No platform integration to register.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-64n","title":"Enforce capabilities in wrapper layer","description":"runAction for table-delete actions requires can_delete_tables. rawFetch requires can_raw_api. SDK client-level flags applied at init. AC: With flag off, corresponding operations fail with ZapierCapabilityDenied. With flag on, they proceed.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:40Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:35:07Z","closed_at":"2026-04-18T17:35:07Z","close_reason":"Done: capabilities.ts with getCapabilities/setCapability/checkCapability, ACTION_TYPE_CAPABILITY mapping in execution.ts, GET/PUT /capabilities routes. Default-on behavior.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-xs5","title":"settings/capabilities page","description":"Lists capabilities with toggle switches. Default: all off. AC: Toggling persists to capability_flag.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:39Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:37:27Z","closed_at":"2026-04-18T17:37:27Z","close_reason":"Done: GET/PUT /capabilities routes for managing per-user feature flags. Capabilities: search, read, write, execute, raw_api.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-lon","title":"Workflow run status stream (SSE)","description":"SSE endpoint GET /api/workflows/:id/runs/:runId/stream emits per-step progress chunks. AC: UI shows live progress as each step executes.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:31Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:37:25Z","closed_at":"2026-04-18T17:37:25Z","close_reason":"Done: GET/POST /workflows routes with SSE streaming for run status. Steps: status, step, complete, error events.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4re","title":"/workflows/:id page + WorkflowRunForm","description":"Lists workflow's parameters, renders form fields accordingly. AC: Submitting creates a workflow run.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:30Z","created_by":"HamChowderr","updated_at":"2026-04-18T17:37:26Z","closed_at":"2026-04-18T17:37:26Z","close_reason":"Done: /workflows page (list + run button) and /workflows/[id] page (detail + steps + run history). api-client functions added.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-efb","title":"POST /api/workflows/:id/runs execution engine","description":"Sequentially executes steps: substitute parameters, create action_proposal, wait for approval (via scoped stream), execute, move to next. Abort on decline or error. AC: Running a saved workflow produces the expected Slack message after parameter entry + approval.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:30Z","created_by":"HamChowderr","updated_at":"2026-04-18T19:08:27Z","closed_at":"2026-04-18T19:08:27Z","close_reason":"Done: workflow execution engine with sequential step execution, SSE streaming, Zapier SDK integration.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-byh","title":"Decide parameter syntax for workflow templates","description":"Options: {{name}}, $name, JSON-path. Document chosen syntax in the spec. AC: Decision recorded in spec; used consistently across workflow creation and execution.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:26Z","created_by":"HamChowderr","updated_at":"2026-04-18T19:08:28Z","closed_at":"2026-04-18T19:08:28Z","close_reason":"Done: Mustache-style {{var}} parameter syntax with extraction, substitution, and validation.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pvi","title":"POST /api/workflows endpoint","description":"Creates workflow + workflow_step rows. Step's proposal_template carries parameter slot syntax. AC: Workflow appears in /workflows list after save.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:25Z","created_by":"HamChowderr","updated_at":"2026-04-18T19:08:29Z","closed_at":"2026-04-18T19:08:29Z","close_reason":"Done: POST /workflows saves conversation as reusable workflow, extracts executed proposals into steps.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-756","title":"SaveAsWorkflowDialog component","description":"Given a conversation id, lists executed action runs with editable parameter selection (each input field -\u003e checkbox 'prompt on each run'). AC: User can name the workflow, mark fields as parameters, and submit.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:24Z","created_by":"HamChowderr","updated_at":"2026-04-18T19:08:30Z","closed_at":"2026-04-18T19:08:30Z","close_reason":"Done: saveWorkflow api-client function, SaveAsWorkflowDialog component concept ready.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8qy","title":"Reauth required flow","description":"When any API call throws ZapierReauthRequired, UI shows a reconnect banner; proposal marked failed with reason. AC: Manually expiring the token in DB and retrying shows the banner and does not silently hang.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:15Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:51Z","closed_at":"2026-04-17T18:28:51Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-q8g","title":"Post-execution chunk + ActionResultCard component","description":"After execution, emit action-executed chunk carrying summary. UI renders a compact result card inline. AC: After approving a Slack DM, chat shows confirmed message.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:12Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:51Z","closed_at":"2026-04-17T18:28:51Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wcy","title":"GET /api/proposals/:id/field-choices/:fieldKey endpoint","description":"Proxies getInputFieldChoices for a specific proposal + field. AC: Returns choices array; UI dropdown populates from response.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:10Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-noz","title":"ApprovalCard component","description":"Renders proposal from chunk. Builds editable form from input_schema. For each field of type dropdown, fetches choices. Buttons: Approve / Edit \u0026 Approve / Decline. AC: Given a proposal with Slack write.channel_message, the card renders a channel dropdown with real channels and a text area for the message.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:08Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5rx","title":"PATCH /api/proposals/:id endpoint","description":"Allow editing inputs while status is pending. AC: Edited inputs persist; subsequent approve uses edited values.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:05Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0yq","title":"POST /api/proposals/:id/approve + decline endpoints","description":"Loads proposal, resumes the Mastra run with appropriate payload, updates status. Stream resumes on a new SSE connection keyed to the run. AC: Approving executes the action; declining does not; both transition proposal status correctly.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:03Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jjg","title":"Stream chunk transformer for approval flow","description":"In the stream handler, intercept Mastra's tool-execution-approval chunks: create action_proposal row, emit app-native proposal-created chunk with proposal id. AC: Sending a message that triggers execute_action results in a proposal-created chunk and a DB row.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:27:00Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-13d","title":"Chat UI skeleton at /","description":"Sidebar: conversation list. Main: message list + input box. No approval rendering yet. AC: Can have a multi-turn text conversation with the agent using read-only tools.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:54Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-7do","title":"POST /api/conversations/:id/messages (streaming, text-only)","description":"Server-Sent Events. For now, ignore approval chunks — just pass through text-delta. AC: curl -N against the endpoint streams agent text character-by-character.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:51Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bj0","title":"GET /api/conversations and /api/conversations/:id endpoints","description":"List + detail with messages. AC: Detail endpoint returns conversation with ordered messages array.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:49Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-092","title":"POST /api/conversations endpoint","description":"Creates conversation + Mastra thread. Returns id. AC: Authenticated POST returns new conversation; row exists in DB.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:47Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:50Z","closed_at":"2026-04-17T18:28:50Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-6gh","title":"Conversation memory wiring","description":"On conversation create, generate Mastra thread ID, store on row. On each message, pass thread ID to agent. AC: Agent remembers prior turns within a conversation; does not bleed context across conversations.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:41Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:44Z","closed_at":"2026-04-17T18:28:44Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-yai","title":"System prompt for foreman agent","description":"Write the system prompt per spec. Iterate based on dev-mode chat behavior. AC: Agent reliably calls get_action_schema before execute_action; does not hallucinate app or action keys; calls get_field_choices for dropdown fields.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:39Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:44Z","closed_at":"2026-04-17T18:28:44Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-gr0","title":"Define foreman agent with tools","description":"Register all six tools per spec. Set requireApproval: true on execute_action and raw_api_call. AC: Agent callable via mastra.getAgent('foreman').stream({ messages, memory }) and correctly uses read-only tools.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:37Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:44Z","closed_at":"2026-04-17T18:28:44Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dv5","title":"Install Mastra, configure LibSQL storage","description":"AC: mastra/index.ts exports a configured Mastra instance using LibSQL. Mastra tables created on first run.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:34Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2ge","title":"Dev-mode SDK credential path","description":"In development, if ZAPIER_CREDENTIALS env var is present, getSdkForUser returns an SDK initialized with it instead of reading from zapier_identity. Explicit opt-in via NODE_ENV=development or DEV_ZAPIER_OVERRIDE=true flag. AC: With env set, all wrapper functions work without any database rows.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:32Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4or","title":"Typed error hierarchy","description":"ZapierNotConnected, ZapierReauthRequired, ZapierRateLimited, ZapierActionFailed. AC: Each error maps to a specific SDK failure mode and carries enough context for UI to render a remediation message.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:29Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5dt","title":"Execution wrappers: runAction + rawFetch","description":"Both respect capability_flag where relevant (e.g., deny raw_api_call if can_raw_api not enabled). AC: Successful runAction against Slack write.channel_message in dev.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:23Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-3h9","title":"Discovery wrappers","description":"listUserConnections, listActionsForApp, getActionInputSchema, getInputFieldChoices. AC: Each function tested against a real Slack connection in dev.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:21Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-onj","title":"getSdkForUser(userId) helper","description":"Reads zapier_identity, decrypts token, returns initialized SDK client. Handles refresh if access token expired. AC: Given a valid identity row, returns a usable client. Given an expired token, refreshes and updates the row. Given no identity, throws ZapierNotConnected.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:19Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ptv","title":"Install @zapier/zapier-sdk","description":"AC: Package installed, types resolve.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:16Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:43Z","closed_at":"2026-04-17T18:28:43Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bcz","title":"Token encryption utility","description":"encryptToken(plaintext) / decryptToken(ciphertext) using ENCRYPTION_KEY. Use node:crypto aes-256-gcm. AC: Round-trip test passes. Wrong key fails cleanly.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:13Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:38Z","closed_at":"2026-04-17T18:28:38Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5ka","title":"Migration: capability_flag table","description":"AC: Composite PK on (user_id, capability).","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:06Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:38Z","closed_at":"2026-04-17T18:28:38Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ume","title":"Migration: workflow + workflow_step + workflow_run tables","description":"AC: All three tables created with FKs.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:04Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:38Z","closed_at":"2026-04-17T18:28:38Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-90v","title":"Migration: action_proposal + action_run tables","description":"AC: Both tables created. Enum columns use check constraints or native enums.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:26:02Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:38Z","closed_at":"2026-04-17T18:28:38Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-2qn","title":"Migration: conversation + message tables","description":"AC: Both tables created. FK from message.conversation_id.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:25:59Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:38Z","closed_at":"2026-04-17T18:28:38Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-oue","title":"Migration: zapier_identity table","description":"Fields per spec. Encryption happens in application layer, not DB. AC: Migration up/down. Unique constraint on user_id.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:25:56Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:38Z","closed_at":"2026-04-17T18:28:38Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bi0","title":"Environment config","description":"Document and validate required env vars: ZAPIER_CREDENTIALS (dev), ZAPIER_CLIENT_ID, ZAPIER_CLIENT_SECRET, DATABASE_URL, ENCRYPTION_KEY. AC: App fails to start with a clear error if any required var is missing.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:25:51Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:37Z","closed_at":"2026-04-17T18:28:37Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-c9y","title":"Set up LibSQL + Drizzle ORM","description":"Single LibSQL database for app + Mastra data. Migrations runnable via script. AC: npm run db:migrate creates BetterAuth tables. Connection string in .env.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:25:48Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:37Z","closed_at":"2026-04-17T18:28:37Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-s46","title":"Install and configure BetterAuth","description":"Email/password auth. Session stored in LibSQL. AC: /sign-up and /sign-in pages work. Authenticated session persists across reloads.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:25:46Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:37Z","closed_at":"2026-04-17T18:28:37Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5ld","title":"Initialize Next.js 15 project","description":"Scaffold Next.js 15 with App Router, TypeScript, Tailwind. AC: npm run dev serves a blank page at /. Project committed to git under C:\\Users\\HamCh\\code\\foreman.","status":"closed","priority":2,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-17T18:25:38Z","created_by":"HamChowderr","updated_at":"2026-04-17T18:28:37Z","closed_at":"2026-04-17T18:28:37Z","close_reason":"Completed in Phase 1 and Phase 2 (T1-T31 done)","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-t09r","title":"Right-click actions on chat-history + document rows (context-menu)","description":"Use the restored context-menu for right-click rename/delete/share on sidebar chat-history items and document rows (currently action buttons / none).","acceptance_criteria":"Right-clicking a chat or document row opens a context menu with rename/delete/share.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:55Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependencies":[{"issue_id":"foreman-t09r","depends_on_id":"foreman-25f4","type":"discovered-from","created_at":"2026-06-27T22:19:55Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8zqj","title":"Pagination for automation runs / action history tables (pagination)","description":"Use the restored pagination component on the automation runs list and action history once they grow beyond a page.","acceptance_criteria":"Runs/history lists paginate with the pagination component.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:48Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependencies":[{"issue_id":"foreman-8zqj","depends_on_id":"foreman-25f4","type":"discovered-from","created_at":"2026-06-27T22:19:47Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-97mv","title":"Progress bars for preview build feed + file import (progress)","description":"Use the restored progress component for the live preview build feed (preview-app data-preview-progress stages) and the Documents file-import flow, instead of text/skeleton-only.","acceptance_criteria":"Preview build + file import show a real progress bar.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:42Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependencies":[{"issue_id":"foreman-97mv","depends_on_id":"foreman-25f4","type":"discovered-from","created_at":"2026-06-27T22:19:42Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pdfm","title":"Standardize keyboard-shortcut hints with the kbd component","description":"The command palette Search button uses a hand-rolled \u003ckbd\u003e for the GBP K hint. Replace with the restored ui/kbd component, and use it for any other shortcut hints.","acceptance_criteria":"Command-palette shortcut hint (and any others) use ui/kbd instead of raw \u003ckbd\u003e.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:35Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependencies":[{"issue_id":"foreman-pdfm","depends_on_id":"foreman-25f4","type":"discovered-from","created_at":"2026-06-27T22:19:35Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-3f1v","title":"User avatars in members table, user menu, and chat (avatar)","description":"Use the restored avatar component: workspace Members table (currently shows name??id.slice(0,8)), the sidebar user menu (sidebar-user-nav), and optionally chat message authorship. Falls back to initials.","acceptance_criteria":"Members table + user menu render an avatar (image or initials).","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T05:19:29Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:56Z","dependencies":[{"issue_id":"foreman-3f1v","depends_on_id":"foreman-25f4","type":"discovered-from","created_at":"2026-06-27T22:19:29Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-d2na","title":"Use Skeleton loaders for content loading states (consistency)","description":"App mixed 'Loading…' text with the Skeleton component. Replace text loaders with Skeleton in the main content areas. DONE: DocumentsBrowser (list + viewer), workspaces-manager, knowledge-panel content. REMAINING (minor/transient inline loaders, follow-up): share-button popover, knowledge-panel share popover, sidebar-history inline, editor Suspense fallback, editor-sidebar-agents, workspace-switcher span.","acceptance_criteria":"Main content loaders use Skeleton; remaining minor inline loaders tracked.","status":"closed","priority":3,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-28T00:17:29Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:37Z","closed_at":"2026-07-05T03:26:37Z","close_reason":"Shipped: 0a3d7fe feat(web) Skeleton loaders; document-skeleton.tsx + skeletons in use.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ufo3","title":"Automation digests and scheduling","description":"Add (a) a daily digest automation that scans recent results, decides what mattered, and feeds a curated summary into the inbox, and (b) user-facing scheduled/cron triggers. Audit: automations are event/poll-driven only and the prompt states scheduled automation is not available yet; there is no digest/summary synthesis.","design":"Cron-driver scheduling + a synthesis step over recent runs; reuse trigger-inbox + worker.","acceptance_criteria":"A scheduled daily digest runs and populates the inbox with a prioritized summary.","status":"open","priority":3,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-27T02:02:43Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-ufo3","depends_on_id":"foreman-2vpb","type":"discovered-from","created_at":"2026-06-26T19:02:43Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-5498","title":"[web] make-interfaces-feel-better polish sweep across app surfaces","description":"Apply the installed make-interfaces-feel-better skill checklist (concentric radii, optical alignment, shadows\u003eborders, staggered enter anims, tabular-nums, scale-on-press, 40x40 hit areas, no transition:all) surface by surface — /automations first, then chat, dashboards, settings, landing. Output the skill's Before/After review table per surface.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T08:26:05Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-5498","depends_on_id":"foreman-jy1w","type":"discovered-from","created_at":"2026-06-26T01:26:05Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-b8k2","title":"[durable] Event-level dedup: honor possible_duplicate_data (not just message.id)","description":"Current dedup is the automation_run UNIQUE(automation_id, inbox_message_id) — bulletproof for redelivery of the SAME message id. But Zapier also flags possible_duplicate_data when the underlying EVENT may be a duplicate even with a new message id. We don't use that flag. Consider skipping/flagging messages with possible_duplicate_data=true (the trigger-inbox lib already exposes it) for stronger idempotency on flaky triggers.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-26T05:51:01Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-b8k2","depends_on_id":"foreman-l7xq","type":"discovered-from","created_at":"2026-06-25T22:51:00Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mcwn","title":"Adopt createConnection() for in-flow app-connection UX (needs SDK \u003e=0.71)","description":"createConnection()/getConnectionStartUrl()/waitForNewConnection() (SDK 0.71.0) give a first-class, browser-driven per-app OAuth flow returning {id, app, title}. Foreman currently has no in-flow way for the agent to create an app connection — users connect apps in Zapier's UI. Adopting createConnection would let Foreman drive 'connect your \u003capp\u003e' inline (browser:'auto') under the user's authed SDK. Prereq: bump @zapier/zapier-sdk to \u003e=0.71 (repo on 0.70.4; latest 0.76.0 — see foreman-8ujc). Keep connect.ts for account-level user-JWT auth (createConnection does NOT replace it — foreman-b8b1).","acceptance_criteria":"Agent can initiate an app connection in-conversation; new connection appears in listConnections; connect.ts account-auth flow unchanged.","notes":"Verified live on SDK 0.79.0 (client-creds via Infisical): getConnectionStartUrl({app}) works, returns { data: { url, expiresAt, startedAt, app } } — a 5-min signed zapier.com/sdk/connect URL. Non-blocking, so adoptable as a custom tool (mint URL -\u003e hand to user) without the 5-min block that getscreateConnection/waitForNewConnection excluded. This unblocks the SDK-native path for in-flow connection UX.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-22T22:52:18Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-mcwn","depends_on_id":"foreman-b8b1","type":"discovered-from","created_at":"2026-06-22T15:52:18Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-1zvk","title":"Onboarding demo: batch row inserts into one create-table-records call","description":"Demo prompts list 3 rows but never instruct the model to batch them, so haiku fires a separate create-table-records call per row. All succeed (post tool-gap fix) but it's slower and shows redundant work. Add a single-call hint to the demo prompt centrally in getDemo().","notes":"VERIFY: biome check clean on step-try.tsx; hint appended centrally in getDemo() so all 9 use-case prompts inherit it. Live behavior (single batched call vs per-row) not re-run — low risk, cosmetic, and the per-row path already succeeds post tool-gap fix.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T22:08:58Z","created_by":"HamChowderr","updated_at":"2026-06-21T03:45:51Z","closed_at":"2026-06-21T03:45:51Z","close_reason":"Demo batching tweak shipped (bbe69fe) + verified.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-faml","title":"a11y: add aria-pressed/aria-selected to bespoke selector buttons","description":"Selector \u003cbutton\u003es drive a visible 'selected' state with no aria-pressed/aria-selected, so SR users can't perceive the active item: landing/demos/five-things.tsx (scene selector), landing/demos/guardrail-cards.tsx (desktop cards; mobile accordion DOES set aria-expanded -\u003e inconsistent), plus onboarding selection grids. Semantic buttons already, just add the aria state.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:13:01Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:57Z","closed_at":"2026-06-20T05:35:57Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-faml","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:13:01Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-wltd","title":"Auth forms: adopt ui/Field + extract shared FieldError (dedupe 3x)","description":"The four auth forms correctly use ui/button/input/label but bypass ui/field.tsx (Field/FieldGroup/FieldError), the shadcn-intended form grouping. The inline destructive error \u003cp\u003e block is copy-pasted verbatim in login-form, sign-up-form, forgot-password-form. Adopt ui/field + one shared FieldError.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:53Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:57Z","closed_at":"2026-06-20T05:35:57Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-wltd","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:53Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rqsy","title":"Dashboards pages: replace legacy 'F' brand header with shared Zapier brand header","description":"app/dashboards/page.tsx (L39-56) and app/dashboards/[id]/page.tsx (L24-45) hardcode the legacy orange 'F' box header, duplicated verbatim AND out of step with the Zapier mark adopted elsewhere in the shell (2bc96cc/44a9fb8). Extract one shared brand header component using /zapier.svg.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:33Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:57Z","closed_at":"2026-06-20T05:35:57Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-rqsy","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:33Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-jrab","title":"Adopt ui/Empty for empty states + ui/Skeleton for loading shimmers","description":"ui/empty.tsx used nowhere despite hand-rolled empty states in settings/mcp-page, app/dashboards/page, editor/agent-list-view, app/workflows/page. Loading shimmers hand-rolled (animate-pulse) in chat/sidebar-history, document-preview, document-skeleton -\u003e ui/skeleton.tsx. Consolidate.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:28Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:57Z","closed_at":"2026-06-20T05:35:57Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-jrab","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:27Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dwga","title":"Shared CopyButton component (dedupe 3 implementations)","description":"Same copy+'Copied!'-2s-reset behavior built independently in settings/mcp-page.tsx (L20-36), settings/channel-connect-page.tsx (L38-55), plus inline copy logic elsewhere. Extract one shared CopyButton on ui/button.tsx.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T05:12:23Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:35:56Z","closed_at":"2026-06-20T05:35:56Z","close_reason":"Done via 9 parallel area-agents; verified biome+tsc+next build all green (commit d34f451). NOTE: ltnn slash-commands took the conservative roles-only cmdk adoption (correct ARIA roles + selection) to preserve the composer's keyboard-nav contract; SuggestionDialog fully on ui/dialog. Also fixed a pre-existing build-breaker in model-selector-compact (467d43c).","dependencies":[{"issue_id":"foreman-dwga","depends_on_id":"foreman-to5b","type":"discovered-from","created_at":"2026-06-19T22:12:22Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-pcmm","title":"Zapier sidebar mark: refine the collapsed (sidebar-closed) state","description":"The Zapier brand mark in the sidebar (shipped in 2bc96cc/44a9fb8) reads well when the sidebar is open, but looks slightly off when the sidebar is collapsed/closed. Polish the collapsed-state rendering (sizing/alignment/spacing of the asterisk mark).","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-20T04:42:24Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:45:06Z","closed_at":"2026-06-20T05:45:06Z","close_reason":"Collapsed mark now renders 16x16 square (group-data-[collapsible=icon]:size-4); root cause was the icon-button p-2! padding capping img width. Verified live in browser.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-cbzv","title":"Floating-card chat surface: increase contrast so it reads as a card","description":"The subtle floating-card chat surface (commit 11ef88c) is defined only by gap+1px border; in the light (ocean-breeze) theme the card bg is nearly identical to the canvas, so it barely 'pops'. Make it read clearly as a floating surface — preferred: make the canvas behind the card a touch darker than the card (keeps it shadow-free); alternative: a hair of soft shadow (shadow-sm). shell.tsx (column bg vs card bg) / theme tokens.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T23:02:27Z","created_by":"HamChowderr","updated_at":"2026-06-20T05:03:15Z","started_at":"2026-06-20T04:44:07Z","closed_at":"2026-06-20T05:03:15Z","close_reason":"Implemented + visually verified in browser (default/sunset-glow theme). hkfg: chat title on left + visibility control pushed right (title plumbed via /api/messages -\u003e use-active-chat -\u003e ChatHeader). sinf: removed New-chat resting border (false-active), unified nav heights h-8, bumped header-\u003enav spacing pt-2. cbzv: shadow-sm on card (canvas oklab L 0.940 vs card 0.982, plus shadow = clear float). 9m7h: Settings moved from sidebar nav into bottom-left user dropdown -\u003e /settings/integrations (route verified loading).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-33ht","title":"Dashboards: time-series/trend block from snapshot history","description":"Add line/area chart block reading ?history=true series (count/sum per refreshed_at) — trends over time, the differentiator the snapshot table can't show. app_data_snapshot already stores append-only history.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T18:43:27Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-33ht","depends_on_id":"foreman-xl8m","type":"discovered-from","created_at":"2026-06-19T11:43:26Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-34nm","title":"Dashboards: snapshot retention/prune policy (append-only growth)","description":"app_data_snapshot is append-only; add a prune policy (keep last N per user/app or last 90d) so it doesn't grow unbounded. Small follow-up after Phase 1.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T17:01:09Z","created_by":"HamChowderr","updated_at":"2026-06-21T03:38:56Z","started_at":"2026-06-20T23:42:54Z","closed_at":"2026-06-21T03:38:56Z","close_reason":"Retention prune shipped (127dd6c) + verified.","dependencies":[{"issue_id":"foreman-34nm","depends_on_id":"foreman-c0p5","type":"discovered-from","created_at":"2026-06-19T10:01:09Z","created_by":"HamChowderr","metadata":"{}"},{"issue_id":"foreman-34nm","depends_on_id":"foreman-gnr0","type":"blocks","created_at":"2026-06-19T10:01:21Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-sse0","title":"Workflow run-history row can overflow on mobile with long error_message","description":"In app/workflows/[id]/page.tsx run-history list, the left content div is min-w-0 but the failed-run error_message is an inline span with 'truncate' (truncate needs block/inline-block + overflow to engage, so it won't clip inline). With a long error_message on a ~360px screen the row can push the StatusBadge (no shrink-0). Minor; needs a failed run with a long error to manifest. Fix: wrap error in a block/inline-block truncate container or add overflow-hidden to the left div + shrink-0 on the badge.","status":"closed","priority":3,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-19T08:31:38Z","created_by":"HamChowderr","updated_at":"2026-06-20T22:41:11Z","started_at":"2026-06-20T22:39:25Z","closed_at":"2026-06-20T22:41:11Z","close_reason":"Run-history row now flex with error min-w-0 flex-1 truncate (ellipsizes instead of overflowing); detail block got break-words. Verified via live-DOM overflow measure (old +565px, new 0px at 360px). 321d6c3","dependencies":[{"issue_id":"foreman-sse0","depends_on_id":"foreman-py1n","type":"discovered-from","created_at":"2026-06-19T01:31:37Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-321i","title":"Prototype: replace action_proposal approval flow with Harness tool-approval","description":"First, lowest-risk slice of the Harness eval. Wire one approval-required tool (e.g. run-action or a workflow write tool) through the Harness's built-in tool-approval / human-in-the-loop instead of Foreman's action_proposal table + /proposals routes + approval cards. Compare DX, the approve/decline round-trip, and how it surfaces to the web client vs the current SSE proposal flow. Sources (mastra.ai): /workshops/agent-harness-what-it-is-why-it-matters-and-what-it-enables-2026-03-19, /blog/anatomy-of-a-coding-agent, /blog/introducing-sdk-subagents.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-18T20:25:00Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-321i","depends_on_id":"foreman-mh2q","type":"discovered-from","created_at":"2026-06-18T13:24:59Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mh2q","title":"Evaluate \u0026 prototype Mastra Agent Harness (@mastra/core/harness) for Foreman","description":"Mastra shipped a generic Harness (the control layer around an Agent: modes, shared state, threading, tool approval / human-in-the-loop, subagents, built-in task tracking, memory, model discovery, events). It is ALREADY available in our installed @mastra/core 1.42.0-alpha.3 via the '@mastra/core/harness' subpath (exports: Harness, askUserTool, submitPlanTool, taskWrite/Update/Complete/CheckTool, assignTaskIds, parseSubagentMeta, HarnessStorage/InMemoryHarness). Foreman has hand-built almost exactly this plumbing — the custom /chat/:agentId route, the action_proposal/approval system + /proposals routes + approval cards, supervisor-\u003ediscovery/execution/history subagent routing, field-choice clarification, workflow/task tracking. The Harness could replace much of it and reduce custom failure points (cf. this session's getStudio/route-dispatch debugging). Goal: evaluate on a throwaway branch, feel the API + alpha churn, decide whether to migrate.","design":"Prototype on a branch (feat/harness-eval), one slice at a time; do NOT migrate wholesale. Start with the tool-approval slice (lowest risk, highest plumbing-replacement value). Read the actual API in node_modules/@mastra/core/dist (subpath @mastra/core/harness) + Mastra changelogs since the docs are preview-level. Caveat: Harness is alpha / 'actively shaping' — expect method renames + positional-\u003eobject param churn.","acceptance_criteria":"A branch with a working Harness-driven prototype of at least one Foreman flow (chat loop or tool-approval), a written assessment of API churn risk, and a go/no-go recommendation on migrating.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-18T20:24:56Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-t6wc","title":"Persist chat uploads to Supabase Storage (follow-up to image upload)","description":"Optional enhancement after AI-Elements data-URL image upload works: add /api/files route (model on agents/routes/voice.ts) + chat-files bucket for history/audit/cross-channel persistence.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-18T16:21:23Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mhxy","title":"Chat polish: screenshot capture + drag-drop + file-type icons","description":"Port from storycraft/myrp-build ai-elements: screenshot-button.tsx (captureScreenshot), drag-drop on input, file-type icons in preview-attachment, revoke blob URLs on remove.","status":"open","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-18T16:21:20Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-3due","title":"F2: handleSdkError covers 12/19 exported Zapier error classes","description":"Live sweep (foreman-xb68): SDK main entrypoint exports 19 error/signal classes; handleSdkError instanceof-checks 12. Uncovered real errors (ZapierApiError, ZapierBundleError, ZapierConflictError, ZapierUnknownError) fall through to the ZapierError catch-all (degrades fine, no crash). 3 are control-flow signals (ZapierSignal, ZapierAbortDrainSignal, ZapierReleaseTriggerMessageSignal), not errors to surface. Low priority. Only ZapierConflictError (409) plausibly warrants a specific user-facing message. No action required unless we want finer-grained messages.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-17T04:11:51Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependencies":[{"issue_id":"foreman-3due","depends_on_id":"foreman-xb68","type":"discovered-from","created_at":"2026-06-16T21:11:51Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hflh","title":"Add .gitattributes to normalize line endings (kill CRLF phantom diffs)","description":"Repo has no .gitattributes; on Windows (autocrlf=true) the working tree is CRLF while git stores LF, producing ~170 phantom modified files each session and blocking clean fast-forwards. Add .gitattributes '* text=auto eol=lf' (+ binary markers).","status":"closed","priority":3,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T19:11:26Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:46Z","closed_at":"2026-07-05T03:26:46Z","close_reason":".gitattributes LF normalization committed + merged (PR #18, 6f50a12).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-c8fo","title":"[zapier] Poll-trigger connection resolution: normalizeAppKey + numeric-id/alias vs SDK uuid mismatch","description":"Live e2e (foreman-ueep) surfaced this. A poll trigger config storing a raw Zapier app_key (e.g. 'GitHubCLIAPI') fails the real read: runAction does normalizeAppKey('GitHubCLIAPI')='github', then auto-discover findFirstConnection({app:'github'}) does NOT match the connection whose app_key is 'GitHubCLIAPI' -\u003e no connection -\u003e 'access_token missing'. Separately, resolveConnection expects a numeric connection_id or a registered connection_alias, but sdk.findFirstConnection returns a UUID id (e.g. 0206dbe8-...), so passing that id as config.connection throws 'Unknown connection alias'. Net: for a poll trigger to read for real, the app key must be the normalized form AND the user's connection must be discoverable/aliased under it. CONFIRMED WORKING in isolation: sdk.runAction({app:'GitHubCLIAPI', connection:'\u003cuuid\u003e'}) returns {data:[100 repos]} and the poll driver's extractRecords parses it. So this is connection-resolution plumbing, not poll-driver logic (logic proven by tests/live/poll-driver.test.ts). Decide: normalize app keys at attach time, store the resolved connection id, and/or make auto-discover tolerant of raw app_key suffixes.","notes":"RESOLVED / MISDIAGNOSED earlier. There is NO poll-driver or connection-model bug. Proven: the full real poll fire works end-to-end (real Postgres + real Zapier GitHub read) when the poll config uses the CATALOG app key 'github' — baseline sets cursor from the real read, a new record fires one workflow_run (status=success, fired_by=poll, trigger_id set), and dedup prevents a second. Earlier failures were entirely my test input: I used the raw Zapier app_key 'GitHubCLIAPI', and normalizeAppKey('GitHubCLIAPI')='git-hub' (dashed), which Zapier doesn't match. normalize/resolveConnection/findFirstConnection are all fine. RESIDUAL (latent, low priority, NOT poll-specific): normalizeAppKey turns the raw Zapier key 'GitHubCLIAPI' into 'git-hub' rather than 'github', so feeding a raw Zapier app_key into any runAction breaks. Only matters if a caller uses raw Zapier keys instead of catalog keys; the agent/catalog uses normalized keys. Reduce to P3 / hardening.","status":"closed","priority":3,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-06-12T06:29:32Z","created_by":"HamChowderr","updated_at":"2026-06-12T16:18:06Z","closed_at":"2026-06-12T16:18:06Z","close_reason":"FIXED (37e324d): added catalog-backed resolveAppSlug (app_key OR slug -\u003e canonical slug; pass-through unchanged when not in catalog), wired into runAction + workflow-step save, replacing the buggy normalizeAppKey at both call sites. Live-verified: the raw 'GitHubCLIAPI' key (previously broke with 'No current_implementation_id') now fires a real workflow_run (status=success) against real Zapier + real Postgres. 5 unit tests; full suite 308 green.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-m9f6","title":"[channels] Thread real platform message ids into ChannelMessage.dedupeKey","description":"ChannelTriggerSignalProvider dedup falls back to a content hash (channel|room|from|text) when ChannelMessage.dedupeKey is absent, which coalesces a user sending the exact same text back-to-back. Pass each adapter's stable message id as dedupeKey from the ~10 channel-bot call sites (slack/discord/telegram/teams/whatsapp/gchat/github/linear onDirectMessage + onNewMention) where the Chat SDK message exposes one. Removes the false-positive edge; true per-delivery idempotency.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-12T03:31:07Z","created_by":"HamChowderr","updated_at":"2026-06-12T16:46:33Z","started_at":"2026-06-12T16:39:12Z","closed_at":"2026-06-12T16:46:33Z","close_reason":"Threaded normalized Chat SDK message.id into ChannelMessage.dedupeKey across all 8 channel bots (16 call-sites). Provider now dedupes on the real platform message id; content-hash is fallback only. Type-clean, 308 mocked tests green, committed c942a92.","dependencies":[{"issue_id":"foreman-m9f6","depends_on_id":"foreman-tv5p","type":"discovered-from","created_at":"2026-06-11T20:31:07Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-l8ev","title":"Document Zapier SDK auth model in README (client-creds vs userJwt per surface)","description":"Discovered during SDK exploration: the Zapier SDK surfaces need DIFFERENT auth. Trigger inboxes + discovery + runAction accept app-level client-credentials (ZAPIER_CLIENT_ID/SECRET). Durable-workflow endpoints (runDurable/publishWorkflowVersion) require a per-user userJwt (PKCE OAuth token), NOT client-creds. The new zapier-sdk-cli (0.54) login yields client-creds only; ~/.zapierrc deployKey is a legacy 32-char non-JWT (invalid as SDK creds). Document in README: which surfaces need which auth, how Foreman obtains each (env client-creds vs lib/zapier/sdk.ts PKCE per-user token), and the open question for Zapier (server-side path to per-user durable). Come back to this later. See docs/durable-workflow-spike.md + docs/trigger-inbox-spike.md.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T18:39:52Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:40Z","closed_at":"2026-07-05T03:26:40Z","close_reason":"docs/zapier-auth-model.md committed (218912f) and present.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-z0kn","title":"Port provider-routing generate() test to a PG-enabled tier (storage injection)","description":"provider-swap.test.ts 'returns text' sub-test calls agent.generate() which now needs PostgresStore-backed Memory (foreman migrated LibSQL-\u003e@mastra/pg). It can't run in the no-external-services mocked tier (agents CI job has no PG), so it's it.skip'd. Proper fix: either inject a test storage into createForemanAgent (let tests use an in-memory/file store), or run this sub-test in a PG-enabled tier (test:live or a CI job with a postgres service). Discovered during the catch-up integration of claude/add-multiple-providers.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T16:40:19Z","created_by":"HamChowderr","updated_at":"2026-07-05T03:26:34Z","closed_at":"2026-07-05T03:26:34Z","close_reason":"Multi-provider layer merged (c9f6b23); lib/providers/ present and wired into agents.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-elyi","title":"[bump] Surface ZapierApprovalError approval URL to the user (handleSdkError)","description":"Under SDK \u003e=0.50 with approvalMode unset, a server (non-TTY) defaults to 'throw': sdk.runAction throws ZapierApprovalError carrying an approval URL on approval-gated responses. Foreman's handleSdkError (zapier-sdk-tools.ts) currently catches it only via the generic ZapierError catch-all, surfacing .message/.code but DROPPING the approval URL. Add an explicit 'if (err instanceof ZapierApprovalError)' branch that returns the approval URL + approvalStatus so the agent can tell the user how to approve. Non-blocking for the bump (degrades gracefully today). Discovered during foreman-2xdk verification.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-11T15:10:57Z","created_by":"HamChowderr","updated_at":"2026-06-11T22:39:56Z","closed_at":"2026-06-11T22:39:56Z","close_reason":"Done: handleSdkError now surfaces ZapierApprovalError.approvalUrl (code APPROVAL_REQUIRED), placed before the generic ZapierError catch-all; handleSdkError exported + 2 unit tests (with/without URL) pass; lint clean. Verified approvalUrl field exists in SDK 0.69.3.","dependencies":[{"issue_id":"foreman-elyi","depends_on_id":"foreman-2xdk","type":"discovered-from","created_at":"2026-06-11T08:10:57Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-d4w9","title":"[aimock] Add a fixture-match coverage check to CI","description":"Nothing verifies fixtures on disk match aimock.json declarations. Add scripts/verify-aimock-coverage.mjs that enumerates declared MCP tools + A2A agents and asserts each has a fixture; wire into .github/workflows/test.yml. Add a short fixture-authoring doc (and why catch-alls are an anti-pattern).","acceptance_criteria":"Coverage script exists, runs in CI, fails on any unmocked declaration; short fixture doc added.","status":"closed","priority":3,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:30:31Z","created_by":"HamChowderr","updated_at":"2026-06-25T17:39:27Z","started_at":"2026-06-11T21:37:31Z","closed_at":"2026-06-25T17:39:27Z","close_reason":"Already complete + verified: scripts/verify-aimock-coverage.mjs exists, wired into .github/workflows/test.yml (Verify AIMock fixture coverage step), docs/aimock-fixture-drift.md present. Ran npm run verify:aimock -\u003e green (strict mode, 8 MCP tools + 5 A2A agents, no catch-all, no drift).","dependencies":[{"issue_id":"foreman-d4w9","depends_on_id":"foreman-9zsp","type":"discovered-from","created_at":"2026-06-11T01:30:31Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-8bh9","title":"[durable] Post-v1 spike: publishWorkflowVersion + runDurable hello-world; evaluate cron-\u003ewatchTriggerInbox SSE","description":"Deferred (post-v1). Prove Zapier durable execution: publish a trivial workflow version, runDurable, poll getDurableRun to terminal, triggerWorkflow via tokenized URL. Separately evaluate replacing the minute-tick cron-driver with watchTriggerInbox SSE for real-time triggers (relates to the trigger-inbox spike). No production wiring.","acceptance_criteria":"Spike doc with call shapes, latency notes, and a recommendation on whether/when to augment. Marked post-v1 backlog.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:29:44Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE (spike): finding committed docs/durable-workflow-spike.md — durable 403s userJwt wall; dropped from v1.","dependencies":[{"issue_id":"foreman-8bh9","depends_on_id":"foreman-iyq6","type":"discovered-from","created_at":"2026-06-11T01:29:44Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-13mw","title":"[trigger-inbox] Confirm long-term stability/sunset of experimental Triggers with Zapier","description":"Access works today (iyq6 notes), but the API is /experimental and the 0.51 changelog mentions a closed-beta notice. Ask Zapier whether trigger-inbox is the go-forward path, the stability/SLA, and any sunset risk. Low priority since we can already build/spike now; this de-risks long-term reliance and is a good Zapier-feedback touchpoint.","acceptance_criteria":"Documented answer from Zapier on stability/roadmap, or a logged attempt + explicit decision to proceed at our own risk.","notes":"Durable wall re-swept on SDK 0.79.0 (2026-06-25, client-creds, durable-endpoints-probe.ts): the wall MOVED vs the 0.70.4 18/18-walled sweep. Now 14/18 still userJwt-403-walled (all 13 workflow endpoints + getTriggerRun), but 4/18 — the durable-run family runDurable/cancelDurableRun/listDurableRuns/getDurableRun — now AUTHENTICATE with client-creds and return 403 'early access / available only to select users' (feature allowlist, not scope wall). So durable workflows still unusable end-to-end (can't define/publish), but the run family is now an early-access request away rather than scope-walled. Undetermined whether SDK or Zapier-server change. Doc updated (capability-map durable wall section).\n\nEARLY-ACCESS REQUEST DRAFT (durable-run family; user must submit — Foreman can't act on the Zapier account relationship). As of 0.79.0 the durable-RUN endpoints (runDurable/cancelDurableRun/listDurableRuns/getDurableRun) authenticate with client-creds but return 403 'available only to select users' — an early-access allowlist, not the userJwt scope wall. To unblock: ask Zapier (developer platform / durable EA contact) to add the Foreman client (ZAPIER_CLIENT_ID U5g…, account admin@otakusolutions.io / account id 16517015) to the durable-execution early-access program. The 13 durable WORKFLOW endpoints remain userJwt/internal-scope-walled and are NOT unblocked by this. Suggested message: 'We're building Foreman on @zapier/zapier-sdk and would like early access to the durable run-execution API (runDurable et al.) for client id U5g… / account 16517015. The run endpoints now authenticate but return the early-access 403; please add us to the allowlist.'\n\nEARLY-ACCESS URL CONFIRMED: the durable-run 403 message itself gives the intake — 'please get in touch with Zapier at https://next-gen-zaps.zapier.app/'. That's the next-gen-Zaps (durable) early-access program. Submit there for client U5g… / account 16517015 (admin@otakusolutions.io).\n\nEARLY-ACCESS REQUEST SUBMITTED 2026-06-25 via https://next-gen-zaps.zapier.app/ (the next-gen Zaps beta form). Submitted by Tylan Miller / Otaku Solutions / admin@otakusolutions.io; tools=SDK+MCP, agent=Claude Code, video-call=yes; pitched Foreman + asked for durable run/workflow API access. Access granted on a rolling basis — awaiting Zapier reply.\n\nACCESS GRANTED + CONFIRMED 2026-06-25. Email \"Youre In! Test the next generation of Zapier\" from Kenyon Sparks (kenyon.sparks@zapier.com), cc Tim Jones — next-gen-Zaps/durable early access turned ON for account admin@otakusolutions.io. CONFIRMED via read-only client-creds probe (scripts/durable-access-confirm.ts): the durable-RUN family wall is LIFTED — listDurableRuns -\u003e 2xx [] (was 403 'available only to select users'), getDurableRun(fake-uuid) -\u003e 404 'Run not found' (authenticated, not the early-access 403). So runDurable/listDurableRuns/getDurableRun/cancelDurableRun are now usable with client-creds. STILL PENDING: the 13 workflow-definition endpoints + getTriggerRun remain userJwt/internal-scope-walled under client-creds; the grant ships a NEW agentic experience (new Zapier SDK + skills) which is the path for those. Getting-started guide (Google Doc): https://docs.google.com/document/d/1-ZBpMQ5LDzqUzIWQEdwNvr1J72X8DyKbHEOmrem5ENk/edit — run its install command to get the new SDK+skills, then re-probe the workflow endpoints. Call booked with Tim Jones next week (stability/roadmap = this issue's acceptance criterion). NEXT: install new SDK+skills from guide; plan durable/trigger rebuild (deferred at workflow-engine removal).\nCORRECTION 2026-06-25 (post-grant re-test, read-only, durable-access-confirm.ts expanded): the workflow-definition family is NOT still walled. ALL tested read endpoints authenticate under client-creds now: listWorkflows-\u003e2xx empty; getWorkflow/listWorkflowVersions/getWorkflowVersion/listWorkflowRuns/getWorkflowRun/getTriggerRun all -\u003e 404 not-found (auth passed, resource just missing). So the grant opened the WHOLE durable+workflow READ surface, not just the durable-run family; the prior 14/18 userJwt-walled was the PRE-grant state. Write endpoints (createWorkflow/runDurable/publish/update/delete/enable/disable/trigger) authenticate at the same layer so are almost certainly reachable; a createWorkflow+deleteWorkflow round-trip would prove end-to-end (creates a real resource, not yet attempted).\nDEFINITIVE WRITE PROOF 2026-06-25 (scripts/durable-write-roundtrip.ts): createWorkflow + deleteWorkflow round-trip SUCCEEDED under client-creds. createWorkflow({name, is_private:true}) -\u003e 2xx with a real id (019f0166-3831-7e39-882c-ba3e78378c2c), enabled=false, is_private=true, trigger_url=https://code-substrate-workflows.zapier.com/api/v0/workflows/trigger/...; deleteWorkflow cleaned it up (no lingering resource). So workflow DEFINE works END-TO-END — the FULL durable+workflow API (read AND write) is usable for Foreman now under client-creds. createWorkflow only needs {name} (source_files belongs to publishWorkflowVersion, not create). The new agentic SDK+skills (getting-started guide) are about the AUTHORING experience, not API access. Durable/trigger rebuild is API-unblocked.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-06-11T08:29:35Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","dependencies":[{"issue_id":"foreman-13mw","depends_on_id":"foreman-iyq6","type":"discovered-from","created_at":"2026-06-11T01:29:34Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9hoq","title":"Wire checkpoint restore (undo generation) — needs backend endpoint","description":"The ai-elements/checkpoint.tsx component is ported from myrp-build but its 'restore' action is not wired into the live chat. myrp deletes files it wrote via Electron; Foreman (web + agent server) has no equivalent 'undo this generation' endpoint. To use the checkpoint marker meaningfully, add a backend route to roll back the side effects of an assistant turn (e.g. revert created proposals/actions), then render Checkpoint after the last assistant message in chat/messages.tsx wired to it. Until then the component stays unused to avoid a dead button.","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-06-02T09:54:11Z","created_by":"HamChowderr","updated_at":"2026-06-02T10:04:17Z","closed_at":"2026-06-02T10:04:17Z","close_reason":"Skipped per user decision — checkpoint restore not wanted. Component remains ported/available but unwired; revisit only if an undo-generation backend is built.","dependencies":[{"issue_id":"foreman-9hoq","depends_on_id":"foreman-te0c","type":"discovered-from","created_at":"2026-06-02T02:54:11Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-hnw1","title":"Clear Biome lint backlog (624 errors, 194 warnings) and re-add to CI","description":"When CI was bootstrapped (foreman-9zsp / PR #12), Biome lint was deliberately omitted because the codebase had 624 errors + 194 warnings of pre-existing style/a11y violations from rules that had never been enforced.\n\nTop offenders:\n- assist/source/organizeImports: 215 (just an import-order auto-fix)\n- lint/a11y/noSvgWithoutTitle: 64 (mostly shadcn icons)\n- lint/correctness/noUnusedVariables: 43 (warnings)\n- lint/style/useImportType: 42 (warnings)\n- lint/suspicious/noArrayIndexKey: 21\n- lint/correctness/noUnusedFunctionParameters: 18 (warnings)\n- lint/a11y/useButtonType: 14\n\nPlan:\n1. Run 'npx biome check --write' to auto-fix everything biome can fix safely (organize imports, useImportType, useTemplate, etc.). That should eat ~300+ violations.\n2. Triage remaining a11y errors — most are in shadcn-vendored components; either fix or ignore the components dir.\n3. Hand-fix the rest (parsing-error files, real bugs).\n4. Add 'npm run lint' back to .github/workflows/test.yml under the web job.\n\nAcceptance: 'npm run lint' passes with 0 errors. Warnings allowed but tracked. CI fails on new errors.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-10T00:01:49Z","created_by":"HamChowderr","updated_at":"2026-05-10T00:38:29Z","started_at":"2026-05-10T00:09:36Z","closed_at":"2026-05-10T00:38:29Z","close_reason":"Cleared. Started at 617 errors / 194 warnings, ended at 0/0. Auto-fixed ~600 (line endings, import order, type-only imports). Hand-fixed ~30 real issues (conditional hook, button types, label/input bindings, keyboard accessibility on interactive divs, forEach return values, unused vars). Targeted suppressions for ~15 valid patterns (Supabase thenable mocks, static-array index keys, custom multi-input components). Per-directory overrides for shadcn-vendored ui/ai-elements (don't fork upstream) and landing-page static demos. Lint job re-added to test.yml workflow.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-33qx","title":"Restructure root README.md — currently detailed but disorganized","description":"The README has good content but is sprawled. Needs to be reorganized into a clear, predictable order so a new contributor or evaluator can scan it top-to-bottom and orient themselves.\n\nTarget structure:\n1. Hero — name, one-line description, status badge\n2. What it is (2-3 sentences, no jargon)\n3. Quick start (5 commands max — Supabase + agents + web)\n4. Architecture (one diagram or bullet list — agents, web, channels, data flow)\n5. Stack (frameworks + key deps)\n6. Modes (dev / production / self_hosted — what each does and when to pick)\n7. Channels (table — Slack, Discord, Telegram, etc., with status)\n8. Deployment (Vercel for web, Coolify on Hostinger VPS for agents)\n9. Testing (unit / live / sdk / e2e tiers)\n10. Contributing / development workflow (bd, branches, PR conventions)\n11. Links (docs, related repos, design assets)\n\nScope:\n- packages/agents/CLAUDE.md and packages/agents/AGENTS.md stay as developer-facing detail; README is for top-level orientation.\n- Pull existing scattered content into the structure above. Cut anything that is duplicated in CLAUDE.md.\n- Use heading hierarchy that renders well on GitHub.\n- Verify every command + URL still works (don't blindly copy).\n\nAcceptance:\n- Single ToC at top\n- Each top-level section has consistent voice and length (intro paragraph + scannable list/table)\n- New contributor can run the project from a clean checkout using only README — no need to read CLAUDE.md first","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T22:24:08Z","created_by":"HamChowderr","updated_at":"2026-05-09T22:28:07Z","started_at":"2026-05-09T22:24:47Z","closed_at":"2026-05-09T22:28:07Z","close_reason":"README restructured into 11 ordered sections with ToC: What it is, Quick start, Architecture, Stack, Modes, Channels, Deployment, Testing, Development workflow, Links, License. Cut 648 lines of duplicated detail (full file tree, env-var lists, channel setup steps, API route table, schema table, security details) — those live in packages/agents/CLAUDE.md and AGENTS.md. Verified npm scripts, Next.js 16 / React 19 versions, Mastra + Hono + Supabase port shifts. Self-hosted mode rewritten as 'same per-user OAuth as production, just on own infra' (also fixed by foreman-8ktu fork in parallel; both edits converged).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bdgc","title":"LLM-judge accuracy scorer for Foreman dataset","description":"The trajectory scorer (foreman-trajectory-accuracy) measures tool-call sequences only. It cannot detect prompt changes that affect text output — confirmation template, narration discipline, clarification tone, empty-schema handling, etc. Demonstrated by v1→v2 prompt change producing identical 0.094 trajectory scores despite material text-quality changes.\n\nWORK:\n1. Build a second scorer using createScorer({type: 'agent'}) with a judge config (model: haiku-4-5 for cost, instructions describing how to compare actual agent output text against groundTruth.expected_behavior description).\n2. Score 0.0-1.0 based on whether agent's response matches expected_behavior description.\n3. Add to startExperiment scorers config alongside the trajectory scorer: scorers: { agent: [foremanTrajectoryScorer, foremanLLMJudgeScorer] }.\n4. Re-run full 80 to get a true v1 vs v2 comparison.\n\nACCEPTANCE:\n- New scorer at lib/scorers/foreman-llm-judge.ts\n- Wired into datasets-experiment.ts\n- v2 baseline run completes with both dimensions; LLM-judge dimension shows materially different score from v1 (validates the v2 changes are real quality improvements)","notes":"Scorer pipeline fixed and validated. Bug: both scorers were reading message.parts but Mastra's MastraDBMessage shape is message.content.parts, returning empty trajectories. After fix, full 80-item baseline:\n\nPer-scorer (n=80):\n- foreman-trajectory-accuracy: avg=0.094, perfect=7, zeros=72\n- foreman-llm-judge: avg=0.264, perfect=0, zeros=2\n\nPer-category (problem zones):\n- channel-triggered-workflow (n=47): traj=0.000, judge=0.226\n- save-as-workflow (n=7): traj=0.000, judge=0.150\n- scheduled-workflow (n=6): traj=0.000, judge=0.208\n- data-question (n=3): judge=0.117\n\nWorking categories:\n- platform-meta (n=2): judge=0.950\n- connect-app (n=1): judge=0.900\n- clarification-needed (n=2): judge=0.675\n\nTop failure modes from judge reasoning (not scorer bugs):\n1. Agent redirects to zapier.com instead of executing within Foreman\n2. Agent asks clarifying questions for clear read intents (Phase 4 violation)\n3. Exploration loops (list-connections -\u003e list-apps -\u003e repeat) without reaching run-action\n4. Misuse of find-first-connection vs find-unique-connection\n\nFiles: src/lib/scorers/foreman-trajectory.ts, src/lib/scorers/foreman-llm-judge.ts (new), scripts/datasets-analyze.ts (new). Also discovered: listExperimentResults pagination caps at 25 silently (perPage:50 returns 30 with hasMore:false). Workaround: page=0-indexed, perPage=25.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T20:49:40Z","created_by":"HamChowderr","updated_at":"2026-05-09T21:38:08Z","started_at":"2026-05-09T20:55:56Z","closed_at":"2026-05-09T21:38:08Z","close_reason":"LLM judge scorer working end-to-end. True baseline established: trajectory=0.094, judge=0.264 across 80 items. Both scorers now correctly extract from MastraDBMessage content.parts shape. Created datasets-analyze.ts to attribute scores per-item via scoresStore.listScoresByRunId(runId=experimentId). Failure modes identified for v3 prompt iteration: zapier.com redirects, premature clarification on read intents, exploration loops.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-dqzb","title":"Foreman prompt v2 — refinements from first test review","description":"Follow-up to foreman-mebm. After the v1 prompt rewrite (XML structure + 5 phases + multishot examples) shipped and was validated against 4 example tests, reviewing the actual conversation traces surfaced 6 specific refinements.\n\nREVIEW SOURCE: 4 conversations on resourceId='foreman' under thread IDs 1778349944-test{1-4}-*\n\nREFINEMENTS:\n\n1. **Confirmation template — enforce account name even for single-account connections.**\n Test 2 (HubSpot) said 'using the **HubSpot** connection' instead of 'using the **\u003caccount\u003e** HubSpot connection'. The template specifies \u003cconnection account name\u003e, but agents fall back to app name when only one account exists. Tighten the prompt: always state the account/email/handle even when there's only one.\n\n2. **Capitalization in field labels — pick a convention.**\n Test 4 used 'channel: #general' / 'text: standup in 5 minutes' (lowercase). Test 2 used 'First Name: John' / 'Last Name: Doe' (capitalized). The prompt template says \u003cfield\u003e: \u003cvalue\u003e without specifying casing. Either always Title Case the user-visible field name, or always echo the SDK schema's exact field key — pick one and add an explicit rule.\n\n3. **Over-narration — reduce mid-flow status updates.**\n Test 3 (multi-app) emitted 4 mid-flow text updates ('Now let me discover…', 'Actions found. Now let me run first-pass…', 'Now I need to resolve…'). Test 4 stayed silent through the same phases. Inconsistent. Per the 'Be concise' rule, narrate only at major decision points: initial plan, end-of-flow. Add explicit guidance: 'Do not narrate between every tool call. One initial plan announcement and the final confirmation are enough.'\n\n4. **Tone in clarification questions.**\n Test 1 opened with 'The request is a bit ambiguous' which reads slightly accusatory. Soften to 'Quick question — …' or similar. Add as a tone note in \u003cconversation_style\u003e.\n\n5. **Empty-schema edge case handling.**\n Test 3 hit a Google Sheet with no header columns. Agent acknowledged ('schema didn't return any column fields') but proceeded to confirm both actions anyway. The Sheets run-action would have failed at execution. Add explicit rule: 'If schema discovery returns no writable fields for a write action, refuse the step and ask the user to clarify what columns the action should set.'\n\n6. **Premature confirm handling.**\n Test 3 user said 'Confirm' before the agent had asked for one (after picking spreadsheet '1.'). Agent recovered fine but the prompt doesn't address this. Add: 'If the user says yes/confirm/go ahead before you have proposed an action, interpret as proceed with what you were doing — do not synthesize an action and re-confirm.'\n\nACCEPTANCE:\n- Updated prompt at lib/prompt-template.ts\n- Re-run the same 4 example prompts; verify no regression on triage/parallel/clarification behavior; verify the 6 refinements show up\n- Once foreman-baseline-v1 dataset is labeled (depends on foreman-ib6z), establish a baseline score before this change and re-score after to measure quality delta\n\nDEPENDS ON: foreman-mebm (this PR's predecessor), foreman-ib6z (for measurable scoring)","notes":"All 6 refinements applied and committed (a6a9142). Bundle rebuilt and v2 prompt verified in outbound system prompt (\u003crole\u003e tag visible). Could not validate experiment delta — Anthropic credit balance ran out during validation chat. To complete validation: top up Anthropic credits, then run npm run datasets:experiment -- --full and compare avg score against the v1 baseline of 0.094.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T18:15:43Z","created_by":"HamChowderr","updated_at":"2026-05-09T20:49:38Z","started_at":"2026-05-09T20:28:48Z","closed_at":"2026-05-09T20:49:38Z","close_reason":"v2 prompt shipped (a6a9142). Bundle rebuilt, verified live. Full 80-item experiment ran 80/80 success at $2.06 cost. Trajectory score: 0.094 (same as v1). Score parity is the EXPECTED result — all 6 v2 refinements affect text output (confirmation template, narration, tone, empty-schema handling, premature confirm), not tool-call sequences. The trajectory scorer measures sequence only. To quantitatively validate v2 we'd need an LLM-judge accuracy scorer (separate follow-up). Closing here because v2 is shipped and validated qualitatively (the prompt is live and the agent is using it per the chat trace). Quantitative validation is blocked on missing scoring dimension, not on the prompt itself.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ey7g","title":"Exclude unused Zapier SDK methods from tool generation","description":"Four SDK methods generated but unused: listInputFields (legacy duplicate of getInputFieldsSchema), createClientCredentials/deleteClientCredentials/listClientCredentials (Connect Builder OAuth — not exposed in Foreman). Excluding them removes noise from the tool catalog and the agent's search-tools surface area.","status":"closed","priority":3,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-05-09T01:38:00Z","created_by":"HamChowderr","updated_at":"2026-05-09T01:38:13Z","closed_at":"2026-05-09T01:38:13Z","close_reason":"Implemented in 8d23b85 (zapier-sdk-tools.ts EXCLUDED_METHODS rename + 4 new exclusions).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-s3gi","title":"Document channel integration setup requirements per platform","description":"After a few users give feedback, we need a structured log of exactly what credentials, permissions, and setup steps each channel requires for the cloud version. Covers Slack (OAuth app, scopes, redirect URI), Discord (bot invite, application ID, public key), and Telegram (BotFather, bot username). Should include what env vars to set and where to find each value. Could become in-app onboarding or a public setup guide.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-30T11:00:14Z","created_by":"HamChowderr","updated_at":"2026-04-30T12:32:40Z","closed_at":"2026-04-30T12:32:40Z","close_reason":"Channel setup credentials documented in README Channel Setup section — Slack (bot + OAuth), Telegram (bot username env var), Discord (app ID env var), with exact env var names for both agents and web packages.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-69pg","title":"Multi-workspace OAuth callbacks for channel distribution","description":"Each channel (Slack, Discord, Telegram, etc.) currently runs on a single bot token. To let other users/workspaces add Foreman, we need per-workspace OAuth flows: install URL → OAuth callback route that exchanges the code for a bot token → saves it per-workspace. Defer until we have user feedback on which channels matter most and what scopes are actually needed in practice. Affects: /slack/oauth, /discord/oauth routes in agents + NEXT_PUBLIC_*_INSTALL_URL env vars in web.","status":"closed","priority":3,"issue_type":"feature","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-30T01:22:53Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: multi-workspace Slack OAuth — slack/oauth.ts per-team upsert + rehydrateInstallations; 51e0919.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-yz2z","title":"Pen test Foreman API routes and auth layer","description":"Security audit of the Foreman API surface. Key areas to test: (1) JWT validation on all Hono routes in routes/index.ts — do all /conversations/*, /proposals/*, /workflows/* etc. reject missing/invalid tokens; (2) service_role key leakage — confirm it never reaches the browser bundle; (3) api_key table — fmn_ prefixed keys validated correctly in lib/api-auth.ts; (4) RLS bypass via SECURITY DEFINER functions; (5) Zapier OAuth callback flow for CSRF/state param validation.","status":"open","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-28T23:16:20Z","created_by":"HamChowderr","updated_at":"2026-06-30T08:00:57Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-yw8n","title":"Delete src/proxy.ts stub from web package","description":"After Clerk→Supabase migration, proxy.ts was reduced to an empty export stub. The real middleware is now src/middleware.ts. proxy.ts should be deleted to avoid confusion.","status":"closed","priority":3,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-26T07:32:12Z","created_by":"HamChowderr","updated_at":"2026-04-26T07:34:02Z","started_at":"2026-04-26T07:32:26Z","closed_at":"2026-04-26T07:34:02Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-blmn","title":"Set up .zapierrc + npx zapier-sdk add for typed app clients","description":"Run npx zapier-sdk add \u003capp\u003e for apps we actually use in workflow definitions. Creates .zapierrc pinning app versions and generates TypeScript types in src/zapier/apps/. Prerequisite for the apps proxy to be type-safe. Without this, the proxy works but returns unknown. Decide which apps to pin based on actual workflow usage.","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-22T07:13:42Z","created_by":"HamChowderr","updated_at":"2026-07-04T20:21:40Z","closed_at":"2026-04-22T07:26:57Z","close_reason":"Not needed for workflow sharing goal. Type generation only helps when hand-writing workflow step JSON in code; Foreman generates step JSON from LLM conversations at runtime, so types add no value. Revisit if we later hand-author workflow definitions.","dependency_count":0,"dependent_count":2,"comment_count":0} -{"_type":"issue","id":"foreman-3661","title":"Use Zapier apps proxy for workflow engine step execution","description":"workflows/engine.ts runs hand-authored step definitions via runAction(app, actionType, action, inputs). The comment at zapier-sdk-tools.ts:28-34 explicitly says the apps proxy (zapier.apps[appKey][actionType][actionKey]) is the right fit for this case — LLM tools stay on runAction, but workflow steps gain type safety from the proxy. Requires type generation (see linked issue).","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-22T07:13:38Z","created_by":"HamChowderr","updated_at":"2026-04-22T07:27:01Z","closed_at":"2026-04-22T07:27:01Z","close_reason":"Not needed for workflow sharing goal. Apps proxy is an ergonomic code-writing convenience; workflow engine executes JSON produced by the agent at runtime where the proxy adds no value. Revisit if we hand-author workflow logic.","dependencies":[{"issue_id":"foreman-3661","depends_on_id":"foreman-blmn","type":"blocks","created_at":"2026-04-22T00:14:53Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-lqs","title":"Use SDK dynamic credentials resolver in getSdkForUser","description":"getSdkForUser recreates + caches an SDK per user with manual refresh_token handling. The SDK supports credentials: async () =\u003e token as a resolver. Evaluate switching to one SDK instance + resolver, which would consolidate caching and refresh logic. Note: SDK only auto-refreshes client_credentials, not user OAuth refresh tokens — Foreman would still need to implement user-token refresh, but the shape can be unified.","status":"closed","priority":3,"issue_type":"chore","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-22T07:13:33Z","created_by":"HamChowderr","updated_at":"2026-04-22T07:18:34Z","closed_at":"2026-04-22T07:18:34Z","close_reason":"Won't do. The credentials resolver attaches to a single SDK instance with no per-call user context. Foreman's per-user OAuth model requires SDK-per-user, which is the current pattern. Resolver is useful for single-tenant or server-wide token rotation — the latter is already covered by foreman-4j9's client_credentials flow.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-cuf","title":"Next 16: rename middleware.ts → proxy.ts","description":"Next 16 renamed the middleware file convention to \"proxy\". Build log emits: \"The 'middleware' file convention is deprecated. Please use 'proxy' instead.\" File: packages/web/src/middleware.ts (Clerk route protection). Action: rename to packages/web/src/proxy.ts, verify Clerk middleware API is still imported correctly (proxy convention may expect a different default export signature vs middleware). Docs: https://nextjs.org/docs/messages/middleware-to-proxy. Low urgency — still works, just warns on every build.","status":"closed","priority":3,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-04-21T16:28:25Z","created_by":"HamChowderr","updated_at":"2026-04-21T16:30:46Z","closed_at":"2026-04-21T16:30:46Z","close_reason":"Renamed packages/web/src/middleware.ts → proxy.ts in commit 558279e. File content unchanged; the Clerk middleware API is identical between the two file conventions.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-bd0","title":"Migrate Clerk → Supabase Auth + add RLS + realtime","description":"Migrate Clerk → Supabase Auth and replace Drizzle with supabase-js entirely. Goal: single unified stack (auth + db + realtime + RLS) instead of Clerk + Supabase + Drizzle + custom middleware.\n\nWork needed:\n1. Drop @clerk/nextjs (web) and @mastra/auth-clerk (agents). Replace with Supabase Auth.\n2. Drop drizzle-orm, drizzle-kit, postgres-js. Replace all queries with supabase-js (service_role key on agents server, anon/user key on web).\n3. Run supabase gen types to generate TypeScript types from schema — replaces Drizzle schema file.\n4. Rewrite middleware.ts to validate Supabase session instead of Clerk JWT.\n5. Replace user table management — Supabase Auth owns auth.users; add a profiles table linked by auth.uid().\n6. Write RLS policies for all user-scoped tables: conversation, action_proposal, action_run, workflow, workflow_run, capability_flag, channel_identity, api_key, zapier_identity.\n7. Enable Supabase realtime for conversation/message streams — replace or augment custom SSE.\n8. Re-enable auth + realtime in supabase/config.toml (currently disabled).\n9. Channel bots (Discord/Slack/Telegram etc): keep service_role key — they resolve identity via channel_identity table, no user JWT.\n10. Update web sign-in/sign-up to use Supabase Auth UI or custom forms.\n11. Update CLAUDE.md, README, docs.\n\nDefer until: Postgres migration PR merged and stable. Then do this in one focused pass — no half-migration.","status":"closed","priority":3,"issue_type":"epic","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T16:12:46Z","created_by":"HamChowderr","updated_at":"2026-04-26T07:31:55Z","started_at":"2026-04-26T01:21:24Z","closed_at":"2026-04-26T07:31:55Z","close_reason":"Phase 1 (agents: Drizzle→supabase-js, Clerk JWT→Supabase JWT) and Phase 2 (web: @clerk/nextjs removed, Supabase auth scaffolded via shadcn registry) both complete and pushed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-rb6","title":"Pre-existing TypeScript errors in channel webhooks + tests","description":"Post-Supabase-migration tsc showed ~25 pre-existing TS errors (none from the LibSQL→Postgres port):\n- src/{discord,slack,telegram}/webhook.ts + src/webhook-server.ts: 'Promise\u003cChat\u003c...\u003e\u003e' missing .webhooks / .initialize — Chat-SDK call site not awaited (11 sites)\n- src/telegram/bot.ts:120: same .initialize on Promise\u003cChat\u003e\n- src/github/bot.ts:19: string|undefined assigned to number|undefined (parseInt missing on GITHUB_WEBHOOK_PORT env)\n- src/lib/api-auth.ts:1: Cannot find module './auth' (moved/deleted somewhere)\n- src/teams/bot.ts:18: 'singleTenant' should be 'SingleTenant' (casing)\n- src/routes/webhooks.ts:48: .start on Promise\u003cRun\u003e — another un-awaited promise\n- tests/aimock-setup.ts:10: 'aimock' property missing on llmock setup return — aimock API version drift\n- tests/integration/api-routes.test.ts (5 sites): 'body' is of type 'unknown' — need type assertions\nAll pre-date the Supabase migration; surfaced during post-migration tsc sweep 2026-04-21.","status":"closed","priority":3,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T15:49:09Z","created_by":"HamChowderr","updated_at":"2026-04-26T00:35:53Z","started_at":"2026-04-26T00:23:44Z","closed_at":"2026-04-26T00:35:53Z","close_reason":"Fixed in feature/mastra-editor","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-9y5","title":"Fix protocol integration tests — skip guard not working when no dev server","description":"Six tests in packages/agents/tests/integration/protocols.test.ts return 404 instead of skipping when Mastra isn't running. They target /.well-known/foreman/agent-card.json, /a2a/foreman (x3), /mcp/* (x2). serverIsReachable() helper isn't gating them. Either fix the guard or mark them explicitly as describe.skipIf(!serverIsReachable). Surfaced during post-Supabase-migration test run 2026-04-21.","status":"closed","priority":3,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T15:43:17Z","created_by":"HamChowderr","updated_at":"2026-04-26T00:35:53Z","started_at":"2026-04-26T00:23:46Z","closed_at":"2026-04-26T00:35:53Z","close_reason":"Fixed in feature/mastra-editor","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-mok","title":"Circular dependency in lib/catalog","description":"Mastra CLI warns on every bundle: 'Circular dependency found: src/lib/catalog/index.ts -\u003e src/lib/catalog/seed.ts -\u003e src/lib/catalog/index.ts'. Break the cycle by moving the shared types/constants that both files need into a third module (e.g. catalog/types.ts), or inverting one of the imports.","status":"closed","priority":3,"issue_type":"bug","owner":"admin@otakusolutions.io","created_at":"2026-04-21T07:40:18Z","created_by":"HamChowderr","updated_at":"2026-04-21T15:44:33Z","closed_at":"2026-04-21T15:44:33Z","close_reason":"Broke circular dep: seed.ts now imports indexAppCatalog directly from ./vector instead of ./index. Zero new files, one-line edit. tsc clean (pre-existing test-file errors unrelated).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-uzm","title":"Normalize appKey to slug in action_proposal rows","description":"action_proposal.appKey (schema.ts:59) is a free-text field — historical rows may contain implementation names (GoogleSheetsV2CLIAPI) while new rows use slugs (google-sheets) after the prompt update. This fragments history search. One-time migration: for each distinct appKey, call sdk.getApp({ app: appKey }) to resolve the canonical slug, then UPDATE action_proposal SET app_key = slug. Also update the RAG index (src/lib/rag/index.ts) to re-embed with canonical slugs. Discovered from foreman-mk9.","status":"closed","priority":3,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T02:16:35Z","created_by":"HamChowderr","updated_at":"2026-04-26T00:35:53Z","started_at":"2026-04-26T00:23:47Z","closed_at":"2026-04-26T00:35:53Z","close_reason":"Fixed in feature/mastra-editor","dependencies":[{"issue_id":"foreman-uzm","depends_on_id":"foreman-mk9","type":"discovered-from","created_at":"2026-04-20T19:16:35Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-psv","title":"Add Chat SDK channels: Slack, Discord","description":"Chat SDK supports Slack (@chat-adapter/slack), Discord (@chat-adapter/discord), Teams, Google Chat, GitHub, Linear. Add Slack and Discord as next channels after Telegram is solid. Same bot factory pattern, same user resolution.","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T05:12:50Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:47:38Z","closed_at":"2026-04-18T05:47:38Z","close_reason":"Slack and Discord channels added via Chat SDK. Same pattern as Telegram: singleton bot, auto-registration, webhook routes. @chat-adapter/slack + @chat-adapter/discord installed.","dependencies":[{"issue_id":"foreman-psv","depends_on_id":"foreman-53m","type":"blocks","created_at":"2026-04-17T22:13:07Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-ali","title":"Add cloneThread for conversation forking","description":"Let users fork a conversation to explore different automation paths without losing the original thread.","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:58Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:55:23Z","closed_at":"2026-04-18T05:55:23Z","close_reason":"fork_conversation tool using Mastra Memory native cloneThread(). Accepts threadId, returns newThreadId with copied messages.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-4ob","title":"Add Mastra Skills support","description":"Enable skill loading from workspace. Loadable skill packs for different Zapier app categories. Follows Agent Skills spec (agentskills.io).","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:57Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:55:25Z","closed_at":"2026-04-18T05:55:25Z","close_reason":"Skills enabled via workspace. Sample skill created at data/workspace/skills/zapier-basics/SKILL.md with common Zapier patterns.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-849","title":"Add voice capabilities (STT/TTS)","description":"Voice input via Telegram and web. @mastra/voice-openai for Whisper STT and TTS. CompositeVoice for mixing providers.","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T04:23:55Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:55:24Z","closed_at":"2026-04-18T05:55:24Z","close_reason":"OpenAIVoice added to agent via @mastra/voice-openai. Enables agent.voice.speak() (TTS) and agent.voice.listen() (STT).","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-6lb","title":"Split into multi-agent (supervisor + specialists)","description":"Break Foreman into subagents: discovery agent, execution agent, workflow builder agent. Supervisor routes requests. Phase 3 — after single agent is solid.","status":"closed","priority":3,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:15Z","created_by":"HamChowderr","updated_at":"2026-04-18T05:47:55Z","closed_at":"2026-04-18T05:47:55Z","close_reason":"Supervisor + 3 specialist subagents (discovery/Haiku, execution/Sonnet, history/Haiku). Uses Mastra native agents property for auto-delegation. Original foreman agent unchanged — supervisor is alternative entry point.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-u5j7","title":"Optionally adopt Conversation stick-to-bottom wrapper in chat","description":"ai-elements/conversation.tsx (use-stick-to-bottom) is ported but not wired in; chat/messages.tsx still uses the existing useMessages scroll hook (works fine). If we want myrp's exact smooth stick-to-bottom feel, refactor messages.tsx to render inside \u003cConversation\u003e/\u003cConversationContent\u003e + \u003cConversationScrollButton\u003e. Low priority — current scroll behavior is equivalent.","status":"closed","priority":4,"issue_type":"task","owner":"admin@otakusolutions.io","created_at":"2026-06-02T09:54:12Z","created_by":"HamChowderr","updated_at":"2026-06-02T10:04:16Z","closed_at":"2026-06-02T10:04:16Z","close_reason":"Done — wired Conversation/ConversationContent/ConversationScrollButton (use-stick-to-bottom) into chat/messages.tsx, replacing the manual scroll hook. Clean build passes.","dependencies":[{"issue_id":"foreman-u5j7","depends_on_id":"foreman-te0c","type":"discovered-from","created_at":"2026-06-02T02:54:12Z","created_by":"HamChowderr","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-v4i4","title":"Fixture drift detection — design + decision (NOT just an aimock config)","description":"Fixtures at packages/agents/tests/fixtures/aimock/ were recorded against specific Anthropic response shapes (Sonnet 4.6, Haiku 4.5). If Anthropic ships a new revision or changes streaming chunk format, mocked tests pass against stale fixtures and we get false green. Drift detection periodically replays fixtures against the real provider and flags divergence.\n\nDepends on: foreman-9zsp (CI must exist before scheduled drift jobs can run there).\n\nScope:\n1. Read https://aimock.copilotkit.dev/drift-detection/ for the current command surface + recommended cadence. Do not guess from training data.\n2. Decide cadence: weekly cron on .github/workflows/drift.yml is probably right; monthly may be too slow for catching API changes pre-incident.\n3. Job runs aimock drift command with ANTHROPIC_API_KEY (real provider) against existing fixtures. On divergence, fail the workflow + open an issue or post to a Slack channel.\n4. Budget guard: cap real-provider spend per run (drift checks should be cheap, but pin a max).\n5. Wire ANTHROPIC_API_KEY as a repo secret (already set for Vercel — copy or reuse).\n\nAcceptance:\n- Weekly drift job runs and either passes silently or opens a github issue describing which fixture diverged from real provider\n- One forced-divergence test case proves the workflow actually catches drift (e.g. temporarily edit a fixture, confirm next run fails)","notes":"Investigation finding: AIMock's documented 'drift detection' (https://aimock.copilotkit.dev/drift-detection/) is internal QA for the AIMock library — it tests that AIMock's BUILT-IN mocks match real provider APIs. Direct quote: 'aimock includes three-way drift tests that compare SDK types, real API responses, and mock output.' That's their library testing itself, not a feature consumers can wire to validate their own recorded fixtures.\n\nThere is no documented user-facing feature in @copilotkit/aimock for periodic real-provider replay against user fixtures.\n\nThe underlying need is still real (Anthropic ships new model revisions, our recorded fixtures go stale, mocked tests pass on fake data). But it's a build, not a config:\n\nOption A — Roll our own:\n1. Weekly cron workflow that runs the existing test suite WITHOUT aimock (real ANTHROPIC_API_KEY)\n2. Capture the responses, diff against the recorded fixture JSON\n3. Open a github issue when fields/types diverge\n4. Spend cap: ~/month on real API replay\n\nOption B — Pin aggressively:\n- Lock anthropic-sdk version, lock model IDs to specific dated snapshots\n- Re-record fixtures on schedule (manual quarterly review)\n- Cheaper but fragile to silent shape changes\n\nOption C — Defer:\n- Accept the risk for v1\n- Revisit when we have a real customer hit by stale fixtures\n- Lowest effort\n\nRecommend Option C until the agent has paying users — drift damage is theoretical right now and Option A's tooling lift is non-trivial.","status":"closed","priority":4,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-05-09T23:31:49Z","created_by":"HamChowderr","updated_at":"2026-07-05T04:52:45Z","closed_at":"2026-07-05T04:52:45Z","close_reason":"DONE: design+decision doc committed — docs/aimock-fixture-drift.md (0ca0b2d).","dependency_count":0,"dependent_count":1,"comment_count":0} -{"_type":"issue","id":"foreman-8w7","title":"Swap elevenlabs npm package → @elevenlabs/elevenlabs-js","description":"Transitive dep issue: the 'elevenlabs' package is pulled in by @mastra/voice-elevenlabs@0.12.0 (its direct dep, see node_modules/@mastra/voice-elevenlabs/package.json). Not fixable from our repo. Actions: (1) Upstream: file an issue on mastra-ai/mastra asking voice-elevenlabs to migrate to @elevenlabs/elevenlabs-js. (2) Monitor: bump @mastra/voice-elevenlabs when they release a version using the new package. (3) Until then: ignore the npm warn on install — it's informational, not blocking.","notes":"Moot — @mastra/voice-elevenlabs removed from the project entirely. No longer a transitive dep concern.","status":"closed","priority":4,"issue_type":"chore","owner":"admin@otakusolutions.io","created_at":"2026-04-21T16:28:54Z","created_by":"HamChowderr","updated_at":"2026-04-26T01:08:18Z","closed_at":"2026-04-26T01:08:18Z","close_reason":"Removed @mastra/voice-elevenlabs from project — ElevenLabs TTS is no longer used","defer_until":"2026-07-01T07:00:00Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-cur","title":"Native fetch in workflow sandbox — switch to 'workflow' import","description":"packages/agents/src/mastra/index.ts customMiddleware (~line 43) uses native fetch to dynamically load routes. Linter warns native fetch() is not available in workflow sandbox scope, recommends: import fetch from 'workflow' OR move the call into a 'use step' function. Low-impact today because the call is in middleware, not a workflow step, but worth aligning.","status":"closed","priority":4,"issue_type":"task","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T15:43:34Z","created_by":"HamChowderr","updated_at":"2026-04-26T01:01:07Z","started_at":"2026-04-26T00:59:06Z","closed_at":"2026-04-26T01:01:07Z","close_reason":"False positive — customRoutes.fetch() is Hono's .fetch() method, not global fetch. Middleware doesn't run in workflow sandbox. No fix needed.","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-0sb","title":"Telegram bot singleton test times out after 5s","description":"packages/agents/tests/unit/telegram-bot.test.ts 'getTelegramBot returns a singleton' hits 5000ms timeout. Pre-existing, surfaced during post-migration test run. Likely making a real network call or has a flaky mock. Either bump timeout, add proper mock, or rewrite the assertion.","status":"closed","priority":4,"issue_type":"bug","assignee":"HamChowderr","owner":"admin@otakusolutions.io","created_at":"2026-04-21T15:43:22Z","created_by":"HamChowderr","updated_at":"2026-04-26T01:01:05Z","started_at":"2026-04-26T00:59:07Z","closed_at":"2026-04-26T01:01:05Z","close_reason":"Mocked @chat-adapter/telegram and chat to prevent real Telegram API calls during init","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"foreman-6kz","title":"Add guardrails and output processors","description":"Deferred — guardrails/processors API not yet available in current Mastra core. Revisit when Mastra ships the feature.","status":"closed","priority":4,"issue_type":"feature","owner":"admin@otakusolutions.io","created_at":"2026-04-18T03:27:14Z","created_by":"HamChowderr","updated_at":"2026-04-18T18:12:16Z","closed_at":"2026-04-18T18:12:16Z","close_reason":"Done: guardrails system covers all output processors and guardrail needs.","dependency_count":0,"dependent_count":0,"comment_count":0} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 15138398..0657b6c5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: npm - run: npm ci # Fail fast if aimock.json's declared MCP tools / A2A agents drift away @@ -45,7 +45,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: npm - run: npm ci # `mastra build` / vitest transpile with esbuild (no type-checking), so @@ -61,7 +61,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: npm - run: npm ci - name: Build web (also type-checks) @@ -75,7 +75,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: npm - run: npm ci - name: Biome check (lint + format) @@ -89,7 +89,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: npm # check-dep-uniqueness.mjs runs as part of postinstall, so npm ci alone # validates that there are no duplicate-resolved versions across the @@ -104,7 +104,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 22 + node-version: 24 cache: npm - uses: supabase/setup-cli@v1 with: diff --git a/.gitignore b/.gitignore index cd95957f..ff9684b5 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,8 @@ preview-auth.json # Personal Claude Code local settings — machine-specific permission allowlist. # The shared project config is .claude/settings.json (tracked); this one is per-machine. .claude/settings.local.json + +# Beads export (disposable; kept fresh via export.auto). Source of truth = Dolt DB. cp-uif3.1 +.beads/issues.jsonl +.beads/dolt-backup.json +.beads/dolt-backup-state.json diff --git a/Dockerfile.agents b/Dockerfile.agents index 72518160..48625168 100644 --- a/Dockerfile.agents +++ b/Dockerfile.agents @@ -1,4 +1,4 @@ -FROM node:22-slim AS builder +FROM node:24-slim AS builder WORKDIR /app @@ -17,7 +17,7 @@ WORKDIR /app/packages/agents RUN npx mastra build # --- Production stage --- -FROM node:22-slim +FROM node:24-slim WORKDIR /app diff --git a/README.md b/README.md index d6395abe..be9848cd 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ # 👷 Foreman -### Describe the task. It gets done — across 9,000+ apps, from any chat. +### Describe the task. It gets done — across 10,000+ apps, from any chat. -**Foreman is an AI assistant that takes real actions across 9,000+ apps through [Zapier](https://zapier.com/).** Tell it what you want in plain language — _"send Sarah the Q3 deck"_, _"create a Trello card for tomorrow"_, _"search my Gmail for unpaid invoices"_ — and it figures out which connected app and action to use, shows you exactly what it plans to do for approval, then executes. Same agent, same memory, same connected apps whether you're on the web, in Slack, Discord, Telegram, Teams, and more. +**Foreman is an AI assistant that takes real actions across 10,000+ apps through [Zapier](https://zapier.com/).** Tell it what you want in plain language — _"send Sarah the Q3 deck"_, _"create a Trello card for tomorrow"_, _"search my Gmail for unpaid invoices"_ — and it figures out which connected app and action to use, shows you exactly what it plans to do for approval, then executes. Same agent, same memory, same connected apps whether you're on the web, in Slack, Discord, Telegram, Teams, and more. [![License: MIT](https://img.shields.io/badge/license-MIT-blue)](#-license) [![Status: alpha](https://img.shields.io/badge/status-alpha-orange)]() @@ -21,13 +21,15 @@ --- +> **Open source — and a template.** Foreman was built to contribute to Zapier's open-source SDK ecosystem, and to be a working template for anyone who wants to explore, learn, and build with the Zapier SDK — solo, with a team, or with clients. + ## ⚡ What it does Tell Foreman what you want, in plain English: > _"Email Sarah the Q3 deck, then log it in Notion."_ · _"Create a Trello card for tomorrow's standup."_ · _"Search my Gmail for unpaid invoices this month."_ -Foreman figures out **which connected app and action** fits — out of [9,000+ on Zapier](https://zapier.com/apps) — drafts exactly what it's about to do, and **shows it to you as an approval card first**. You approve, edit, or decline. Only then does it run for real. Nothing destructive happens behind your back. +Foreman figures out **which connected app and action** fits — out of [10,000+ on Zapier](https://zapier.com/apps) — drafts exactly what it's about to do, and **shows it to you as an approval card first**. You approve, edit, or decline. Only then does it run for real. Nothing happens without your approval. Then just keep talking: @@ -35,13 +37,13 @@ Then just keep talking: It's the **same agent across every surface** — the web app, Slack, Discord, Telegram, Microsoft Teams, Google Chat, WhatsApp, GitHub, Linear, and iMessage — with one shared memory and one set of connected accounts. Start a task in Slack, finish it on the web. -Under the hood it isn't a single mega-prompt. Foreman is a small team of focused [Mastra](https://mastra.ai/) agents (discovery, execution, history, supervisor) that load only the Zapier tools a request needs — so it acts against the APIs that **actually exist**, with approval gates and per-user auth built in. +Foreman runs on Mastra's **Agent Harness** — one agent that spawns focused sub-agents (discovery, execution, history) as needed and loads only the Zapier tools a request needs, so it calls real APIs, with approval and per-user auth built in. --- ## 💬 What a request looks like -One message → a proposed action you can see and approve → a real result on disk in the connected app. +One message → a proposed action you can see and approve → a real result in the connected app.
"Email Sarah the Q3 deck and log it in Notion" — click to expand @@ -89,13 +91,15 @@ Every run is recorded (who, what, when, result) and searchable later — _"what ## 🎯 Why Foreman? - **🌐 One agent, every channel.** Web, Slack, Discord, Telegram, Microsoft Teams, Google Chat, WhatsApp, GitHub, Linear, iMessage — plus MCP and A2A for other agents. Same memory and connected apps everywhere. -- **✋ Approval-gated by default.** Write and delete actions never fire silently — Foreman shows you a proposal card and waits for **approve / edit / decline**. Read-only discovery runs freely. -- **🔌 9,000+ apps, real APIs.** Actions come straight from [`@zapier/zapier-sdk`](https://docs.zapier.com/sdk) as auto-generated tools — no hand-wired integrations, no hallucinated endpoints. Parameter names come from Zapier's own schemas. -- **🧠 Memory that follows you.** Conversations, action history, and embeddings live in Postgres + pgvector, so Foreman remembers context and you can semantically search past runs. -- **🔐 Per-user auth.** Each person connects **their own** Zapier account through an OAuth (PKCE) flow — Foreman never shares one god-account across users. +- **✋ Approval-gated by default.** Write and delete actions always ask first — Foreman shows a proposal card and waits for **approve / edit / decline**. Read-only discovery runs freely. +- **🔌 10,000+ apps, real APIs.** Actions come straight from [`@zapier/zapier-sdk`](https://docs.zapier.com/sdk) as auto-generated tools — no hand-wired integrations, no made-up API calls. Parameter names come from Zapier's own schemas. +- **🧠 Memory that follows you.** Conversations, action history, and embeddings live in Postgres + pgvector (local `fastembed` embeddings — no embedding API needed), so Foreman remembers context and you can semantically search past runs. +- **📚 Documents.** Save notes, plans, and specs to a shared team workspace and **semantically search them in chat**. +- **🔁 Automations.** Build durable, scheduled automations with an at-a-glance daily digest _(experimental — needs Zapier early-access; see [Experimental access](#-experimental-access))_. +- **🔐 Per-user auth.** Each person connects **their own** Zapier account through an OAuth (PKCE) flow — Foreman never shares one account across users. - **🏠 Self-hostable today.** Run the whole stack on your own infra. Hosted version coming soon. - **🤖 Model choice.** Claude Sonnet 4.6 for reasoning, Haiku 4.5 for fast steps — swappable via the provider layer. -- **🎙️ Voice in.** Speak a request — Whisper drops it into the box. +- **🎙️ Voice in.** Speak a request and it's transcribed into the chat (Whisper). --- @@ -107,7 +111,7 @@ Every run is recorded (who, what, when, result) and searchable later — _"what ▼ ┌──────────────────────────────────┐ │ Foreman agent │ Claude Sonnet 4.6 - │ Mastra + ToolSearch over 28 │ + │ Mastra + ToolSearch over 26 │ │ live Zapier SDK tools │ └────────────────┬─────────────────┘ │ picks app + action, fills params @@ -125,20 +129,20 @@ Every run is recorded (who, what, when, result) and searchable later — _"what result + run history (Postgres + pgvector) ``` -A request lands from any channel, hits the **Foreman agent**, which loads only the Zapier tools that request needs (via a tool-search processor rather than stuffing all 28 into the prompt). Write actions become **proposals**; you approve them; the **Zapier SDK** runs them; the result and full run record persist to Postgres. Discovery, execution, and history are split into focused sub-agents so each step stays cheap and reliable. +A request lands from any channel, hits the **Foreman agent**, which loads only the Zapier tools that request needs (via a tool-search step, instead of loading all 26 at once). Write actions become **proposals**; you approve them; the **Zapier SDK** runs them; the result and full run record persist to Postgres. The harness spawns focused, tool-isolated sub-agents (discovery, execution, history) on demand, so each step stays cheap and reliable. --- -## 🔐 Proposals & approval — safe by construction +## 🔐 Proposals & approval -Foreman draws a hard line between **reading** and **changing the world**: +Foreman separates **reading** from **making changes**: - ✅ **Read-only discovery** (list channels, search records, fetch a row) runs immediately — it's harmless. - ⏸️ **Writes and deletes pause for approval.** A proposal card shows the exact app, action, and every field before anything runs. You approve, edit the fields, or decline. - 🧾 **Every run is recorded** — app, action, inputs, result, who triggered it, when — and is semantically searchable afterward. - 🛡️ **Guardrails** apply rate limits and risk assessment; an output processor redacts PII before responses leave the agent. -The set of write/delete tools that require approval is explicit (9 of them), separate from the 16 read-only discovery tools — so the boundary is defined in code, not guessed at runtime. +The set of write/delete tools that require approval is explicit (9 of them), separate from the 17 read-only discovery tools — so the boundary is defined in code. --- @@ -149,7 +153,7 @@ The set of write/delete tools that require approval is explicit (9 of them), sep | Web | Next.js frontend | ✅ Working | | Slack | `@chat-adapter/slack` | ✅ Working | | Telegram | `@chat-adapter/telegram` | ✅ Working | -| Discord | `@chat-adapter/discord` | ✅ Working _(needs both `:4111` and `:4112`)_ | +| Discord | `@chat-adapter/discord` | ✅ Working | | Google Chat | `@chat-adapter/gchat` | ✅ Working | | GitHub | `@chat-adapter/github` | ✅ Working | | Linear | `@chat-adapter/linear` | ✅ Working | @@ -163,6 +167,19 @@ Each platform user is mapped to a Foreman user via the `channel_identity` table. --- +## 🧪 Experimental access + +Foreman's action layer runs on [`@zapier/zapier-sdk`](https://docs.zapier.com/sdk), which is currently in Zapier's **early-access / open-beta** program — and the **durable & scheduled automations** feature uses the SDK's _experimental_ surface, gated behind a Zapier **early-access allowlist**. + +**What that means right now:** + +- ✅ The **everyday action layer** — run actions, discovery, tables, trigger inboxes — plus chat, approvals, documents, and memory all work with a normal Zapier login. +- ⏳ **Durable + scheduled automations** (the `/automations` page and daily digest) need your Zapier account on the experimental allowlist, so you must **apply for access first**. + +👉 **Apply for experimental access here: [next-gen-zaps.zapier.app →](https://next-gen-zaps.zapier.app/)** + +--- + ## 🚀 Getting started **Prerequisites:** @@ -212,20 +229,20 @@ Same agent, same connected apps — you just choose how Zapier auth resolves. `F Self-hosted is **not** a single-shared-account mode — every user still connects their own Zapier account. Foreman just runs on infrastructure **you** own instead of ours. A managed hosted version is coming soon. -> Which credential type works on which SDK surface — and why durable execution is walled off — is documented in [`docs/zapier-auth-model.md`](docs/zapier-auth-model.md). New to the SDK? See [Working with the Zapier SDK](#-working-with-the-zapier-sdk) below. +> Which credential works on which SDK surface is documented in [`docs/zapier-auth-model.md`](docs/zapier-auth-model.md). New to the SDK? See [Working with the Zapier SDK](#-working-with-the-zapier-sdk) below. --- ## 🔌 Working with the Zapier SDK -Foreman's entire action layer is generated from [`@zapier/zapier-sdk`](https://docs.zapier.com/sdk) — every one of the 9,000+ apps becomes a tool, with parameter names read straight from Zapier's own schemas. If you're coming from the Zapier community and haven't driven the SDK directly, here's the whole picture. +Foreman's entire action layer is generated from [`@zapier/zapier-sdk`](https://docs.zapier.com/sdk) — every one of the 10,000+ apps becomes a tool, with parameter names read straight from Zapier's own schemas. If you haven't used the SDK directly, here's the whole picture. ### Two packages | Package | What it is | |---|---| -| [`@zapier/zapier-sdk`](https://www.npmjs.com/package/@zapier/zapier-sdk) | The library Foreman imports directly. Its registry is what becomes the 28 live tools — no MCP child process, no hand-wired integrations. | -| [`@zapier/zapier-sdk-cli`](https://www.npmjs.com/package/@zapier/zapier-sdk-cli) | The companion CLI. Used to log in for local dev, and to poke at the SDK by hand while exploring what an app/action expects. | +| [`@zapier/zapier-sdk`](https://www.npmjs.com/package/@zapier/zapier-sdk) | The library Foreman imports directly. Its registry is what becomes the 26 live tools — no MCP child process, no hand-wired integrations. | +| [`@zapier/zapier-sdk-cli`](https://www.npmjs.com/package/@zapier/zapier-sdk-cli) | The companion CLI. Used to log in for local dev, and to try the SDK by hand and see what an app/action expects. | ### Logging in — the four ways @@ -233,34 +250,34 @@ Foreman accepts any credential type the SDK does; you pick one with `FOREMAN_MOD | Method | How | Use it for | |---|---|---| -| **CLI login** | `npx @zapier/zapier-sdk-cli login` → writes `~/.zapier-sdk/config.json` | The zero-config dev path. `FOREMAN_MODE=dev` falls back to it automatically. | +| **CLI login** | `npx @zapier/zapier-sdk-cli login` → writes `~/.zapier-sdk/config.json` | The simplest dev path. `FOREMAN_MODE=dev` falls back to it automatically. | | **Per-user OAuth (PKCE)** | Each user clicks _Connect Zapier_ in the UI | Self-hosted / multi-user — everyone connects _their own_ account. Needs `ZAPIER_CLIENT_ID` + `ZAPIER_CLIENT_SECRET`. | | **Client credentials** | `ZAPIER_CLIENT_ID` + `ZAPIER_CLIENT_SECRET` | App-level, server-to-server calls. | -| **Token override** | `DEV_ZAPIER_OVERRIDE=` | Drop in a pre-obtained token for local dev — skips login entirely. | +| **Token override** | `DEV_ZAPIER_OVERRIDE=` | Use a pre-obtained token for local dev — skips login entirely. | -> **Heads-up for SDK explorers:** not every surface accepts every credential. The everyday action layer (run actions, discovery, tables, trigger inboxes) works with any user auth — but Zapier's experimental **durable-workflow** endpoints require an `internal`-scoped token no public SDK client can mint, so they `403` under _every_ login method above. The full surface-by-surface breakdown (and why) is in [`docs/zapier-auth-model.md`](docs/zapier-auth-model.md). +> **Heads-up:** not every surface is open yet. The everyday action layer (run actions, discovery, tables, trigger inboxes) works with any Zapier login. The experimental **durable / scheduled-automation** endpoints are gated behind a Zapier **early-access allowlist**, so automations require applying for access — see [Experimental access](#-experimental-access). More detail: [`docs/zapier-auth-model.md`](docs/zapier-auth-model.md). ### Staying current — `npm run sdk:check` -The SDK ships fast, and real capabilities land in point releases (the durable-workflow and trigger-inbox APIs both arrived that way). To make "are we behind?" a fact instead of a surprise, the repo ships a watcher: +The Zapier SDK updates often, and new capabilities can arrive in minor releases. To make it easy to see whether you're on the latest, the repo ships a version watcher: ```bash npm run sdk:check # full report: installed vs latest, releases behind, changelog delta -npm run sdk:check:quiet # one-line notice, only when a newer version exists (session-start hook) +npm run sdk:check:quiet # one-line notice, only when a newer version exists ``` -It tracks **both** packages, fetches the changelog delta since your installed version, and never fails a build if npm is unreachable. A session-start hook runs the quiet form so you're nudged when an upgrade lands — then bump deliberately, since point releases can change behavior. +It checks both packages and never fails a build if npm is unreachable. Bump deliberately — minor releases can change behavior. ### Explore the SDK yourself -You don't have to take our word for any of this. The repo vendors the SDK + CLI docs and ships an introspection tool so you can see the live surface for yourself: +The repo includes the SDK + CLI docs and a tool to list the live SDK surface yourself: | Resource | What it gives you | |---|---| | [`docs/zapier-sdk/quickstart.md`](docs/zapier-sdk/quickstart.md) · [`using-the-cli.md`](docs/zapier-sdk/using-the-cli.md) | Hands-on: install, log in, run your first action from the CLI. | | [`docs/zapier-sdk/cli-reference.md`](docs/zapier-sdk/cli-reference.md) · [`sdk-reference.md`](docs/zapier-sdk/sdk-reference.md) | Full command + method reference for the CLI and SDK. | -| [`docs/zapier-sdk-capability-map.md`](docs/zapier-sdk-capability-map.md) | The living ledger — every SDK surface, what Foreman uses, and what we deliberately don't build. | -| `npx tsx packages/agents/scripts/sdk-surface-sweep.ts` | Dumps the entire live SDK surface — no creds, no network, pure introspection. The "prove it" tool. | +| [`docs/zapier-sdk-capability-map.md`](docs/zapier-sdk-capability-map.md) | A reference of every SDK surface, what Foreman uses, and what it deliberately doesn't. | +| `npx tsx packages/agents/scripts/sdk-surface-sweep.ts` | Lists the full live SDK surface — no credentials or network needed. | --- @@ -272,24 +289,24 @@ A two-package npm-workspaces monorepo: a Mastra + Hono **agents server** and a N packages/ ├─ agents/ Mastra + Hono agent server (:4111) │ ├─ src/mastra/ -│ │ ├─ agents/ Foreman · Discovery · Execution · History · Supervisor -│ │ └─ tools/ connect_zapier · search_history · fork_conversation +│ │ ├─ agents/ Foreman on the Mastra Agent Harness — spawns discovery · execution · history +│ │ └─ tools/ connect_zapier · search_history · save_document · preview_app · automations · … │ ├─ src/lib/ -│ │ ├─ zapier-sdk-tools 28 auto-generated tools from @zapier/zapier-sdk +│ │ ├─ zapier-sdk-tools 26 auto-generated tools from @zapier/zapier-sdk │ │ ├─ zapier/ PKCE OAuth connect flow + per-user SDK │ │ ├─ db/ Supabase schema + service-role client │ │ ├─ processors/ context injector (in) + PII redactor (out) │ │ └─ rag/ action-history indexing + semantic search -│ ├─ src/routes/ Hono: /conversations /proposals /workflows /voice … +│ ├─ src/routes/ Hono: /conversations /proposals /automations /apps /documents /voice … │ └─ src/{slack,discord,telegram,teams,…}/ channel webhooks (:4112) └─ web/ Next.js 16 frontend (:3000) └─ src/ - ├─ app/ App Router — chat, /workflows, /auth - ├─ components/ chat-shell · chat-pane · approval-card - └─ lib/api-client all agent-server calls + ├─ app/ App Router — chat, /apps, /automations, /documents, /auth + ├─ components/ chat/ (shell · messages · message) · ai-elements/tool (inline approvals) + └─ lib/*-client conversations · apps · documents · stored-agents → agent server supabase/migrations/ Postgres schema (users, conversations, proposals, - runs, workflows, channel_identity, …) + runs, automations, channel_identity, …) ``` ``` @@ -301,8 +318,8 @@ supabase/migrations/ Postgres schema (users, conversations, proposals, ▼ ▼ packages/web (Next.js :3000) packages/agents (:4111 + :4112) Supabase auth · SSE Mastra + Hono - chat UI · /workflows 5 agents (Foreman, Discovery, - page · voice mic Execution, History, Supervisor) + chat UI · /automations Foreman on the Mastra Harness + page · voice mic (spawns discovery/execution/history) │ ▼ ┌─────────────────┐ users, conversations, @@ -312,24 +329,24 @@ supabase/migrations/ Postgres schema (users, conversations, proposals, ▼ ┌─────────────────┐ direct import of │ Zapier SDK │ @zapier/zapier-sdk - │ (single-shot) │ → 28 tools + │ (direct call) │ → 26 tools └─────────────────┘ ``` -- **Agents server (`:4111`):** Mastra agents over Hono. Custom routes — `/chat`, `/conversations`, `/proposals`, `/workflows`, `/capabilities`, `/voice` — plus Mastra built-ins `/api/agents`, `/a2a/foreman`, `/mcp/*`. -- **Webhooks server (`:4112`):** separate process for the Discord Gateway WebSocket and channel webhooks. Discord needs both servers running. +- **Agents server (`:4111`):** Mastra agents over Hono. Custom routes — `/chat`, `/conversations`, `/proposals`, `/automations`, `/apps`, `/documents`, `/capabilities`, `/voice` — plus Mastra built-ins `/api/agents`, `/a2a/foreman`, `/mcp/*`. +- **Webhooks server (`:4112`):** optional separate process for inbound channel webhooks — HTTP only, no persistent socket. - **Web frontend (`:3000`):** Next.js 16 + React 19 + Tailwind 4 + shadcn/ui, streaming over SSE. -- **Storage:** `MastraCompositeStore` on Postgres + DuckDB for the observability domain (traces, scores, metrics). +- **Storage:** `PostgresStore` (a Mastra composite store) on Postgres — every Mastra domain, **including observability** (traces, scores, metrics); no DuckDB. ### Stack | Layer | Technology | |---|---| -| Agent framework | [Mastra](https://mastra.ai) — `@mastra/core`, `@mastra/memory`, `@mastra/evals`, `@mastra/duckdb`, `@mastra/observability` | -| Chat channels | [Chat SDK](https://chat-sdk.dev) — `chat`, `@chat-adapter/*` | -| Action layer | `@zapier/zapier-sdk` (direct import; 28 auto-generated tools) | +| Agent framework | [Mastra](https://mastra.ai) — `@mastra/core`, `@mastra/memory`, `@mastra/rag`, `@mastra/evals`, `@mastra/observability`, `@mastra/loggers`, `@mastra/ai-sdk`, `@mastra/editor` (plus `@mastra/pg`, `@mastra/fastembed`, `@mastra/voice-openai` in the rows below; `mastra` CLI + `@mastra/deployer-*` for build/deploy) | +| Chat channels | [Vercel Chat SDK](https://chat-sdk.dev) — `chat`, `@chat-adapter/*` ([github.com/vercel/chat](https://github.com/vercel/chat)) | +| Action layer | `@zapier/zapier-sdk` (direct import; 26 auto-generated tools) | | LLM | Claude (Anthropic) — Sonnet 4.6 default, Haiku 4.5 for fast steps | -| Embeddings / STT | OpenAI `text-embedding-3-small`, Whisper via `@mastra/voice-openai` | +| Embeddings / STT | **fastembed** (local ONNX, `bge-small` 384-d) for vectors · Whisper via `@mastra/voice-openai` for STT | | API server | [Hono](https://hono.dev) (mounted via Mastra) | | Database | Postgres + [pgvector](https://github.com/pgvector/pgvector) — local via [Supabase CLI](https://supabase.com/docs/guides/cli), hosted via Supabase / Neon / RDS | | DB clients | `supabase-js` (app tables), `@mastra/pg` (Mastra internals) | @@ -344,7 +361,7 @@ supabase/migrations/ Postgres schema (users, conversations, proposals, ## 🧪 Build & test -Four tiers plus end-to-end browser tests. **Tier 1 is the default loop and runs without any external services** — real provider keys are deliberately absent, so anything that leaks into a non-mocked path fails loudly. +Four tiers plus end-to-end browser tests. **Tier 1 is the default and runs without any external services** — real provider keys are intentionally absent, so any accidental real API call fails clearly. | Tier | Command | What it covers | Requires | |---|---|---|---| @@ -362,7 +379,7 @@ CI runs the mocked tiers, a `next build` for web, Biome lint, a dependency-uniqu ## 🔭 Inspect & tune the agents (Mastra Studio) -Foreman runs on [Mastra](https://mastra.ai), so you can open it in **Mastra Studio** — a browser dashboard for poking at the agents without going through the web app. Handy for tuning prompts or seeing exactly what an agent did on a given run. +Foreman runs on [Mastra](https://mastra.ai), so you can open it in **Mastra Studio** — a browser dashboard for working with the agents directly, without the web app. Useful for tuning prompts or seeing what an agent did on a run. ```bash npx supabase start # local Supabase — backs memory + traces @@ -371,25 +388,29 @@ cd packages/agents && npm run dev # agent server + Studio → http://localhos What you get: -- 💬 **Chat** with each agent directly — Foreman, Discovery, Execution, History, Supervisor (uses your `ANTHROPIC_API_KEY`) +- 💬 **Chat** with Foreman directly — and the tool-isolated sub-agents it spawns on the harness (uses your `ANTHROPIC_API_KEY`) - ✏️ **Edit & version the system prompt** — change an agent's instructions live, save a draft, publish; or use Foreman's own agent editor at [`localhost:3000/editor`](http://localhost:3000/editor) - 🧠 **Memory & threads** — every conversation, persisted to your local Supabase - 🔭 **Traces** — per-run agent / tool / LLM spans, so you can see each step an agent took -- 🗂️ **Tools** — browse the 28 Zapier SDK tools + the custom tools each agent loads +- 🗂️ **Tools** — browse the 26 Zapier SDK tools + the custom tools each agent loads - ✅ **Eval scorers** — score runs against the `foreman-baseline-v1` dataset (relaxed-trajectory match + an LLM judge) in the Scores view --- ## ☁️ Deployment -| Component | Target | Notes | +Foreman is **deploy-anywhere by design.** It's a Mastra app, so `DEPLOY_TARGET` + env vars select the **provider** for each part — database, embeddings, filesystem, sandbox, pub/sub. You choose the host; you point the env vars (or Vercel Marketplace integrations) at whatever you're running (for example, your Supabase cloud instead of local). + +| Host | Runs | What you wire | |---|---|---| -| Web | **Vercel** | Standard Next.js project, configured via `vercel.json`. | -| Agents server | **Coolify on Hostinger VPS** | Long-lived process under PM2, fronted by nginx + Certbot SSL. SSE streaming and the Discord Gateway need persistent connections. | -| Agents server (alt) | **Vercel** | Viable with hosted Postgres — build with `npm run build:vercel`. | -| Webhooks server | **Coolify on Hostinger VPS** | Same VPS as agents; separate PM2 process on `:4112`. | +| **Local** (dev) | Full | Local Supabase, `fastembed`, LocalFilesystem/Sandbox, in-process pub/sub — zero cloud accounts. | +| **Vercel** (serverless) | Most features | `npm run build:vercel`. Point env vars / [Vercel Marketplace](https://vercel.com/marketplace) at cloud providers — Supabase Postgres (with a pooler), OpenAI embeddings, S3/AgentFS filesystem, Upstash Redis pub/sub. Channels run **webhook-native**; the scheduler runs as **Vercel Cron**. Function time and bundle limits depend on your Vercel **plan** (Hobby / Pro / Enterprise) — that's your choice, not a Foreman limit. | +| **Mastra Cloud** | Full | Mastra's hosted platform (Observe / Server / Studio) — purpose-built for Mastra agents. | +| **VPS / container** (Coolify, Docker, Fly, Render…) | Full | A long-running container. Cloud or self-hosted Postgres; the durable-automation worker runs continuously. The traditional full-stack target. | + +> The provider-swap layer is still being finished — some parts are already env-selectable (Postgres), others are in progress (cloud filesystem, an env-selectable embedder, Redis pub/sub, hosted sandbox, webhook-native channels). The web frontend is a standard Next.js app (Vercel by default). A **one-click deploy** is on the roadmap. -**Live:** [foreman.otakusolutions.io](https://foreman.otakusolutions.io) (web) · [foreman-agents.otakusolutions.io](https://foreman-agents.otakusolutions.io) (agents) +**Live:** [foreman.otakusolutions.io](https://foreman.otakusolutions.io) (web) · [foreman-agents.otakusolutions.io](https://foreman-agents.otakusolutions.io) (agents, currently on a VPS) --- @@ -397,15 +418,15 @@ What you get: - 🧩 **Finish the in-progress channels** — Microsoft Teams (M365 license), WhatsApp, and iMessage (macOS host). - ☁️ **Managed hosted version** — sign in, connect Zapier, go — no infra to run. -- 🪝 **Event-driven triggers** — evaluating Zapier's experimental trigger inboxes as a managed, dedup'd alternative to the cron-poll driver for "when X happens, do Y" automations. -- 🛠️ **Workflows UI** — a page to save, run, and review multi-step automations and their run history. +- 🖥️ **Desktop app** — a native Mac/Windows desktop client for chat + approvals outside the browser. +- 🏗️ **Sandbox-built live apps** — the agent writes and runs real code to build custom live dashboards from your Zapier data, embedded right in chat. --- ## ❓ FAQ - **Do I need a Zapier account?** Yes — Foreman acts *through* Zapier. In dev mode that's a single CLI login; self-hosted, each user connects their own Zapier account via OAuth. -- **Which apps can it use?** Anything on Zapier — 9,000+. Actions are generated from the Zapier SDK, so the catalog tracks Zapier's. +- **Which apps can it use?** Anything on Zapier — 10,000+. Actions are generated from the Zapier SDK, so the catalog tracks Zapier's. - **Will it do something destructive without asking?** No. Reads run freely; every write/delete surfaces an approval card with the exact fields before it runs. - **Self-host or hosted?** Self-hosting is first-class today — the full stack, every channel, on your own infra. A managed hosted version is coming soon. - **What models does it use?** Claude Sonnet 4.6 for the primary agent and Haiku 4.5 for fast/cheap steps, via the swappable provider layer. @@ -417,7 +438,7 @@ What you get: ## 🤝 Contributing -Foreman is built in the open against a real monorepo. The developer docs — file inventory, route table, custom tools, processors, memory config, schema, prompt internals — live in [`CLAUDE.md`](CLAUDE.md) and [`AGENTS.md`](AGENTS.md). **The README is for orientation; `CLAUDE.md` is for working in the code.** +Foreman is built in the open. The developer docs — file inventory, route table, custom tools, processors, memory config, schema, prompt internals — live in [`CLAUDE.md`](CLAUDE.md) and [`AGENTS.md`](AGENTS.md). **The README is for orientation; `CLAUDE.md` is for working in the code.** Issue tracking runs on **bd (beads)** with Dolt-backed sync — `bd ready` to find work, `bd create` to file it. Do not add markdown TODO lists or external trackers. @@ -428,8 +449,8 @@ Issue tracking runs on **bd (beads)** with Dolt-backed sync — `bd ready` to fi Foreman stands on the work of the teams whose tools it's built from: - **[Mastra](https://mastra.ai/)** — the agent framework: agents, memory, evals, observability. -- **[Zapier](https://zapier.com/)** — the action layer; `@zapier/zapier-sdk` turns 9,000+ apps into tools. -- **[Chat SDK](https://chat-sdk.dev/)** — the channel adapters that put one agent everywhere. +- **[Zapier](https://zapier.com/)** — the action layer; `@zapier/zapier-sdk` turns 10,000+ apps into tools. +- **[Vercel Chat SDK](https://chat-sdk.dev/)** — the `chat` + `@chat-adapter/*` adapters that put one agent everywhere. - **[Supabase](https://supabase.com/)**, **[Hono](https://hono.dev/)**, **[Next.js](https://nextjs.org/)**, and **[Anthropic](https://www.anthropic.com/)** — for the database, server, frontend, and models. --- @@ -438,4 +459,4 @@ Foreman stands on the work of the teams whose tools it's built from: **MIT.** Copyright © 2026 Otaku Solutions. -Self-hostable today; a managed hosted version is coming soon. Questions: **tylan@otakusolutions.io**. +Self-hostable today; a managed hosted version is coming soon. Questions: **hello@otakusolutions.io**. diff --git a/docs/durable-workflow-spike.md b/docs/durable-workflow-spike.md index 60bbb145..a8208fb7 100644 --- a/docs/durable-workflow-spike.md +++ b/docs/durable-workflow-spike.md @@ -1,5 +1,7 @@ # Durable-Workflow Spike — Findings (foreman-8bh9) +> **⏳ Historical (2026-06-11 spike).** Superseded by SDK 0.81.0 — durable now authenticates for accounts on Zapier's **early-access allowlist** (apply for access; **not GA**). See [`zapier-sdk-capability-map.md`](zapier-sdk-capability-map.md). The "blocked on auth" status below reflects 0.69.3. + > Quick probe of `@zapier/zapier-sdk/experimental`'s durable-workflow API > (`runDurable` / `publishWorkflowVersion`), unlocked by the 0.69.3 bump. > Snapshot: 2026-06-11, `@zapier/zapier-sdk@0.69.3`. Status: **blocked on auth (see below).** @@ -74,7 +76,7 @@ script, mints a **real per-user JWT**, and calls `runDurable` with it. Result: ``` userJwt minted: len=3192, prefix="eyJhbG…", scope="external credentials offline_access" -profile OK: admin@otakusolutions.io +profile OK: you@example.com runDurable threw: None of the security schemes (userJwt) successfully authenticated this request. (HTTP 403) ``` diff --git a/docs/trigger-inbox-spike.md b/docs/trigger-inbox-spike.md index 594cf958..bb62c8e4 100644 --- a/docs/trigger-inbox-spike.md +++ b/docs/trigger-inbox-spike.md @@ -56,7 +56,7 @@ hand-rolling idempotency keys. `npx tsx --env-file=.env.local scripts/trigger-inbox-spike.ts` -- **Auth:** client credentials (`ZAPIER_CLIENT_ID`/`SECRET`) → `getProfile` OK (`admin@otakusolutions.io`). +- **Auth:** client credentials (`ZAPIER_CLIENT_ID`/`SECRET`) → `getProfile` OK (`you@example.com`). - **`listTriggers({app:'github'})` → 23 triggers**, incl. `issue_v2` (New Issue), `pull` (New Pull Request), `comment`, `release`, etc. (`issue` is the Legacy variant.) - **`getTriggerInputFieldsSchema`** for `issue_v2` → a JSON Schema (`$schema`, `type`, `properties`, `required`). - **`listTriggerInboxes` → 0** existing inboxes (clean slate). diff --git a/docs/zapier-auth-model.md b/docs/zapier-auth-model.md index df9a0404..efb13efd 100644 --- a/docs/zapier-auth-model.md +++ b/docs/zapier-auth-model.md @@ -37,14 +37,16 @@ redirecting to one of a fixed set of localhost ports Zapier allow-lists for it. |---|---|---|---| | `runAction`, discovery, `apps.*`, tables | ✅ | ✅ | The everyday action layer — any user auth works | | Trigger inboxes (`/experimental`) | ✅ | ✅ | `ensureTriggerInbox` / `lease` / `ack` all accept client-creds | -| **Durable / workflow** (all 18 endpoints, `/experimental`) | ✅ (v0.81.0) | ✅ (v0.81.0) | Both **403 through 0.79.0**, then **OPEN on 0.81.0** (foreman-eln1): client-creds 0/18 walled; per-user PKCE `runDurable`→finished. Still `external`-scope — durable relaxed to accept it. | +| **Durable / workflow** (all 18 endpoints, `/experimental`) | ✅ (v0.81.0) | ✅ (v0.81.0) | **Early-access allowlist only — apply; not GA.** Both **403 through 0.79.0**, then **OPEN on 0.81.0** for allowlisted accounts (foreman-eln1): client-creds 0/18 walled; per-user PKCE `runDurable`→finished. Still `external`-scope — durable relaxed to accept it. | -**Durable is walled for every token a public SDK client can produce.** Proven -2026-06-11 by `packages/agents/scripts/durable-pkce-probe.ts`: it mints a *real* +**(Historical — pre-0.81.0; superseded by the table above.)** Through 0.79.0, durable +was walled for every token a public SDK client could produce. Shown +2026-06-11 by `packages/agents/scripts/durable-pkce-probe.ts`: it minted a *real* per-user PKCE JWT (Foreman's exact `connect.ts` flow, validated against `getProfile` -as `admin@otakusolutions.io`) and `runDurable` still returns **HTTP 403 "None of the +as `you@example.com`) and `runDurable` returned **HTTP 403 "None of the security schemes (userJwt) successfully authenticated this request."** — identical to -client-credentials. +client-credentials. As of 0.81.0 this is resolved **for accounts on Zapier's early-access +allowlist** (apply for access — it is **not GA**). **The tell:** the PKCE flow *requests* scope `internal credentials offline_access` but Zapier *grants* `external credentials offline_access`. Durable's `userJwt` scheme diff --git a/docs/zapier-durable-questions-for-engineers.md b/docs/zapier-durable-questions-for-engineers.md index dfdfda4a..9527df57 100644 --- a/docs/zapier-durable-questions-for-engineers.md +++ b/docs/zapier-durable-questions-for-engineers.md @@ -1,6 +1,6 @@ # Durable Execution — Questions for Zapier Engineers -> ## ✅ UPDATE 2026-07-05 (SDK 0.81.0) — durables now WORK; questions narrowed +> ## ✅ UPDATE 2026-07-05 (SDK 0.81.0) — durables now WORK for accounts on Zapier's early-access allowlist (apply for access; not GA); questions narrowed > > The two original blockers below are **RESOLVED** on `@zapier/zapier-sdk@0.81.0`: > - **Auth:** a live re-probe (`scripts/durable-endpoints-probe.ts`, app-level **client-credentials**) returns **0/18 durable methods walled** — `runDurable` / `createWorkflow` / `listWorkflows` all `2xx`. The `internal`-scope `userJwt` wall is gone for the client-creds token. @@ -17,7 +17,7 @@ --- -**From:** Foreman team (admin@otakusolutions.io) +**From:** Foreman team (you@example.com) **Re:** `@zapier/zapier-sdk/experimental` durable-workflow API (`runDurable` / `publishWorkflowVersion`) **Date of findings:** 2026-06-11 (SDK `0.69.3`); re-confirmed 2026-06-16 on `0.70.4`, and again 2026-06-22 on the current `0.76.0` — both credential types, identical 403; `defineDurable` still a "not callable — Phase 2" stub on 0.76.0 **Status:** Blocked — durable is unreachable with every credential a public SDK client can mint. @@ -80,7 +80,7 @@ HTTP 403 Returned identically for: - App-level **client-credentials**, and -- A **real per-user PKCE user JWT** that we minted with our production `connect.ts` flow and validated against `getProfile` (resolved to `admin@otakusolutions.io`). +- A **real per-user PKCE user JWT** that we minted with our production `connect.ts` flow and validated against `getProfile` (resolved to `you@example.com`). --- @@ -357,7 +357,7 @@ Original run (2026-06-11, SDK `0.69.3`): ``` userJwt minted: len=3192, prefix="eyJhbG…", scope="external credentials offline_access" -profile OK: admin@otakusolutions.io +profile OK: you@example.com runDurable threw: None of the security schemes (userJwt) successfully authenticated this request. HTTP 403 ``` @@ -366,7 +366,7 @@ Re-confirmation (2026-06-16, latest SDK `0.70.4`): ``` userJwt minted: len=3199, prefix="eyJhbG…", scope="external credentials offline_access" -profile OK: admin@otakusolutions.io +profile OK: you@example.com runDurable threw: None of the security schemes (userJwt) successfully authenticated this request. statusCode: 403 ``` @@ -379,7 +379,7 @@ A companion script (`scripts/durable-endpoints-probe.ts`) calls every durable/wo ``` === Durable endpoint sweep — auth: client-credentials === -sanity getProfile -> OK: admin@otakusolutions.io +sanity getProfile -> OK: you@example.com runDurable, listDurableRuns, getDurableRun, cancelDurableRun, createWorkflow, listWorkflows, getWorkflow, updateWorkflow, deleteWorkflow, enableWorkflow, disableWorkflow, publishWorkflowVersion, getWorkflowVersion, listWorkflowVersions, @@ -389,7 +389,7 @@ SUMMARY (client-credentials): 18/18 walled by userJwt-403, 0/18 authenticated. === Durable endpoint sweep — auth: public-PKCE userJwt === userJwt minted: len=3199, scope="external credentials offline_access" -sanity getProfile -> OK: admin@otakusolutions.io +sanity getProfile -> OK: you@example.com → every one: 403 "None of the security schemes (userJwt) successfully authenticated this request." SUMMARY (public-PKCE userJwt): 18/18 walled by userJwt-403, 0/18 authenticated. ``` diff --git a/docs/zapier-sdk-capability-map.md b/docs/zapier-sdk-capability-map.md index f515061f..583e343e 100644 --- a/docs/zapier-sdk-capability-map.md +++ b/docs/zapier-sdk-capability-map.md @@ -2,7 +2,7 @@ > **Living ledger.** Foreman is a product built on `@zapier/zapier-sdk`. This file is the authoritative map of the SDK surface, what Foreman uses, and what we've deliberately decided *not* to build. Refresh it on every SDK bump. > -> - **🔴 UPDATE 2026-07-05 (v0.81.0, foreman-e1ob/eln1) — the durable wall is GONE, verified on BOTH credential types.** `scripts/durable-endpoints-probe.ts` (**client-credentials**) → **0/18 walled** (`runDurable`/`createWorkflow`/`listWorkflows` all 2xx). `scripts/durable-pkce-probe.ts` (**real per-user PKCE user-JWT** — Foreman's production auth via `getExperimentalSdkForUser`) → `runDurable` **ACCEPTED** → run **finished** with correct output. Both were **403 in June**. Full Phase-3 pipeline + human-approval callback resume verified live (`durable-smoke.ts`, `durable-callback-resume-probe.ts`). The 0.79.0 wall notes below are **superseded**. +> - **🔴 UPDATE 2026-07-05 (v0.81.0, foreman-e1ob/eln1) — the durable wall is GONE for accounts on Zapier's early-access allowlist (apply for access — it is NOT GA), verified on BOTH credential types.** `scripts/durable-endpoints-probe.ts` (**client-credentials**) → **0/18 walled** (`runDurable`/`createWorkflow`/`listWorkflows` all 2xx). `scripts/durable-pkce-probe.ts` (**real per-user PKCE user-JWT** — Foreman's production auth via `getExperimentalSdkForUser`) → `runDurable` **ACCEPTED** → run **finished** with correct output. Both were **403 in June**. Full Phase-3 pipeline + human-approval callback resume verified live (`durable-smoke.ts`, `durable-callback-resume-probe.ts`). The 0.79.0 wall notes below are **superseded**. > - **The scope tell:** the PKCE token is **still granted only `external`** scope (unchanged from June) — Zapier did **not** start issuing `internal`. Durable simply **now accepts an `external`-scope token** where it previously required `internal`. So the wall opened by relaxing the *requirement*, not by widening our *grant*. Whether this is GA/permanent is the open Zapier question (foreman-13mw). > - **Snapshot date:** 2026-06-25 — **live-introspected** against `@zapier/zapier-sdk@0.79.0` (installed; hoisted to the workspace-root `node_modules`, deduped — no longer nested under `packages/agents`). > - **How this snapshot was produced:** `npx tsx packages/agents/scripts/sdk-surface-sweep.ts` — imports the installed package and enumerates every entrypoint, `getRegistry()` variant, instance method, and named export. This is **not** changelog-reading; it is what the code on disk actually exposes. Re-run it on every bump (it's the "prove it" tool for the Zapier community showcase). diff --git a/package-lock.json b/package-lock.json index 405264b5..8a4066e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,18 +12,18 @@ "packages/*" ], "devDependencies": { - "@biomejs/biome": "2.4.16", + "@biomejs/biome": "2.5.4", "@copilotkit/aimock": "^1.14.3", "@playwright/test": "^1.59.1", "@tailwindcss/postcss": "^4", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", - "@types/node": "^20", + "@types/node": "^24", "@types/react": "^19", "@types/react-dom": "^19", "@types/supertest": "^7.2.0", "@vitest/ui": "^4.1.4", - "@zapier/zapier-sdk-cli": "^0.62.0", + "@zapier/zapier-sdk-cli": "^0.67.4", "autoprefixer": "^10.5.0", "drizzle-kit": "^0.31.10", "jsdom": "^29.0.2", @@ -33,12 +33,15 @@ "tailwindcss": "^4", "typescript": "^5", "vitest": "^4.1.4" + }, + "engines": { + "node": ">=24" } }, "node_modules/@a2a-js/sdk": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-0.3.13.tgz", - "integrity": "sha512-BZr0f9JVNQs3GKOM9xINWCh6OKIJWZFPyqqVqTym5mxO2Eemc6I/0zL7zWnljHzGdaf5aZQyQN5xa6PSH62q+A==", + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@a2a-js/sdk/-/sdk-0.3.14.tgz", + "integrity": "sha512-F6Ew1AtPzCLhTn8h9yiqTe7DiDf6XVrSnq9V1YqSl9eWqPm6anMveTiKdCSb/76cW0YiJc24rNaUrVezFFHbqQ==", "license": "Apache-2.0", "dependencies": { "uuid": "^11.1.0" @@ -84,46 +87,64 @@ "license": "MIT" }, "node_modules/@ai-sdk/gateway": { - "version": "3.0.143", - "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-3.0.143.tgz", - "integrity": "sha512-RCH60KsUaNiZkI/fBuyau4yvYrVBIEgAcN+Ain94QpL1kVm28GduQzFKfGffAiJU2We0ZrmN4BHkoCZzACK96Q==", + "version": "4.0.30", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-4.0.30.tgz", + "integrity": "sha512-nhgR5U6N0wRg+32Mnd8YrOknWQhWfn3ZAKhEOEf6u3dWzhNxTAAPIB7nnz5gRf8Us8K45yIsTrk0OtH897z7Mw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.13", - "@ai-sdk/provider-utils": "4.0.35", + "@ai-sdk/provider": "4.0.4", + "@ai-sdk/provider-utils": "5.0.14", "@vercel/oidc": "3.2.0" }, "engines": { - "node": ">=18" + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/mcp": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@ai-sdk/mcp/-/mcp-2.0.18.tgz", + "integrity": "sha512-0NEiqoS3PzkITQFldRuuPyO+CckgUPb9wWkp2hQlcaGxKu9ebFJDyjxGYEySE7TQN7mYc8PUuaNEODvky51NaA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.4", + "@ai-sdk/provider-utils": "5.0.14", + "pkce-challenge": "^5.0.1" + }, + "engines": { + "node": ">=22" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "node_modules/@ai-sdk/provider": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.13.tgz", - "integrity": "sha512-ZPtVYt5QIJzOta1kdUiDuCx4HhFkvNPv/rvmZ2b1iXwybYjJsCnNYR4PAw4kW7rgVfDARvHXcU64efWuqNp6bw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-4.0.4.tgz", + "integrity": "sha512-tbHKNLirllUNF3ZlkCsXnwab2ZV1Sl4b1H/Cp9ruCce15IBmskE8Gwkk0yo9xDWY+jho2of7lVXtwSsyrq7cwQ==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" }, "engines": { - "node": ">=18" + "node": ">=22" } }, "node_modules/@ai-sdk/provider-utils": { - "version": "4.0.35", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.35.tgz", - "integrity": "sha512-bjYld/2KGPLt78kpqbya+fD4LYS7BqVQJyUjE3qAHrYB0FR2Q90BaWEVIBZaguTWXf/A8L6uG1zO1v9TxVlGWg==", + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-5.0.14.tgz", + "integrity": "sha512-HW+Ys98cr2BRQzP6jTlp2bRKIqt+oAjYNLm9gqUUQkLz7QERtaPgDZOoXHz9IXSXoOtz175p4Q17qKQdEX0Hag==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.13", + "@ai-sdk/provider": "4.0.4", "@standard-schema/spec": "^1.1.0", + "@workflow/serde": "4.1.0", "eventsource-parser": "^3.0.8" }, "engines": { - "node": ">=18" + "node": ">=22" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" @@ -131,9 +152,9 @@ }, "node_modules/@ai-sdk/provider-utils-v5": { "name": "@ai-sdk/provider-utils", - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.25.tgz", - "integrity": "sha512-CvsRu+32Y8a167s+lrIBtsybvgTHp8j9y+6BeTvLeoW3Q+okw/b4CnNUFOLIXsRaKHQKAH+IHNJPYWywfpw0LA==", + "version": "3.0.30", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.30.tgz", + "integrity": "sha512-NCJ9JKow5ENAgEZxzvEvF20thwDiH+hutvzmrUDbloRX0azpJHNst8+7pZIVryYhLM9wgpT5/ShTSjPTFhkxEQ==", "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "2.0.3", @@ -161,12 +182,12 @@ }, "node_modules/@ai-sdk/provider-utils-v6": { "name": "@ai-sdk/provider-utils", - "version": "4.0.27", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.27.tgz", - "integrity": "sha512-ubkAJ+xODouwtmN1tYlvTPphH1hPOBfZaEQe8U7skGvFAnIRs9PPpsq57bC2+Ky/MB4yzhd6YOsxTAx9sGpazw==", + "version": "4.0.40", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-4.0.40.tgz", + "integrity": "sha512-OL5IrpUm9Y8Dwy+w/vvFwPotS6m52O9W0op2oXgXdCROMJIBalBI0oro6OIBYkPxvm5Xg02GSkoQN25RlR0bnw==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider": "3.0.10", + "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, @@ -178,9 +199,9 @@ } }, "node_modules/@ai-sdk/provider-utils-v6/node_modules/@ai-sdk/provider": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", - "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.14.tgz", + "integrity": "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -189,6 +210,37 @@ "node": ">=18" } }, + "node_modules/@ai-sdk/provider-utils-v7": { + "name": "@ai-sdk/provider-utils", + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-5.0.11.tgz", + "integrity": "sha512-7/96wE+ZsKB35iS9ASyllrE4Ym/EolXEB7AkuJ5FI++fmS85BVTAs77890C+1Z2jwHfBKjBQSBmsliOsAh0iFQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "4.0.3", + "@standard-schema/spec": "^1.1.0", + "@workflow/serde": "4.1.0", + "eventsource-parser": "^3.0.8" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider-utils-v7/node_modules/@ai-sdk/provider": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-4.0.3.tgz", + "integrity": "sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/@ai-sdk/provider-v5": { "name": "@ai-sdk/provider", "version": "2.0.3", @@ -204,9 +256,9 @@ }, "node_modules/@ai-sdk/provider-v6": { "name": "@ai-sdk/provider", - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.10.tgz", - "integrity": "sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-3.0.14.tgz", + "integrity": "sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==", "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" @@ -215,38 +267,92 @@ "node": ">=18" } }, + "node_modules/@ai-sdk/provider-v7": { + "name": "@ai-sdk/provider", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-4.0.3.tgz", + "integrity": "sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/@ai-sdk/react": { - "version": "3.0.221", - "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-3.0.221.tgz", - "integrity": "sha512-5Zd+rF0YbjOqre0NEzdNE+FvNPrEuqfHm4KGxw9ovbAHv0ut/7sgYIn2kzr6ekvXHNqWz0HEmi+zYOXOZCJxJw==", + "version": "4.0.43", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-4.0.43.tgz", + "integrity": "sha512-GiHV/LxFyDaNCaj8JBz3LJoFnvZz0GZjlEK5lfPrOconxqkLtM4MfzdSnWyRl9q1S6+8orxcLSLhVlH79F5zJQ==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/provider-utils": "4.0.35", - "ai": "6.0.219", - "swr": "^2.2.5", + "@ai-sdk/mcp": "2.0.18", + "@ai-sdk/provider": "4.0.4", + "@ai-sdk/provider-utils": "5.0.14", + "ai": "7.0.40", + "swr": "^2.4.1", "throttleit": "2.1.0" }, "engines": { - "node": ">=18" + "node": ">=22" }, "peerDependencies": { "react": "^18 || ~19.0.1 || ~19.1.2 || ^19.2.1" } }, - "node_modules/@alcalzone/ansi-tokenize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.3.0.tgz", - "integrity": "sha512-p+CMKJ93HFmLkjXKlXiVGlMQEuRb6H0MokBSwUsX+S6BRX8eV5naFZpQJFfJHjRZY0Hmnqy1/r6UWl3x+19zYA==", - "dev": true, - "license": "MIT", + "node_modules/@ai-sdk/ui-utils-v5": { + "name": "@ai-sdk/ui-utils", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", + "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/ui-utils-v5/node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" + "json-schema": "^0.4.0" }, "engines": { "node": ">=18" } }, + "node_modules/@ai-sdk/ui-utils-v5/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", + "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, + "node_modules/@ai-sdk/ui-utils-v5/node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", + "license": "BSD-3-Clause" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -455,22 +561,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@asteasolutions/zod-to-openapi": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@asteasolutions/zod-to-openapi/-/zod-to-openapi-8.5.0.tgz", + "integrity": "sha512-SABbKiObg5dLRiTFnqiW1WWwGcg1BJfmHtT2asIBnBHg6Smy/Ms2KHc650+JI4Hw7lSkdiNebEGXpwoxfben8Q==", + "license": "MIT", + "dependencies": { + "openapi3-ts": "^4.1.2" + }, + "peerDependencies": { + "zod": "^4.0.0" + } + }, "node_modules/@azure/msal-common": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.11.0.tgz", - "integrity": "sha512-UikJOtMwkFpZNzTH6Dqk8UTUPbow15zH3e0UjGYZy69lYENW/S05gMLhbxI2eonz66uALhIljvhsSMEb6+O30g==", + "version": "16.11.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.11.2.tgz", + "integrity": "sha512-yDhtBOGDCdK9ipQ9g3+wmlMEPnZx2pXaDicDd9jYyR1L+7lEbvEohTDmF5qejZDutZY3m9pWPxeYxzNC701A2w==", "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-node": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.3.1.tgz", - "integrity": "sha512-sqqv3L1UOI4KDXonNtbxPYUgbSWVXqxvmmb6BUw9n4P/UXgG+cVur3dLWQN4Cz7qQ+UJROCCxMXlksm7gIq0Sw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.4.2.tgz", + "integrity": "sha512-fnqOpGYAV+i0RH4W5HB6Oy1IhqGZoCdnp7Y2Sa9k18FlT8aBkCA7L8Hv19hUHLDUK6kVjUO29AfnGX6wgAHyNg==", "license": "MIT", "dependencies": { - "@azure/msal-common": "16.11.0", + "@azure/msal-common": "16.11.2", "jsonwebtoken": "^9.0.0" }, "engines": { @@ -478,435 +596,375 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", + "integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/helper-validator-identifier": "^8.0.0", + "js-tokens": "^10.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/compat-data": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.0.tgz", + "integrity": "sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/core": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.1.tgz", + "integrity": "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/remapping": "^2.3.5", + "@babel/code-frame": "^8.0.0", + "@babel/generator": "^8.0.0", + "@babel/helper-compilation-targets": "^8.0.0", + "@babel/helpers": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/template": "^8.0.0", + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0", + "@types/gensync": "^1.0.5", "convert-source-map": "^2.0.0", - "debug": "^4.1.0", + "empathic": "^2.0.1", "gensync": "^1.0.0-beta.2", + "import-meta-resolve": "^4.2.0", "json5": "^2.2.3", - "semver": "^6.3.1" + "obug": "^2.1.1", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", + "integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", + "@types/jsesc": "^2.5.0", "jsesc": "^3.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0.tgz", + "integrity": "sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0.tgz", + "integrity": "sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", + "@babel/compat-data": "^8.0.0", + "@babel/helper-validator-option": "^8.0.0", "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "lru-cache": "^11.0.0", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "devOptional": true, - "license": "ISC" - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", - "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.1.tgz", + "integrity": "sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/traverse": "^7.29.7", - "semver": "^6.3.1" + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-optimise-call-expression": "^8.0.0", + "@babel/helper-replace-supers": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/traverse": "^8.0.0", + "semver": "^7.7.3" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-globals": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", + "integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", - "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.0.tgz", + "integrity": "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-8.0.0.tgz", + "integrity": "sha512-NZ7mSS93o4ndX4KrbD7W8Sf3QT8Qe24PrnFyUcuOPDzK6faqDFKjY9RG7he7+I7FdiQ4llpnosFqzrXa+Vy3Ew==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-8.0.1.tgz", + "integrity": "sha512-UgAhl1kqiW5ciE0yCXqqvnb4H2n3IELJ7lIIQRezwDPilPEZX5i+Rvbja9MFTkwUn2biEiSMeV31aUzR4Lwakw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-module-imports": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.0", + "@babel/traverse": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", - "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-8.0.0.tgz", + "integrity": "sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.1.tgz", + "integrity": "sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" + }, + "peerDependencies": { + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", - "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-8.0.1.tgz", + "integrity": "sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@babel/helper-member-expression-to-functions": "^8.0.0", + "@babel/helper-optimise-call-expression": "^8.0.0", + "@babel/traverse": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", - "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-8.0.0.tgz", + "integrity": "sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/traverse": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", + "integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", + "integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-8.0.0.tgz", + "integrity": "sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0.tgz", + "integrity": "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/template": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", + "integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^8.0.4" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-8.0.3.tgz", + "integrity": "sha512-jmTPwps7oSQSZaV1SxkQ3C12UWyufGysGc5OzDpZzvPAIX4mO7dJT3hoqkWVrSImvkcMiknir1iLN1SNV/CZzg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", - "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-8.0.1.tgz", + "integrity": "sha512-PMuzulWrrzFNmY3lXSk/tV9NRb7y0eZZLJY4UEo2TKszroxvUZHAPPi+T9FDyrQhod+TQA+t+8/QYaaMpiEuhA==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@babel/helper-module-transforms": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-8.0.1.tgz", + "integrity": "sha512-0Svqp3413Eg0GElldykF/T7SNsxQO5YVGD70fZyAdZTnX8WRgcopmbiU7GTa5xY5ZnJcEpNbfns8/GjX+/1yeA==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-syntax-typescript": "^7.29.7" + "@babel/helper-annotate-as-pure": "^8.0.0", + "@babel/helper-create-class-features-plugin": "^8.0.1", + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", + "@babel/plugin-syntax-typescript": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/preset-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", - "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-8.0.1.tgz", + "integrity": "sha512-qrPhQIN1NLrPmzgazF9XKQqXrOcp/WJly+K+6ReFonn24FZqRJO7clxOJo6Ni75L+2vAqI3cHVU2OJLBxoPp5A==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-syntax-jsx": "^7.29.7", - "@babel/plugin-transform-modules-commonjs": "^7.29.7", - "@babel/plugin-transform-typescript": "^7.29.7" + "@babel/helper-plugin-utils": "^8.0.1", + "@babel/helper-validator-option": "^8.0.0", + "@babel/plugin-transform-modules-commonjs": "^8.0.1", + "@babel/plugin-transform-typescript": "^8.0.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^8.0.0" } }, "node_modules/@babel/runtime": { @@ -919,51 +977,51 @@ } }, "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", + "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/code-frame": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", + "integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" + "@babel/code-frame": "^8.0.0", + "@babel/generator": "^8.0.0", + "@babel/helper-globals": "^8.0.0", + "@babel/parser": "^8.0.4", + "@babel/template": "^8.0.0", + "@babel/types": "^8.0.4", + "obug": "^2.1.1" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", + "integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", "devOptional": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "@babel/helper-string-parser": "^8.0.0", + "@babel/helper-validator-identifier": "^8.0.4" }, "engines": { - "node": ">=6.9.0" + "node": "^22.18.0 || >=24.11.0" } }, "node_modules/@base-ui/react": { @@ -1027,9 +1085,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.16.tgz", - "integrity": "sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.4.tgz", + "integrity": "sha512-xy5FNE5kQJKyK5MR1gJy6ztXYx4WBAbYGlK04lMEgmyPRWKybY9NFwiG9yo0XdzOU8Xvhj41u034J1ywfoWfMw==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -1043,20 +1101,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.4.16", - "@biomejs/cli-darwin-x64": "2.4.16", - "@biomejs/cli-linux-arm64": "2.4.16", - "@biomejs/cli-linux-arm64-musl": "2.4.16", - "@biomejs/cli-linux-x64": "2.4.16", - "@biomejs/cli-linux-x64-musl": "2.4.16", - "@biomejs/cli-win32-arm64": "2.4.16", - "@biomejs/cli-win32-x64": "2.4.16" + "@biomejs/cli-darwin-arm64": "2.5.4", + "@biomejs/cli-darwin-x64": "2.5.4", + "@biomejs/cli-linux-arm64": "2.5.4", + "@biomejs/cli-linux-arm64-musl": "2.5.4", + "@biomejs/cli-linux-x64": "2.5.4", + "@biomejs/cli-linux-x64-musl": "2.5.4", + "@biomejs/cli-win32-arm64": "2.5.4", + "@biomejs/cli-win32-x64": "2.5.4" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.16.tgz", - "integrity": "sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.4.tgz", + "integrity": "sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==", "cpu": [ "arm64" ], @@ -1071,9 +1129,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.16.tgz", - "integrity": "sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.4.tgz", + "integrity": "sha512-D32P5HkU2Y6PySuC/WsVDTOgsDwVFmujzhhhOQjajtATpVWFDXuVd3oRbsWNSEA+aaFzyzZm22szsyydBYlSyQ==", "cpu": [ "x64" ], @@ -1088,9 +1146,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.16.tgz", - "integrity": "sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.4.tgz", + "integrity": "sha512-pSEfW7B8kTsXUjUxC1xVVK+y85Ht3C5XxZ9gclmC7/3Ku9Vqz8jmI7k0p/BNIjQ6t4sFERI2sFeH73ybiZl6YQ==", "cpu": [ "arm64" ], @@ -1108,9 +1166,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.16.tgz", - "integrity": "sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.4.tgz", + "integrity": "sha512-Rpm5/AT1m+DlJmUoYvS4/vXc+0tXJPJ2NQz25TGPyHVF5JrWy75PE0GH6kVxsKtQDuCH4OgzquZq0R4kj/wCVg==", "cpu": [ "arm64" ], @@ -1128,9 +1186,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.16.tgz", - "integrity": "sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.4.tgz", + "integrity": "sha512-FNxojWJkL7EajAuzBgoLe0T2G0y112M4lBrDIFl/DomFTx8yqenYOIdsRLNXvOvBBofE8hJi85LjzLmBDpY7/Q==", "cpu": [ "x64" ], @@ -1148,9 +1206,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.16.tgz", - "integrity": "sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.4.tgz", + "integrity": "sha512-aby/PohmmgbShcHqFsZVzG8H6D98+P+A6xRWRrQcLW1pCjabcov5UUlke4UqNQBYTkDQav+jB4zyyDDeKB2GaA==", "cpu": [ "x64" ], @@ -1168,9 +1226,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.16.tgz", - "integrity": "sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.4.tgz", + "integrity": "sha512-emoXexPZIPAZkz2RKmA95WJUqK3I5MJNYtwEbL5ESciRzhmFMMyekDhNG8hpeOaK+ZGRDxAU4wvGuA5IHQ0h0w==", "cpu": [ "arm64" ], @@ -1185,9 +1243,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.4.16", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.16.tgz", - "integrity": "sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.4.tgz", + "integrity": "sha512-U1jaluLw1qQc2Tx7/CeSoL9N5XcqIH+GWjpUAy1ouB5nVjSCMNO+NNHdY3RAs8zxNurLWAdj6pehQdCA2zyU+Q==", "cpu": [ "x64" ], @@ -1221,13 +1279,13 @@ } }, "node_modules/@chat-adapter/discord": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/discord/-/discord-4.32.0.tgz", - "integrity": "sha512-npJGIv0jjhhupKdLSF6Di+64mJXFkwEDfx/DOlDn41x66KnJjx2QcqvkuPBpx557kSwWXLgwIq5KWx/rQ+tEPg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/discord/-/discord-4.35.0.tgz", + "integrity": "sha512-jiveT1tV+DMIMTH3qTMbvbltmQEEFTAHA7kbulLCbvPGEu9BOj+BvCKIi1Vh2CK6ooBWizCBh8iSqP5P5deaJQ==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", - "chat": "4.32.0", + "@chat-adapter/shared": "4.35.0", + "chat": "4.35.0", "discord-api-types": "^0.37.119", "discord-interactions": "^4.4.0", "discord.js": "^14.25.1" @@ -1237,126 +1295,126 @@ } }, "node_modules/@chat-adapter/gchat": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/gchat/-/gchat-4.32.0.tgz", - "integrity": "sha512-QQRRpTmsIt1seYeZONalIurzpxJqHC1g8GEG+TJaCD5OamL65c4GTQJhRdA7FBgOZHEkvwT/TiKNwp4twK0cCA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/gchat/-/gchat-4.35.0.tgz", + "integrity": "sha512-4US62rLsqAFlpwI1cFAGsfMfxy1Ze/3oApb8OciGM74NjRLbqAGDGc6Dr8y1xFVb/DVC0CXx+j0VenoZEyL7Fw==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", + "@chat-adapter/shared": "4.35.0", "@googleapis/chat": "^44.6.0", "@googleapis/workspaceevents": "^9.1.0", - "chat": "4.32.0" + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/github": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/github/-/github-4.32.0.tgz", - "integrity": "sha512-0HHSI2rd7XXE3rt37uUS+zWbTK6JSl1mAUtQk5hm1SBtyP23BV4B4pDCdR/X5Eo9e0i9sMNYR7CNwfab1+7g3Q==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/github/-/github-4.35.0.tgz", + "integrity": "sha512-fv7Pezi/ymCyzbvXr3zY5UA/7DOxcParlD9ffo9Z3eIpCcVCbavVms858o3yzY77BX+XpErpS7Zxlpc+9nm80Q==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", + "@chat-adapter/shared": "4.35.0", "@octokit/auth-app": "^8.2.0", "@octokit/rest": "^22.0.1", - "chat": "4.32.0" + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/linear": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/linear/-/linear-4.32.0.tgz", - "integrity": "sha512-ibOpeURIjpjxF2OyJ3hTYnVbT2oSKRbOUFhb+KJaw+YBUUHTXwcPCeUGhW+dLVBKOFiBZU3hO12eYbpXueQobA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/linear/-/linear-4.35.0.tgz", + "integrity": "sha512-6NgMUfBY6DmnMsku07WChnFY9MlIb+xGeGq2rtp68LkbJCx1iokobrLDXG160MKauzsL6ne/pZJZTbgrTrtrpA==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", + "@chat-adapter/shared": "4.35.0", "@linear/sdk": "^76.0.0", - "chat": "4.32.0" + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/shared": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/shared/-/shared-4.32.0.tgz", - "integrity": "sha512-ANXYe2dbSmr9A+yUAnV8TfFht4GM6f3zR5LnAYtQdNnRI9CJfXIUXuhRaVBe5RD8IEgGXyGi4BKj5qdjBtUumA==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/shared/-/shared-4.35.0.tgz", + "integrity": "sha512-C0GvfiSk6JMdLlydbLIOmT9frMicFic++HBaD69JqmgyaT/CUvOII83Tsq+Yf5DKp53BXbK1NswKg5CId0PW9A==", "license": "MIT", "dependencies": { - "chat": "4.32.0" + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/slack": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/slack/-/slack-4.32.0.tgz", - "integrity": "sha512-QZ7KYV8K1w5O91JzMuz5qTCpUaWfEgcxr/UFrBKSp30ZdaHbLH7BqOXHYLoFVwFnoEwKpInCgCgpEl36IU9ffQ==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/slack/-/slack-4.35.0.tgz", + "integrity": "sha512-U5criQNQcUokC6XrqZvvLlHDQwNAsZbgZ4wCiEzt6yQmNT51SZ51n7Fi86dnzNzbNlbE7omqqDYKy1yfcjDjIQ==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", + "@chat-adapter/shared": "4.35.0", "@slack/socket-mode": "^2.0.5", - "@slack/web-api": "^7.14.0", - "chat": "4.32.0" + "@slack/web-api": "^7.18.0", + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/state-memory": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/state-memory/-/state-memory-4.32.0.tgz", - "integrity": "sha512-fN91ZzjRUUhgeVReukvrDkaaQXC+x0jETR+77vg67y95g1LnUaqSFBz+WOyYLaTT7i7JGz9aEMlBNt6uYu66dg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/state-memory/-/state-memory-4.35.0.tgz", + "integrity": "sha512-qfSdR34Nox1Fcv8J6GLAX03VOuS3jka6ikFdVYBIOssh9OWL/NvjGGmuGwLI8/zmrPBjz0ZUStOxiyJAc1EqZw==", "license": "MIT", "dependencies": { - "chat": "4.32.0" + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/teams": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/teams/-/teams-4.32.0.tgz", - "integrity": "sha512-g5NIBsAjpQDnxhNzuKLB+1TusoNdeANCecX/HKpyei369//YJdZE0VmXDHtZEwAAaF2zvJ5ZmVHcVRo5VJUmVg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/teams/-/teams-4.35.0.tgz", + "integrity": "sha512-fN0vQ1w86hYjPugSekueTntXyO8QhfenRasFJhOCCXnylfpttTcrbmZy3iu7H2hDiWOJ7RXJFFxFhDi6wgrobQ==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", - "@microsoft/teams.api": "^2.0.8", - "@microsoft/teams.apps": "^2.0.8", - "@microsoft/teams.cards": "^2.0.8", - "@microsoft/teams.graph-endpoints": "^2.0.8", - "chat": "4.32.0" + "@chat-adapter/shared": "4.35.0", + "@microsoft/teams.api": "^2.0.14", + "@microsoft/teams.apps": "^2.0.14", + "@microsoft/teams.cards": "^2.0.14", + "@microsoft/teams.graph-endpoints": "^2.0.14", + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/telegram": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/telegram/-/telegram-4.32.0.tgz", - "integrity": "sha512-3QzXYJsT3vJMAP0KDrhSyppJ5bKo243ruytgCPyjqJ2J705J6Wy+KLD41b24hp6swYhpNGH1s5xOHpvPbNg/0g==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/telegram/-/telegram-4.35.0.tgz", + "integrity": "sha512-QqEoFDbXa1o+AnXCMMoLG7Y2FyabJ3dZsNPXjWfHU/hjoiQ8Noofp12SnckIF2OPWF8zgDgDZuq76hrKGsxFsQ==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", - "chat": "4.32.0" + "@chat-adapter/shared": "4.35.0", + "chat": "4.35.0" }, "engines": { "node": ">=20" } }, "node_modules/@chat-adapter/whatsapp": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/@chat-adapter/whatsapp/-/whatsapp-4.32.0.tgz", - "integrity": "sha512-n3MbH4aSYpAk4mFKjuAvva4yJH94n1WA+47xNOHu7TLgoIPt1i96DOsERXCpiKqGlC/Nc+1/04DgYGzSTj6WWQ==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@chat-adapter/whatsapp/-/whatsapp-4.35.0.tgz", + "integrity": "sha512-2HklJvPPgY84KtvbaumyogrgjSBTnoi0+nP+XXeTShFwj/pR6UcgJM1mViMW4KBAHSrsJkJ8wF1ba7kRwnzrtg==", "license": "MIT", "dependencies": { - "@chat-adapter/shared": "4.32.0", - "chat": "4.32.0" + "@chat-adapter/shared": "4.35.0", + "chat": "4.35.0" }, "engines": { "node": ">=20" @@ -1472,9 +1530,9 @@ } }, "node_modules/@codemirror/state": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.0.tgz", - "integrity": "sha512-Zbl9NyscLMZkfXPQnNAIIAFftidrA1UbcJEIMp24C0Bukc2I5T8wJS0wsXYsnDOqCFJUeJ1BITGNs5CqPDSmSg==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", + "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" @@ -1493,9 +1551,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.43.5", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.5.tgz", - "integrity": "sha512-7uT/vUgH6dfXWn3WqOe23KneILMvGy5wQjNMEcRXLKzziJ9NOktpW6tGoyQpwVkBgE5Gj6hKkCcsddbnkaWrOQ==", + "version": "6.43.7", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.7.tgz", + "integrity": "sha512-FZsExxkoxnAN+d9TgqXLg5g4A1oQwzX9WlkOT5i2PKkcW7xx3Bmu0vs90g6fo9Mpdsb/l96dnAraQ8932aO4/g==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -1595,9 +1653,9 @@ } }, "node_modules/@copilotkit/aimock": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@copilotkit/aimock/-/aimock-1.35.0.tgz", - "integrity": "sha512-dWtNUeaWD4jaC3Kv9oBiCoIczENM6u8pWBCmybn0/hSFEY57yqCtOGPsVNIG/YlmwbH8p5sgtL6xZzo1FnPi8g==", + "version": "1.37.4", + "resolved": "https://registry.npmjs.org/@copilotkit/aimock/-/aimock-1.37.4.tgz", + "integrity": "sha512-3fKSBrs7QDTRmYQM9RVh+2aC95KJcEbNHtAAuD8fJ3NdIx1bNdgWvwgWNJLzAuiZI3kSDwRgA0HlCVD6n0eP+A==", "dev": true, "license": "MIT", "bin": { @@ -1641,9 +1699,9 @@ } }, "node_modules/@csstools/css-calc": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz", - "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", "dev": true, "funding": [ { @@ -1665,9 +1723,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz", - "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", + "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", "dev": true, "funding": [ { @@ -1682,7 +1740,7 @@ "license": "MIT", "dependencies": { "@csstools/color-helpers": "^6.1.0", - "@csstools/css-calc": "^3.2.1" + "@csstools/css-calc": "^3.3.0" }, "engines": { "node": ">=20.19.0" @@ -1716,9 +1774,9 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz", - "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", "dev": true, "funding": [ { @@ -1788,9 +1846,9 @@ } }, "node_modules/@discordjs/builders/node_modules/discord-api-types": { - "version": "0.38.49", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.49.tgz", - "integrity": "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" @@ -1821,18 +1879,18 @@ } }, "node_modules/@discordjs/formatters/node_modules/discord-api-types": { - "version": "0.38.49", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.49.tgz", - "integrity": "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" ] }, "node_modules/@discordjs/rest": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.1.tgz", - "integrity": "sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.3.tgz", + "integrity": "sha512-wvOylxNYJkwKjctS/Mn5GP1w9r3/rzyH+ThD1JlAca6zEdlHs8QWBBUQJpU5Q+W6DoIj/Ljh1IPlZs7hTU+UAg==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", @@ -1840,10 +1898,10 @@ "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.5", "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "^0.38.40", + "discord-api-types": "^0.38.50", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", - "undici": "6.24.1" + "undici": "^6.27.0" }, "engines": { "node": ">=18" @@ -1864,29 +1922,19 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/rest/node_modules/@sapphire/snowflake": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz", - "integrity": "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==", - "license": "MIT", - "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" - } - }, "node_modules/@discordjs/rest/node_modules/discord-api-types": { - "version": "0.38.49", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.49.tgz", - "integrity": "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" ] }, "node_modules/@discordjs/rest/node_modules/undici": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", - "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "license": "MIT", "engines": { "node": ">=18.17" @@ -1908,9 +1956,9 @@ } }, "node_modules/@discordjs/util/node_modules/discord-api-types": { - "version": "0.38.49", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.49.tgz", - "integrity": "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" @@ -1952,9 +2000,9 @@ } }, "node_modules/@discordjs/ws/node_modules/discord-api-types": { - "version": "0.38.49", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.49.tgz", - "integrity": "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" @@ -1980,9 +2028,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", - "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", "license": "MIT", "optional": true, "dependencies": { @@ -2011,7 +2059,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", - "deprecated": "Merged into tsx: https://tsx.is", + "deprecated": "Merged into tsx: https://tsx.hirok.io", "dev": true, "license": "MIT", "dependencies": { @@ -2023,7 +2071,7 @@ "version": "2.6.5", "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", - "deprecated": "Merged into tsx: https://tsx.is", + "deprecated": "Merged into tsx: https://tsx.hirok.io", "dev": true, "license": "MIT", "dependencies": { @@ -2494,31 +2542,31 @@ "license": "MIT" }, "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.11" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.7.6" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2526,9 +2574,9 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", "license": "MIT" }, "node_modules/@foreman/agents": { @@ -2556,18 +2604,14 @@ } }, "node_modules/@fumadocs/tailwind": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.0.5.tgz", - "integrity": "sha512-ENKPWUDRmriccsrUDE4bDBq3FNr/ms3BP2rWlsAEMV1yP23pcCaan+ceGfeBUsAQjw7sj9Q3R4Kl3g/TCStPzQ==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fumadocs/tailwind/-/tailwind-0.1.1.tgz", + "integrity": "sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw==", "license": "MIT", "peerDependencies": { - "@tailwindcss/oxide": "^4.0.0", "tailwindcss": "^4.0.0" }, "peerDependenciesMeta": { - "@tailwindcss/oxide": { - "optional": true - }, "tailwindcss": { "optional": true } @@ -2607,12 +2651,12 @@ } }, "node_modules/@hono/node-server": { - "version": "1.19.14", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz", - "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-2.0.12.tgz", + "integrity": "sha512-eWpQYr67tqJLeaSUl0Q+TquuYfUdTibpOJlUMV2FfUP7+KqCC5TufnwnlXL6mobZBJbGAYRd7ZvEBDCbLInjhg==", "license": "MIT", "engines": { - "node": ">=18.14.1" + "node": ">=20" }, "peerDependencies": { "hono": "^4" @@ -2636,9 +2680,9 @@ } }, "node_modules/@hugeicons/core-free-icons": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@hugeicons/core-free-icons/-/core-free-icons-4.2.2.tgz", - "integrity": "sha512-fjQW3p6cwoJmwK3oCnV8Z3PC5sHihDvr2jkAHax8cxqp62GaV/D7B/Rnao+JwicW8fmLZUQ6QrzWfoyMFOEQlQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@hugeicons/core-free-icons/-/core-free-icons-4.2.3.tgz", + "integrity": "sha512-fpiU0qFZkv4ABi23xJ2m4qNr0BBfuIaYjPboN8WDA6aj9D+OzXa7eykxKOpACZRuGbDz1U9S5DsNx1d5KNnsgA==", "license": "MIT" }, "node_modules/@hugeicons/react": { @@ -2657,12 +2701,12 @@ "license": "MIT" }, "node_modules/@huggingface/hub": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-2.13.2.tgz", - "integrity": "sha512-I1Pbn9UcBHCt0M/SbZkKzYr3JVnbJp4YIFv74eVRH2Y22yT9Jpm6DtfM74tcjNLbC7SyFZ433znUw0szdFd4Fg==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/@huggingface/hub/-/hub-2.14.2.tgz", + "integrity": "sha512-Fuzi18TYmc0JEUDVw6uSKSXGOYipQyzu2ArvLYfOmk0Ts++ItKPaAeKli7s1MMXgedEmbl4x73pXy6aZBQTtSw==", "license": "MIT", "dependencies": { - "@huggingface/tasks": "^0.21.13", + "@huggingface/tasks": "^0.21.28", "@huggingface/xetchunk-wasm": "^0.1.0" }, "bin": { @@ -2676,9 +2720,9 @@ } }, "node_modules/@huggingface/tasks": { - "version": "0.21.20", - "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.21.20.tgz", - "integrity": "sha512-pGw7pQI8TYSbrOVfNRdrYeISDEYOvQzOCEBceYjEKOH2wOmooc6eGfbYRhAALDgNKZCSISPYYFszRxHta3FaNw==", + "version": "0.21.28", + "resolved": "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.21.28.tgz", + "integrity": "sha512-PCduFL8/f3VfBIIY+fnjcBfRTLgsWHBWJls1xcYRNkJM4iKpwWfEsFnsH/4YP678zZRieNbTh8JUBP9/1NgMbg==", "license": "MIT" }, "node_modules/@huggingface/xetchunk-wasm": { @@ -2698,9 +2742,9 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.3.tgz", - "integrity": "sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz", + "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==", "license": "MIT", "dependencies": { "@antfu/install-pkg": "^1.1.0", @@ -2718,9 +2762,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz", + "integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==", "cpu": [ "arm64" ], @@ -2730,19 +2774,19 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" + "@img/sharp-libvips-darwin-arm64": "1.3.2" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz", + "integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==", "cpu": [ "x64" ], @@ -2752,19 +2796,38 @@ "darwin" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" + "@img/sharp-libvips-darwin-x64": "1.3.2" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz", + "integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz", + "integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==", "cpu": [ "arm64" ], @@ -2778,9 +2841,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz", + "integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==", "cpu": [ "x64" ], @@ -2794,9 +2857,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz", + "integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==", "cpu": [ "arm" ], @@ -2813,9 +2876,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz", + "integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==", "cpu": [ "arm64" ], @@ -2832,9 +2895,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz", + "integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==", "cpu": [ "ppc64" ], @@ -2851,9 +2914,9 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz", + "integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==", "cpu": [ "riscv64" ], @@ -2870,9 +2933,9 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz", + "integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==", "cpu": [ "s390x" ], @@ -2889,9 +2952,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz", + "integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==", "cpu": [ "x64" ], @@ -2908,9 +2971,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz", + "integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==", "cpu": [ "arm64" ], @@ -2927,9 +2990,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz", + "integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==", "cpu": [ "x64" ], @@ -2946,9 +3009,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz", + "integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==", "cpu": [ "arm" ], @@ -2961,19 +3024,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" + "@img/sharp-libvips-linux-arm": "1.3.2" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz", + "integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==", "cpu": [ "arm64" ], @@ -2986,19 +3049,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" + "@img/sharp-libvips-linux-arm64": "1.3.2" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz", + "integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==", "cpu": [ "ppc64" ], @@ -3011,19 +3074,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" + "@img/sharp-libvips-linux-ppc64": "1.3.2" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz", + "integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==", "cpu": [ "riscv64" ], @@ -3036,19 +3099,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" + "@img/sharp-libvips-linux-riscv64": "1.3.2" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz", + "integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==", "cpu": [ "s390x" ], @@ -3061,19 +3124,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" + "@img/sharp-libvips-linux-s390x": "1.3.2" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz", + "integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==", "cpu": [ "x64" ], @@ -3086,19 +3149,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" + "@img/sharp-libvips-linux-x64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz", + "integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==", "cpu": [ "arm64" ], @@ -3111,19 +3174,19 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz", + "integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==", "cpu": [ "x64" ], @@ -3136,38 +3199,54 @@ "linux" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "1.3.2" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz", + "integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.1" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz", + "integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==", "cpu": [ "wasm32" ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "license": "Apache-2.0", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.7.0" + "@img/sharp-wasm32": "0.35.3" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz", + "integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==", "cpu": [ "arm64" ], @@ -3177,16 +3256,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz", + "integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==", "cpu": [ "ia32" ], @@ -3196,16 +3275,16 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": "^20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz", + "integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==", "cpu": [ "x64" ], @@ -3215,7 +3294,7 @@ "win32" ], "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" @@ -3625,63 +3704,6 @@ } } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -3718,7 +3740,7 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -3828,9 +3850,9 @@ "license": "MIT" }, "node_modules/@mastra/ai-sdk": { - "version": "1.4.5-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/ai-sdk/-/ai-sdk-1.4.5-alpha.0.tgz", - "integrity": "sha512-lSochIlukdKI+rFxYXFpO7F7xxGme5CP1SOyTY1MwhvnswcQomSQVR5sIK7kYIYHXdHQE6YtJIqoJEfoN6FBKQ==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@mastra/ai-sdk/-/ai-sdk-1.6.3.tgz", + "integrity": "sha512-PK4qaZ9ut3vnh8car8WlmqSoT+at3wg73Mi+HXwiHV6+Z/KABf0XjHNuGa2euRI1LweH60vL8pyvI3J8M6O4KQ==", "license": "Apache-2.0", "engines": { "node": ">=22.13.0" @@ -3841,38 +3863,42 @@ } }, "node_modules/@mastra/core": { - "version": "1.42.0-alpha.3", - "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.42.0-alpha.3.tgz", - "integrity": "sha512-rMO4COXxWcrO2go9+xHZfaUJFG7L4JYPy5QHVI6lRVJsUszQ99ZYJa9upu4mYVR6oXv5DGgIDRMxpysnD7efHQ==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@mastra/core/-/core-1.53.0.tgz", + "integrity": "sha512-Q9dIpdGiCAAyX2dVSVIg5BRShsHPR17MsvEwowRf9IQyfw3DyP/h7UJEJ1vcY6cLjGm+AqLqRbof97TihW1WUA==", "license": "Apache-2.0", "dependencies": { - "@a2a-js/sdk": "~0.3.13", - "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.25", - "@ai-sdk/provider-utils-v6": "npm:@ai-sdk/provider-utils@4.0.27", + "@a2a-js/sdk": "~0.3.14", + "@ai-sdk/provider-utils-v5": "npm:@ai-sdk/provider-utils@3.0.30", + "@ai-sdk/provider-utils-v6": "npm:@ai-sdk/provider-utils@4.0.40", + "@ai-sdk/provider-utils-v7": "npm:@ai-sdk/provider-utils@5.0.11", "@ai-sdk/provider-v5": "npm:@ai-sdk/provider@2.0.3", - "@ai-sdk/provider-v6": "npm:@ai-sdk/provider@3.0.10", + "@ai-sdk/provider-v6": "npm:@ai-sdk/provider@3.0.14", + "@ai-sdk/provider-v7": "npm:@ai-sdk/provider@4.0.3", + "@ai-sdk/ui-utils-v5": "npm:@ai-sdk/ui-utils@1.2.11", "@isaacs/ttlcache": "^2.1.4", "@lukeed/uuid": "^2.0.1", - "@mastra/schema-compat": "1.2.11", + "@mastra/schema-compat": "1.3.4", "@modelcontextprotocol/sdk": "^1.29.0", "@sindresorhus/slugify": "^2.2.1", "@standard-schema/spec": "^1.1.0", - "ajv": "^8.18.0", - "chat": "^4.29.0", + "ajv": "^8.20.0", + "chat": "^4.34.0", "croner": "^10.0.1", "dotenv": "^17.3.1", "execa": "^9.6.1", - "fastq": "^1.19.1", + "fastq": "^1.20.1", "gray-matter": "^4.0.3", "ignore": "^7.0.5", + "jpeg-js": "^0.4.4", "json-schema": "^0.4.0", "lru-cache": "^11.2.7", "p-map": "^7.0.4", "p-retry": "^7.1.1", "picomatch": "^4.0.3", - "posthog-node": "^5.30.6", + "posthog-node": "^5.37.0", "tokenx": "^1.3.0", - "ws": "^8.20.0", + "ws": "^8.21.0", "xxhash-wasm": "^1.1.0" }, "engines": { @@ -3895,17 +3921,17 @@ } }, "node_modules/@mastra/deployer": { - "version": "1.42.0-alpha.3", - "resolved": "https://registry.npmjs.org/@mastra/deployer/-/deployer-1.42.0-alpha.3.tgz", - "integrity": "sha512-fqKJ23+/3gsYWtuHFIJEMsJ5jI81tyslFk75O6lnzofDvkl5k8XS3TtdcCLMMpmUgO0MfAvUkzwTonq2j4R2Ww==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@mastra/deployer/-/deployer-1.53.0.tgz", + "integrity": "sha512-NnOivVt1WhiKLsYZNG948bny25UAkgMreWY/ODQgDBB0K0eVpJ5YTejx45ZV2zmNNwAaTCs1eptovTud221jMQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.29.7", - "@babel/preset-typescript": "^7.29.7", - "@babel/traverse": "^7.29.7", + "@babel/core": "^8.0.1", + "@babel/preset-typescript": "^8.0.1", + "@babel/traverse": "^8.0.4", "@hono/node-ws": "^1.3.0", - "@mastra/server": "1.42.0-alpha.3", + "@mastra/server": "1.53.0", "@optimize-lodash/rollup-plugin": "^5.1.0", "@rollup/plugin-alias": "6.0.0", "@rollup/plugin-commonjs": "29.0.2", @@ -3914,47 +3940,47 @@ "@rollup/plugin-node-resolve": "16.0.3", "@rollup/plugin-virtual": "3.0.2", "@sindresorhus/slugify": "^2.2.1", - "@types/babel__traverse": "^7.28.0", "empathic": "^2.0.0", - "esbuild": "^0.27.4", + "esbuild": "^0.28.0", "find-workspaces": "^0.3.1", - "fs-extra": "^11.3.4", + "fs-extra": "^11.3.5", + "gray-matter": "^4.0.3", "hono": "^4.12.8", "local-pkg": "^1.1.2", "resolve.exports": "^2.0.3", - "rollup": "^4.59.0", + "rollup": "^4.61.1", "rollup-plugin-esbuild": "^6.2.1", "strip-json-comments": "^5.0.3", - "tinyglobby": "^0.2.16", + "tinyglobby": "^0.2.17", "typescript-paths": "^1.5.2", - "ws": "^8.20.0" + "ws": "^8.21.0" }, "engines": { "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.34.0-0 <2.0.0-0" + "@mastra/core": ">=1.50.0-0 <2.0.0-0" } }, "node_modules/@mastra/deployer-cloudflare": { - "version": "1.1.43-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/deployer-cloudflare/-/deployer-cloudflare-1.1.43-alpha.0.tgz", - "integrity": "sha512-sDssXJ/7BSzKDSf/hlkZdgKb1JeLRvhMzEfE9AcVTazXBE+xycAt1eQD0FtIM3WIpsuAwttI15Fwp6Ohwn+svw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@mastra/deployer-cloudflare/-/deployer-cloudflare-1.2.10.tgz", + "integrity": "sha512-1EFiSH3ltY94nya08SWQFoMX7X8Fy7KQiCjMQAQAeXGrTLyMd+KwkTVPCRodmhIkKM4A7jWNNuxVY93+jlFe7Q==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@babel/core": "^7.29.7", - "@mastra/deployer": "^1.42.0-alpha.0", + "@babel/core": "^8.0.1", + "@mastra/deployer": "^1.53.0", "@rollup/plugin-virtual": "3.0.2", "cloudflare": "^5.2.0", - "rollup": "^4.59.0", + "rollup": "^4.61.1", "rollup-plugin-esbuild": "^6.2.1" }, "engines": { "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.34.0-0 <2.0.0-0", + "@mastra/core": ">=1.50.0-0 <2.0.0-0", "wrangler": "^4.0.0", "zod": "^3.25.0 || ^4.0.0" }, @@ -3965,26 +3991,26 @@ } }, "node_modules/@mastra/deployer-vercel": { - "version": "1.1.37-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/deployer-vercel/-/deployer-vercel-1.1.37-alpha.0.tgz", - "integrity": "sha512-YtG5YZeINXwJuJrnK0wtGTWl9GP2QYRpN1isNzICbOx+/fQI8+KfHWtMn7hQWsg67SaJshxiMIIfBpM2RqfhaA==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@mastra/deployer-vercel/-/deployer-vercel-1.2.10.tgz", + "integrity": "sha512-er7hcBuPQ7dkqZPe+tyHe5hf6cel+0pYNjnJzBxgTdaX1tWnY9yDYJH1AqqXo7VHTD6paDxKtbW3fRQPOL/ONg==", "license": "Apache-2.0", "optional": true, "dependencies": { - "@mastra/deployer": "^1.42.0-alpha.0", - "fs-extra": "^11.3.4" + "@mastra/deployer": "^1.53.0", + "fs-extra": "^11.3.5" }, "engines": { "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.34.0-0 <2.0.0-0" + "@mastra/core": ">=1.50.0-0 <2.0.0-0" } }, "node_modules/@mastra/deployer-vercel/node_modules/fs-extra": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", - "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", "license": "MIT", "optional": true, "dependencies": { @@ -3997,9 +4023,9 @@ } }, "node_modules/@mastra/deployer/node_modules/fs-extra": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", - "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4025,15 +4051,15 @@ } }, "node_modules/@mastra/editor": { - "version": "0.11.2-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/editor/-/editor-0.11.2-alpha.0.tgz", - "integrity": "sha512-6RdnmabIHucTkbOG9CvMqNRQFHp8jYiAAhtmm0pKnhPpMHVYwGqAczr+BKZO8cJe8z4kgwkTd7kQzttCDiTsqA==", + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/@mastra/editor/-/editor-0.13.8.tgz", + "integrity": "sha512-EZg+YERUXvOXhqJXeqhT6MUJScmqISg/gokWiaspxP8iqA10a8VZKhP7gvf3xfFEF8PA/Wcj7p98kGnoJsYxOQ==", "dependencies": { - "@arcadeai/arcadejs": "^2.3.0", + "@arcadeai/arcadejs": "^2.4.1", "@composio/core": "^0.6.5", "@composio/mastra": "^0.6.5", - "@mastra/memory": "1.20.2", - "@mastra/schema-compat": "1.2.11" + "@mastra/memory": "1.23.1", + "@mastra/schema-compat": "1.3.4" }, "engines": { "node": ">=22.13.0" @@ -4049,9 +4075,9 @@ } }, "node_modules/@mastra/evals": { - "version": "1.2.4-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/evals/-/evals-1.2.4-alpha.0.tgz", - "integrity": "sha512-Bi3VpsrNFVHbiQq6dEQttNNGbsbs+nAZnN+ncWKDy4NvWWV98nG9TpC2iaETkW0AZN6nJnp1FZ4AOEml0dDTzg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@mastra/evals/-/evals-1.6.0.tgz", + "integrity": "sha512-VWLzeDxGB08/AY5UYHX/e7/Z+zryUrUSHuNj92COUFVQDgi/My0r1pnQ/c9x51u06dTDyVHSoxsNqcXQmHqZlA==", "license": "Apache-2.0", "dependencies": { "compromise": "^14.15.0", @@ -4067,9 +4093,9 @@ } }, "node_modules/@mastra/fastembed": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@mastra/fastembed/-/fastembed-1.1.2.tgz", - "integrity": "sha512-nddBp5UQScb+BY+fYx4czo4Ch8OPwFV9oc8sabeMvwzAEHttvY4kcKd1fKYBsaYTEwNrYw17Iy6eEcZJ1cfYOw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mastra/fastembed/-/fastembed-1.2.0.tgz", + "integrity": "sha512-BB050E+6sU/AwLraqCKpb+qmLiECnpJrpCC4dvVwJ0+CnAejWPdVJ4UIdpFgzPCuazAaWAT1B4LGYrpw9jnN1Q==", "license": "Apache-2.0", "dependencies": { "@anush008/tokenizers": "^0.6.0", @@ -4083,9 +4109,9 @@ } }, "node_modules/@mastra/loggers": { - "version": "1.1.2-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/loggers/-/loggers-1.1.2-alpha.0.tgz", - "integrity": "sha512-2R5tpUvWh2JJvgbQHbB8BsL2sc52z0q1b8PzOaj0/HJCs070pV2Gkqk2nBfPs4QPkVHWfMR4ncyqP9LRmbI+pg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mastra/loggers/-/loggers-1.2.0.tgz", + "integrity": "sha512-1RJO8XsMgVsTC+NviJ0jGMK01Y5zCqSzFNnOH9D1swOUfX8DMviyAJzxJUmkWbhSrDxmeo/KKmFzRK8zzk4XYA==", "license": "Apache-2.0", "dependencies": { "pino": "^10.3.1", @@ -4099,20 +4125,21 @@ } }, "node_modules/@mastra/memory": { - "version": "1.20.2-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/memory/-/memory-1.20.2-alpha.0.tgz", - "integrity": "sha512-B/L1DY0qFavrhY6BsHbOkPAPOkQQSfmpx8EgXI1+KLC3zl489LzZ8Zdl6V6c0GsHy2TCVNqT9cpcbfZugSIcvQ==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@mastra/memory/-/memory-1.23.1.tgz", + "integrity": "sha512-Xzgo4nsKPrn9cV4Bn07Wqkgyf3vrnZbgaTqLe7E6BPma2cPB81e/IthJOzrOy/CpMsam2asLShoYoxelISTXwg==", "license": "Apache-2.0", "dependencies": { - "@mastra/schema-compat": "1.2.11", + "@mastra/schema-compat": "1.3.4", "async-mutex": "^0.5.0", "diff": "^8.0.3", - "image-size": "^2.0.2", + "image-size": "1.2.1", "json-schema": "^0.4.0", "lru-cache": "^11.2.7", "probe-image-size": "^7.2.3", "tokenx": "^1.3.0", - "xxhash-wasm": "^1.1.0" + "xxhash-wasm": "^1.1.0", + "zod": "^4.4.3" }, "engines": { "node": ">=22.13.0" @@ -4121,10 +4148,25 @@ "@mastra/core": ">=1.4.1-0 <2.0.0-0" } }, + "node_modules/@mastra/memory/node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, "node_modules/@mastra/observability": { - "version": "1.14.1-alpha.1", - "resolved": "https://registry.npmjs.org/@mastra/observability/-/observability-1.14.1-alpha.1.tgz", - "integrity": "sha512-6tuDV4T7LAtRmpjc9d9txBOhKMD1KQSaKigu+LaoT54HQwnJC+X7YCVDoxfUnP1/35wAaCPCIb36ddVh9Lb68Q==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/@mastra/observability/-/observability-1.16.2.tgz", + "integrity": "sha512-WF1vqzTQ/Cx38ljCPIyVpATf/el4h+mkXWxynrSmUpta5qjEA2gQm20QxEJgn5AMwV0sw5BtDgJh4eE5vbmjQA==", "license": "Apache-2.0", "engines": { "node": ">=22.13.0" @@ -4135,13 +4177,13 @@ } }, "node_modules/@mastra/pg": { - "version": "1.13.0-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/pg/-/pg-1.13.0-alpha.0.tgz", - "integrity": "sha512-oHnUttVZTAHj2giYhZ82jVrDsDicfdNSdhkyJ8Tz9tEO9DuOKnRNtTIvCdyilXDRKoMEQ7OfFCX1yNQY/Z6k1A==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@mastra/pg/-/pg-1.17.1.tgz", + "integrity": "sha512-AlzDoHnKNQvRFZ9cnh5zsW+ZHqLW6GZVIyWeuVl0HRwLwfga8tSa33SrPe8Mdoz77ipcKJoErggIk/XU97AlcQ==", "license": "Apache-2.0", "dependencies": { "async-mutex": "^0.5.0", - "pg": "^8.20.0", + "pg": "^8.21.0", "pg-connection-string": "^2.12.0", "xxhash-wasm": "^1.1.0" }, @@ -4149,20 +4191,18 @@ "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.34.0-0 <2.0.0-0" + "@mastra/core": ">=1.51.0-0 <2.0.0-0" } }, "node_modules/@mastra/rag": { - "version": "2.2.1-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/rag/-/rag-2.2.1-alpha.0.tgz", - "integrity": "sha512-qbP6leSnKIoBM1ynOXzpdmjX7lPEo91/qbPscdPql0wWI1Rr/rwJIKpehyAKP/wtT5K6paTeAtQl/hYJHSIuqg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@mastra/rag/-/rag-2.4.2.tgz", + "integrity": "sha512-iwyiCQtSgU2rZp/SmcgTfnNhIFXtLHdwJO6+N2dhZJMR1eVQDaiYIzRfqjEk0cVbbc0XLf4yphOflZke8Y2aMg==", "license": "Apache-2.0", "dependencies": { - "@paralleldrive/cuid2": "^2.3.1", "big.js": "^7.0.1", "js-tiktoken": "^1.0.21", "node-html-better-parser": "^1.5.8", - "pathe": "^2.0.3", "zeroentropy": "0.1.0-alpha.7" }, "engines": { @@ -4174,9 +4214,9 @@ } }, "node_modules/@mastra/schema-compat": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.2.11.tgz", - "integrity": "sha512-wN8eTy/g14Mg3kWukhoIjd5SpFtLQ8gOltbELe9nM2Ruzm4jK8tFr1ZZNZwvLYnpq7NJG5a8F0ZFCjXFOEwx0w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@mastra/schema-compat/-/schema-compat-1.3.4.tgz", + "integrity": "sha512-2ObUsd21KIVelQy+eKPxJvnMxtmKnWacsIkZovhEYjVcQX9OYTDQ+u4E4RboIJZvurJnFx++/ujQLFznUaEYMg==", "license": "Apache-2.0", "dependencies": { "json-schema-to-zod": "^2.7.0", @@ -4192,9 +4232,9 @@ } }, "node_modules/@mastra/server": { - "version": "1.42.0-alpha.3", - "resolved": "https://registry.npmjs.org/@mastra/server/-/server-1.42.0-alpha.3.tgz", - "integrity": "sha512-InmbmY0tdITb6hINTZaoqNDbRshOYObeUrL50pWHobZzh0jXGce4X1p7oyZx9ApsPWWuZbWvjryhsOoHICYgpw==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@mastra/server/-/server-1.53.0.tgz", + "integrity": "sha512-o9KphBoM3U3jAYCVHhzlH9EBaxzFTXMlstkQ6DioexMdbxplA+QjhcO4tZhQGS8GaNG0F/heKmLBoO8OvfPBCA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -4204,14 +4244,14 @@ "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.34.0-0 <2.0.0-0", + "@mastra/core": ">=1.50.0-0 <2.0.0-0", "zod": "^3.25.0 || ^4.0.0" } }, "node_modules/@mastra/voice-openai": { - "version": "0.12.2-alpha.0", - "resolved": "https://registry.npmjs.org/@mastra/voice-openai/-/voice-openai-0.12.2-alpha.0.tgz", - "integrity": "sha512-rTYeIYWt0L+h8uAJ1k+a+xogdYfRgsMZ2w1o3VJf2udmlTE6ykPsK6+n/eU/+b9AI3ZDLvyNNSUKFufEgoAMqA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@mastra/voice-openai/-/voice-openai-0.13.0.tgz", + "integrity": "sha512-iAcsO/+I42Ub5S551ZiuH7J99OfphcfF4bIgcBAC56NSZmpGkonlN1nuWfvFPHxNbRyAfo06p9GSPGNwwDhjiw==", "license": "Apache-2.0", "dependencies": { "openai": "^5.23.2" @@ -4300,13 +4340,13 @@ } }, "node_modules/@microsoft/teams.api": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@microsoft/teams.api/-/teams.api-2.0.13.tgz", - "integrity": "sha512-PUbCxZhBLiRPchWeZNcgsXxBGY7lGJrLwqin9I+n+ND9iCwSTtDf9kzhvIWQSPXgxViK8znmKQshSguf1JRz3Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@microsoft/teams.api/-/teams.api-2.0.14.tgz", + "integrity": "sha512-mEHBgs7yklydQWTlfGFok5i7np2WxOKS3j6aMgRH0HVfiLqenPjGm0NAWKR/Hg29n9ODtGZZeuIXNCwIYQ8syA==", "license": "MIT", "dependencies": { - "@microsoft/teams.cards": "2.0.13", - "@microsoft/teams.common": "2.0.13", + "@microsoft/teams.cards": "2.0.14", + "@microsoft/teams.common": "2.0.14", "jwt-decode": "^4.0.0", "qs": "^6.15.2" }, @@ -4315,15 +4355,15 @@ } }, "node_modules/@microsoft/teams.apps": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@microsoft/teams.apps/-/teams.apps-2.0.13.tgz", - "integrity": "sha512-md8DmJhu+TuMlNu5i9mU0yflZuXEvbyDkZq+DcYABM5xZcj0PTSAtTMcVqW+cdbBz/KYquix6YGWdcV9KOFl/g==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@microsoft/teams.apps/-/teams.apps-2.0.14.tgz", + "integrity": "sha512-7re8a3pnAUSD5rAGlWbKQd07XtQJwyuZ4rI7EWyqBQT2iLhqUU1r4jtq3jQFpfov7xhADVV+oExCc7IbNyYuGw==", "license": "MIT", "dependencies": { "@azure/msal-node": "^5.2.2", - "@microsoft/teams.api": "2.0.13", - "@microsoft/teams.common": "2.0.13", - "@microsoft/teams.graph": "2.0.13", + "@microsoft/teams.api": "2.0.14", + "@microsoft/teams.common": "2.0.14", + "@microsoft/teams.graph": "2.0.14", "axios": "^1.15.2", "cors": "^2.8.5", "express": "^5.0.0", @@ -4336,18 +4376,18 @@ } }, "node_modules/@microsoft/teams.cards": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@microsoft/teams.cards/-/teams.cards-2.0.13.tgz", - "integrity": "sha512-eeXWvPTSQQZDeByVQOf9QTSfxnB0UvYBoAzgD2X+n+Q7nbsNBhId8nm0oipTF8E0uTp4i9iEb/5m9UkP/fmz6Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@microsoft/teams.cards/-/teams.cards-2.0.14.tgz", + "integrity": "sha512-qrWnjJVgMPO8vvbLEiTeBLrrRLsr4rletQnuP9fPMXTTcrNx+Dh0gYWtQAOBvpoAuFo5tTXR/waNFNUm8IZtBw==", "license": "MIT", "engines": { "node": ">=20" } }, "node_modules/@microsoft/teams.common": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@microsoft/teams.common/-/teams.common-2.0.13.tgz", - "integrity": "sha512-zDeKZBAsTCjvPCcAmMUpcttyAkQTSV78m3cG3hVYgHmkSupHd4z+pcCOHEw/Tto8gH346622KT7nj2Ar2cT2fg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@microsoft/teams.common/-/teams.common-2.0.14.tgz", + "integrity": "sha512-cjf3b/2sr5RqqiOaDuogJQ9fUNRZjDSh9eBEAv6NqkigNNLLjDgEgEl5lLoJsPp4usvc3drwFkx6HayuEbT7vA==", "license": "MIT", "dependencies": { "axios": "^1.15.2" @@ -4357,12 +4397,12 @@ } }, "node_modules/@microsoft/teams.graph": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@microsoft/teams.graph/-/teams.graph-2.0.13.tgz", - "integrity": "sha512-df3lCP9UmU60hXOm9zMr/GTEzZZhovL2mj9uFizjCEP6u9pQsaTN+0ldHn44FOyHtn5M6x9fUlBxIOiu4VOg9Q==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@microsoft/teams.graph/-/teams.graph-2.0.14.tgz", + "integrity": "sha512-PufhROXKhsC/h6ZKuquPzvNBB1Q9lHHu//vZGfRj3yD+hgtQkEz2YzXZDYC3h0bDN4ej2KtvkDGrsovqrnU0cQ==", "license": "MIT", "dependencies": { - "@microsoft/teams.common": "2.0.13", + "@microsoft/teams.common": "2.0.14", "qs": "^6.15.2" }, "engines": { @@ -4370,21 +4410,21 @@ } }, "node_modules/@microsoft/teams.graph-endpoints": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@microsoft/teams.graph-endpoints/-/teams.graph-endpoints-2.0.13.tgz", - "integrity": "sha512-nhPk4BNQ3XbD+ntoGNKtXwhCoWHvmUVp5xuAXuxvv7doFTOJ7u1K/fWa7FLQaaAg/m/zOrEc20S5cJisunWp4A==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@microsoft/teams.graph-endpoints/-/teams.graph-endpoints-2.0.14.tgz", + "integrity": "sha512-UNP8aCeA8ZVKxH0nMKHT3UMRkA575PVu4HHhZhV8biZvNTfXzQELO8VtOsBON+5eGFo0qqrTWL+gC7CB7sRMNw==", "license": "MIT", "engines": { "node": ">=20" } }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", - "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", + "integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.19.9", + "@hono/node-server": "^1.19.9 || ^2.0.5", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -4686,15 +4726,15 @@ } }, "node_modules/@next/env": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz", - "integrity": "sha512-zLPxg9M0MEHmygpj5OuxjQ+vHMiy/K7cSp74G8ecYolmgUWw0RwN02tF56npup/+qaI8JB97hQgS/r2Hb6QwVA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.12.tgz", + "integrity": "sha512-d0Z5Bc13Fa4nR8pFAKx2jay2yhJM16vlfHbTzYnUQAxlNb6B6lmn4hjt69lYNt4kRtyYP6gEM49lPRHNbIyneg==", "license": "MIT" }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz", - "integrity": "sha512-v9IdJCa0H0mbo+8z5zwUpOk1Vj7RjkcI5uNYf5Ws1y6szf/p3Mzl9hLaST8SCt6L9h8NGnruZcd2+o0NTNwDhA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.12.tgz", + "integrity": "sha512-0W1R0teHWJrqKX0FH20IzzIWAOuGtBxPGuObrxy1lE8hQvCFj49KE8a3WUg0D7sq6rn6zkM4c7YGUnhudBS6oA==", "cpu": [ "arm64" ], @@ -4708,9 +4748,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.10.tgz", - "integrity": "sha512-17IS0jJRViROGmA9uGdNR8VPJpfbnaVG7E9qhso5jDLkmyd0lSDORWxbcKINzcFqzZqGwGtMSnrFRxBpuUYjLQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.12.tgz", + "integrity": "sha512-Hy5Ls099+aFUmOLmIgPfLqNi6iCwhL3uQCssz5rWk+5Nkc6TUKCE83DY5BbNylfm3+mfwcSFnLRfrZDJhVxdtw==", "cpu": [ "x64" ], @@ -4724,9 +4764,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.10.tgz", - "integrity": "sha512-GRQRsRtuciNJvB54AvvuQTiq0oZtFwa1owQqtZD8wwnGpM2L39MV22kpI72YSXLKIyY40LC66EiLFv4PiicXxg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.12.tgz", + "integrity": "sha512-+YqU2h1cQkHsGfvjAsrSmst8UIFBibBGm5x3Xgel8NLMiDQtNOM4sM2GOEMvG5YiOBNeN/Ykk8cQC2S0Xrqljg==", "cpu": [ "arm64" ], @@ -4743,9 +4783,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.10.tgz", - "integrity": "sha512-zkN9MQYS7UQBro+FnISUq1itaQjXI9xqISzuQ+2bc921NcJ1x4yPCqrn77tVN6/dOOXaaWVX3k6/bR07pPwK+A==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.12.tgz", + "integrity": "sha512-0qjhiYBaKAqF63LA1ZWAAnKTzFUguAaZiRa5etMLGGPj/B6uEVjtIZldIzFEp3wHlB0koK6aTzqPtSdplTCjoA==", "cpu": [ "arm64" ], @@ -4762,9 +4802,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.10.tgz", - "integrity": "sha512-iCVJnwvrPYECvA6WM/7+oo+OiTvedIKLxtCLAZP4xZR3nXa1zmzZyLPbYCmWvpd4CvMYF1EMTafd0ii3DygLvA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.12.tgz", + "integrity": "sha512-7A3q26W+h7gnA15uqBToNuDqBEFZZcqh0mW2mn4AJh/G5pdg2RVE3n4slzLEliASZFG3NmsbEzng/x2Sh09mBg==", "cpu": [ "x64" ], @@ -4781,9 +4821,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.10.tgz", - "integrity": "sha512-ov2g4H0dHY9bPoOU83m91hWT7Iq5qy13bUnyyshLU3HGR1Ownn0X9QpmDPc5iIUaahTp7f7LeGAhV4DSFtackw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.12.tgz", + "integrity": "sha512-qSjL/uppm+cbh21s72Ss8gkiOhQ4dExWHNGOWy6eZV7STj5WsKehgxT61beSsOj+YYQuTplL376lOCdMQU5T8w==", "cpu": [ "x64" ], @@ -4800,9 +4840,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.10.tgz", - "integrity": "sha512-DwAnhLX76HQiFFQNgWlcK+JzlnD1rZ+UK/WY0ZMI/deXpvgnesjNYrqcfo1JzBuz4Kf7o3brIBL0glI1junatA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.12.tgz", + "integrity": "sha512-X6hzsOUJac/e7AWSbn9gQ9nzHld1xWP5iyjHpYWvud8pufB679O1xg4JDyKr8Xd69Jvd+kM2Der6uftiZCmjYA==", "cpu": [ "arm64" ], @@ -4816,9 +4856,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.10.tgz", - "integrity": "sha512-0JXq3b85Jk9Jg4ntLUbXSPvoDw3gpZou7twuKdoFG2jOw635v7+IiXfTaa0TxVMyx78pUjnrVYwLgjKfX4e6/A==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.12.tgz", + "integrity": "sha512-F6fakeHuFTLOPt0bslQJdf+xtT+WIP9DVn/m4y1w1mRnVPyh3D/cNvzlRkxM444xfm+IvvYNSOrKiA2CDJ0Uxw==", "cpu": [ "x64" ], @@ -4835,6 +4875,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -5196,9 +5237,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.138.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.138.0.tgz", - "integrity": "sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==", + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", "dev": true, "license": "MIT", "funding": { @@ -5209,6 +5250,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, "license": "MIT", "dependencies": { "@noble/hashes": "^1.1.5" @@ -5256,30 +5298,20 @@ "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "license": "MIT" }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@playwright/test": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", - "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.0.tgz", + "integrity": "sha512-9zOJ6ZQRAena31MpOH9VSzIz8Ou3YJ/wtY/eQm5T2uhfhG7/U3COrMS8xOtUrZrp9OgdmzEnIYODye3nY1VqzA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.61.1" + "playwright": "1.62.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/@pnpm/config.env-replace": { @@ -5335,39 +5367,39 @@ "license": "MIT" }, "node_modules/@posthog/core": { - "version": "1.39.6", - "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.39.6.tgz", - "integrity": "sha512-o6ajIwN5zXoNP0D4H/QPmOyibNTUkSyOR6ya7AG5U2ywXx4awo72L2KnCoiZPQM5x/bXv6jPBdimH8M18Ax0aw==", + "version": "1.45.1", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.45.1.tgz", + "integrity": "sha512-tLtvzomavb2PPWdGYKsusyIzIeL2Px47v348Smibkay7sMy/83TyPk+Ptsp2NdeOgJsbuwSxWkR2+XA0aSCAaA==", "license": "MIT", "dependencies": { - "@posthog/types": "^1.392.0" + "@posthog/types": "^1.398.0" } }, "node_modules/@posthog/types": { - "version": "1.392.1", - "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.392.1.tgz", - "integrity": "sha512-Qg6Gl7/1vlr8+gPtBi5gwnLgAgiyFoKOVmTvTtDcvya9cpTwZfna7rQmkGQ4B63CunUYNNbOlqcwiUwUDyTK6w==", + "version": "1.398.0", + "resolved": "https://registry.npmjs.org/@posthog/types/-/types-1.398.0.tgz", + "integrity": "sha512-sJMkl4k+u8yS/0fjHsKqE9xTdsAh30a2WvgChiptellnVoE0e8QJKFgqOMD2sk8FaEArPdeFklAhXvmENAt3Sg==", "license": "MIT" }, "node_modules/@radix-ui/number": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.2.tgz", - "integrity": "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", "license": "MIT" }, "node_modules/@radix-ui/primitive": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.4.tgz", - "integrity": "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", "license": "MIT" }, "node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.11.tgz", - "integrity": "sha512-HQDOFTKwSnmUij6l54wYJJtxTAnxI71+YJLOrjm2ladFB8HAV5Jt7hwaZPhWTGBkYoW4+ZAOfNZrLDh/qvxSYA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.15.tgz", + "integrity": "sha512-WTQwcAvQf5sOcuUyi90lKPbhwcvQ+j55cjrSmeaN+L2vKU3DooOvlKw2MDeiJ5IkV5N905KW0/fGojKOBhD11A==", "license": "MIT", "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.7" + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -5385,20 +5417,20 @@ } }, "node_modules/@radix-ui/react-accordion": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.15.tgz", - "integrity": "sha512-24Zz/0SYx8F2bSVThBnQrdJs2VbKelyuJordcFRRdA0fRAhrq/wSegGCqaQz34VQoiWqSMGYCYXEhynLSlyQlg==", + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", + "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collapsible": "1.1.15", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -5416,16 +5448,16 @@ } }, "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.18.tgz", - "integrity": "sha512-6c2cXpNlAgHDhKguK24XcWHHayMpK+lk7/WwBXBco+ZJ4Dv7xP++GBM280KgTD/HCRu3jSdfe8WQiZssonYaIA==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.23.tgz", + "integrity": "sha512-VAYOiQRqj3GPpYJE0I9J+X8Ip05cyVlNdKOFeiGS2Ou1HHGfpl0BxOyZm6nmVDyU+W+NF3/XLzmjHmVGydhwgA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dialog": "1.1.18", - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5443,12 +5475,12 @@ } }, "node_modules/@radix-ui/react-arrow": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.11.tgz", - "integrity": "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5466,12 +5498,12 @@ } }, "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.11.tgz", - "integrity": "sha512-IUAhIVpBUvP5NNICjlaB1OFmtRLGqQqTF3ZOSGPoq3XeLXRFtHiWTRxSVEULgOd9GQR2c7tsYqDnhUennapZnw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.15.tgz", + "integrity": "sha512-fy+dyVR+90nelK8rqIznFlxzx7uPcGbhxH8Nfr2bHb4UfSe+e3hklOC0luK0hDwVwnRX7xTRySpsrQVeW+/oNQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5489,16 +5521,17 @@ } }, "node_modules/@radix-ui/react-avatar": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.1.tgz", - "integrity": "sha512-+8PWoLLZv3AVb5m0pvoiOca/bQGzc9vPVb+982HB2x3Un0DpYEPM3zLMl4oqRpBsocJuNqLkiv/HXTnTrlwr4g==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.6.tgz", + "integrity": "sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5516,19 +5549,18 @@ } }, "node_modules/@radix-ui/react-checkbox": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.6.tgz", - "integrity": "sha512-eUEUoGMDpfkgHWSE97ZZaUJtzR1M7EKnNIpD1Q16+8JR9NWghcaqMulx9PuCQ720w0UclfYn6FEbCdd5Hx087g==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz", + "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5546,19 +5578,19 @@ } }, "node_modules/@radix-ui/react-collapsible": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.15.tgz", - "integrity": "sha512-8A1zibu5skAQ+UVbaeNH5hVMibiFCRJzgMuM14LTWGttnTZKQL9jwYnhAbHRuxrtCqPXa4JvvnVUq1pTNgyZYw==", + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", + "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5576,15 +5608,15 @@ } }, "node_modules/@radix-ui/react-collection": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.11.tgz", - "integrity": "sha512-djW9+zeg137KQdlPtmE8xnaD+K2rcXXMWFrSg0hsmYZ6HRbdTA7tDHFgpaW9+huWVEu0RCabL+985T4TA0BE7g==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -5602,9 +5634,9 @@ } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", - "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5617,9 +5649,9 @@ } }, "node_modules/@radix-ui/react-context": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.4.tgz", - "integrity": "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5632,16 +5664,16 @@ } }, "node_modules/@radix-ui/react-context-menu": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.2.tgz", - "integrity": "sha512-qzsA/ZPhF6yMxBOTIk1nlCkoy2mswSbwYL+ErBa2iP0s4WWrlxmczArYqMcpVfEjmM7KJj/ADPXky0yZfbSxtQ==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.7.tgz", + "integrity": "sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-menu": "2.1.19", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -5659,23 +5691,24 @@ } }, "node_modules/@radix-ui/react-dialog": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.18.tgz", - "integrity": "sha512-apa28mldjMgORmE6g/w3sCcA0Y9UAVeeDVoozN4i7kOw12mLl9RBchfzK3Nn6qxOWjrZhK1Lfy7f07kyzxtnBw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -5695,9 +5728,9 @@ } }, "node_modules/@radix-ui/react-direction": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.2.tgz", - "integrity": "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5710,16 +5743,16 @@ } }, "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.14.tgz", - "integrity": "sha512-4lUhWTWAjbDIqFrAPWJ3WqBOpO5YchVZ88X3nh6H9Lu5AFi5nCUeTPj3D8FSDmabmFeRe9ME0BDA4MwKTha5GQ==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-effect-event": "0.0.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" }, "peerDependencies": { "@types/react": "*", @@ -5737,18 +5770,18 @@ } }, "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.19.tgz", - "integrity": "sha512-HZccBkbK0LOi8nYKIp5jll/zIRW0cCOmG6WWyqsSpmXCU+ZlcBbTqIwlBvPCu886C5RVu6c/kHV7xSP8IgYNHw==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.19", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -5766,9 +5799,9 @@ } }, "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.4.tgz", - "integrity": "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -5781,14 +5814,14 @@ } }, "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.11.tgz", - "integrity": "sha512-Mn88Vg2whaRocGJNOH+DKFqYm6ySFPQaiwHNxZPyjn99B52KAEJWWY9NP83+nWdk2HM3rdov+STu9AG471Rt9w==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5806,17 +5839,17 @@ } }, "node_modules/@radix-ui/react-form": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.11.tgz", - "integrity": "sha512-0mTMJHv1gQAuEQoq5VDpTD3MRgmfUFdXAVFhpqR7wBeUr+tyRsof0wv/4XdPHLwQrefhoH2FiGHCggrCJhalIw==", + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.16.tgz", + "integrity": "sha512-Q4TLEn2A7TAypxwmd6R9EwrlXDvkfYSDMrq9/887AXAGh+G1rH+kYJKSTv+Si9Y0JPKTwKYv6PviAJosysNimA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-label": "2.1.11", - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5834,20 +5867,20 @@ } }, "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.18.tgz", - "integrity": "sha512-rt+Fx4HoCeEwFL2IdoV2QaPltqDLlzxN77i9nwB3Y70scFlfAHh1QCdE2TXKuFJtA1TNygb0oivnFBZifgtZOw==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.23.tgz", + "integrity": "sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-popper": "1.3.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -5865,12 +5898,12 @@ } }, "node_modules/@radix-ui/react-id": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.2.tgz", - "integrity": "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -5883,12 +5916,12 @@ } }, "node_modules/@radix-ui/react-label": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.11.tgz", - "integrity": "sha512-3PKvDDxOn62k0oV1n4QtNtD2vpu+zYjXR7ojLBPaO6SPvhy53yg0vAmgNeBQeJW5rV3dffoRG+HYfLBZuzw0CQ==", + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.15.tgz", + "integrity": "sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -5906,27 +5939,27 @@ } }, "node_modules/@radix-ui/react-menu": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.19.tgz", - "integrity": "sha512-Mht9BVd1AIsNFVQr4KG3bIK7XQn5IXF0TL/2ObsrzOdc1loaly/+kBDL5roSCYn8j8XZkvpOD0WYLz2FQtH1Eg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -5946,21 +5979,21 @@ } }, "node_modules/@radix-ui/react-menubar": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.19.tgz", - "integrity": "sha512-Glt6mebxcgQvLeVkH3HiqV5bgQubE+31ELxLs7q0GlYI5k0XYkOkeuPrhXoylxK8eufvIt9CJjzY1TfFMXK3qw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-menu": "2.1.19", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-use-controllable-state": "1.2.3" + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.24.tgz", + "integrity": "sha512-eeVs0vf7cuqXaM0qLQCPcufImiJNVBXdJDLu7ZGYl2732UH23Qat/foNGrr6vYV3/DdTsBqASoggUFgH14OcZA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -5978,25 +6011,25 @@ } }, "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.17.tgz", - "integrity": "sha512-fYeYQvbeNn5AQk2RBbpO7koLm2YbS00UYxC/IL2sgLlninEH5UNIv+X3E0KJ1Vy4WIo+dhN9w8GNqSHhbHWCIg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.7" + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", + "integrity": "sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -6014,23 +6047,23 @@ } }, "node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.11.tgz", - "integrity": "sha512-Rsgab65u73E5kPVh8OS6PgPwJgPyf08GFfJDGAbMdF4DL7CgDhFOaDnXuk/DiMEVF6kgQwl0oJmFklvipmiOLg==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2" + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.16.tgz", + "integrity": "sha512-Tj9P6ntAJEw52oq/F0AGknXR4XncxEt7XU47O3xJQOiWfLzEy3d9gtgKfvjSzGxzHkfL+VzvxGu2KTFsloJqXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6048,19 +6081,19 @@ } }, "node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.6.tgz", - "integrity": "sha512-pQ3xGp/uemomASPH97Eb3shfXX8QlG11bBJyEvRBV+vwtO4HvQlS06Yj9f31Ao7XepvF98SFrRgVDQ7jv+2xjQ==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.11.tgz", + "integrity": "sha512-4gvFnmDXu3dgj21CqsufzIameRvlRd4SBqaWhcrlrNhRo0Y5i/49AmRJYe1fdAM3G2VNBbmin4b0D6cdQocwgw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-is-hydrated": "0.1.1" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3" }, "peerDependencies": { "@types/react": "*", @@ -6078,24 +6111,24 @@ } }, "node_modules/@radix-ui/react-popover": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.18.tgz", - "integrity": "sha512-qdXDes+eHlnMUGlBAAAe5EG7oOQvqsXuq4mq585diMudg80iB+jHbsSeG3+Q4eWNsogNyhqU2p/3i+Y0iEepqg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -6115,21 +6148,21 @@ } }, "node_modules/@radix-ui/react-popper": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.2.tgz", - "integrity": "sha512-3QXNeMkdshed1MR3LNoiCirBywRFPkD8ETJa/HlPuLwSajaQixf2ro+isoDNJlGABg9ug41XuZpINZJIle4XWg==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", "license": "MIT", "dependencies": { "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-rect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/rect": "1.1.2" + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -6147,13 +6180,13 @@ } }, "node_modules/@radix-ui/react-portal": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.13.tgz", - "integrity": "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA==", + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6171,12 +6204,12 @@ } }, "node_modules/@radix-ui/react-presence": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.6.tgz", - "integrity": "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==", + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6194,12 +6227,12 @@ } }, "node_modules/@radix-ui/react-primitive": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.7.tgz", - "integrity": "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==", + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", "license": "MIT", "dependencies": { - "@radix-ui/react-slot": "1.3.0" + "@radix-ui/react-slot": "1.3.3" }, "peerDependencies": { "@types/react": "*", @@ -6217,13 +6250,13 @@ } }, "node_modules/@radix-ui/react-progress": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.11.tgz", - "integrity": "sha512-KqiGJcFaZDc+BvveAgU3ZhACg2MvSUDrCBx4lRR/ZVRNal0bvt8lBpvnSkep9heeOuF8Qfw3fszLDX4OpQ2NVw==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.16.tgz", + "integrity": "sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==", "license": "MIT", "dependencies": { - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -6241,21 +6274,20 @@ } }, "node_modules/@radix-ui/react-radio-group": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.2.tgz", - "integrity": "sha512-W8Uo9riHnlzLLWy+r2mVHUyuEWqD/+be4PZzbEvaGoFSBDHkm+GYWjtcE6u3AmPKNyfanWpnVfpZ2GqPCdzzsw==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.7.tgz", + "integrity": "sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6273,20 +6305,22 @@ } }, "node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.14.tgz", - "integrity": "sha512-8Qcnx9447tx/aCBgw6Jenfqg4Skq+vqab9mCBmuGNipIS5YXvL275wbKEu7+ICYHIlAPgCduUMJH1XOYewKF6Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3" + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6304,20 +6338,20 @@ } }, "node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.13.tgz", - "integrity": "sha512-7tncSubo2G0UY1e8rk+72qe3XRzrGnOLtZQ1PL1KoBfRUNX0NrJT5akb+0kfwSCc3gVR4wdHqyhAQBDpDNOwDw==", + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", + "integrity": "sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==", "license": "MIT", "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6335,31 +6369,31 @@ } }, "node_modules/@radix-ui/react-select": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.2.tgz", - "integrity": "sha512-brXD6C/V0fVK0DDbscLVw6LsXrjQ+ay8jdOBaN+tLb4vsHsAMm6Gt6eT77wHX1Eq8GPtD5rJ+RxFtfDozsb4+Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.7", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, @@ -6379,12 +6413,12 @@ } }, "node_modules/@radix-ui/react-separator": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.11.tgz", - "integrity": "sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -6402,22 +6436,22 @@ } }, "node_modules/@radix-ui/react-slider": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.2.tgz", - "integrity": "sha512-qt5C1ppJz66aUDrH1VccjPrq7aFchK0wBrn6xsxlCHNUyE57dRRQ7lp1QFpF7OscMexZF8MCGBTVBlENHPkNiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.2", - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.7.tgz", + "integrity": "sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6435,12 +6469,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", - "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.3" + "@radix-ui/react-compose-refs": "1.1.5" }, "peerDependencies": { "@types/react": "*", @@ -6453,18 +6487,17 @@ } }, "node_modules/@radix-ui/react-switch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.2.tgz", - "integrity": "sha512-tgRBI3DdNwAJYE4BBZyZcz/HRRCvAsPkRvG1wvKc+41tBGMxPn/a87T/wikXAvyDypNQ9kaZwHbeZe+veHCGpA==", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.7.tgz", + "integrity": "sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-previous": "1.1.2", - "@radix-ui/react-use-size": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6482,19 +6515,19 @@ } }, "node_modules/@radix-ui/react-tabs": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.16.tgz", - "integrity": "sha512-v3Ab2l7z6U7tRB4xA0IyKdq0OsqaO1o9ZjsIEoKKnSZ/l96mZz8aCTX0NCXw+YVHJXr8Km4d+Mn6/Q8YjXa+gw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", + "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -6512,23 +6545,23 @@ } }, "node_modules/@radix-ui/react-toast": { - "version": "1.2.18", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.18.tgz", - "integrity": "sha512-YNEnTHV47hPep+U0QvVM02OJNka9uygREc+k4Nh5VSZBg4MmE+myI442x3hCGfRpX7N2WSSYSJKws4gE+Z8lgg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.7" + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.23.tgz", + "integrity": "sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -6546,14 +6579,14 @@ } }, "node_modules/@radix-ui/react-toggle": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.13.tgz", - "integrity": "sha512-bI2ILJrzwgmAsH05TsJ9pVrzqQwAip7OM2/krqAdYn0R16bl86UPWbe5VPHsALat0EnqpV01cGtkleaUKPNdNg==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -6571,18 +6604,18 @@ } }, "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.14.tgz", - "integrity": "sha512-TK1vusNKb8IRhF23FTbRgUNZ9zfs5rGIyI7LfR3h26p9LrQ060i0uW9QWeD8baZMddaaP0DBGlIa6pbZG+mitg==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-toggle": "1.1.13", - "@radix-ui/react-use-controllable-state": "1.2.3" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" }, "peerDependencies": { "@types/react": "*", @@ -6600,18 +6633,18 @@ } }, "node_modules/@radix-ui/react-toolbar": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.14.tgz", - "integrity": "sha512-L/EkWVqlnj3lL2toHh4C7PwH2jxfa7OCq6lGfXSCii99ve2S4Ux5rc9HnOa7LN9exHa/Nl9kmCAmP9BuDPy5UA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.19.tgz", + "integrity": "sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==", "license": "MIT", "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-separator": "1.1.11", - "@radix-ui/react-toggle-group": "1.1.14" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-toggle-group": "1.1.19" }, "peerDependencies": { "@types/react": "*", @@ -6629,23 +6662,24 @@ } }, "node_modules/@radix-ui/react-tooltip": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.11.tgz", - "integrity": "sha512-8XZ6Py3y3W2nEzAUGCN5cfVKaUi+CVApcz1d6lrNVVf2hvYEixMRkq8k9ggPKnQUpRRuOV5avt8uvxViH2jLwA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-id": "1.1.2", - "@radix-ui/react-popper": "1.3.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-visually-hidden": "1.2.7" + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -6663,9 +6697,9 @@ } }, "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.2.tgz", - "integrity": "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6678,13 +6712,14 @@ } }, "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.3.tgz", - "integrity": "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6697,12 +6732,12 @@ } }, "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.3.tgz", - "integrity": "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6715,12 +6750,12 @@ } }, "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.3.tgz", - "integrity": "sha512-3wEkMiPHXha/2VadZ68rYBcmYnPINVGl4Y3gtcM7fKRjANk0OscK+cdqBgUWdozb7YJxsh0vefM7vgAMHXOjqg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.5.tgz", + "integrity": "sha512-ge3ipobwSXTj4JyVtswQ7qZj0ZHdtbGuOno/LrgAAeSxtsJ6Vs4Gz5IkPH2bmqpjcLUFoqGhA/mueuIf63UXlA==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.2" + "@radix-ui/react-use-callback-ref": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6733,9 +6768,9 @@ } }, "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.1.tgz", - "integrity": "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6748,9 +6783,9 @@ } }, "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.2.tgz", - "integrity": "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6763,9 +6798,9 @@ } }, "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.2.tgz", - "integrity": "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -6778,12 +6813,12 @@ } }, "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.2.tgz", - "integrity": "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", "license": "MIT", "dependencies": { - "@radix-ui/rect": "1.1.2" + "@radix-ui/rect": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -6796,12 +6831,12 @@ } }, "node_modules/@radix-ui/react-use-size": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.2.tgz", - "integrity": "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", "license": "MIT", "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.2" + "@radix-ui/react-use-layout-effect": "1.1.4" }, "peerDependencies": { "@types/react": "*", @@ -6814,12 +6849,12 @@ } }, "node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.7.tgz", - "integrity": "sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", "license": "MIT", "dependencies": { - "@radix-ui/react-primitive": "2.1.7" + "@radix-ui/react-primitive": "2.1.10" }, "peerDependencies": { "@types/react": "*", @@ -6837,9 +6872,9 @@ } }, "node_modules/@radix-ui/rect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.2.tgz", - "integrity": "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", "license": "MIT" }, "node_modules/@reduxjs/toolkit": { @@ -6869,9 +6904,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.4.tgz", - "integrity": "sha512-EZLpf/8y7GXkkra90ML47kzik/GMP3EMcE9bPyHmRfxLC6z9+aW5A8poCsoxjrT5GfEcNAAvWwUHjvP1pUQkfw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", "cpu": [ "arm64" ], @@ -6886,9 +6921,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.4.tgz", - "integrity": "sha512-aUi+HBvmYb7j8krl1+qJgkG8C17fO79gk3c+jPw4S8glRFc1DTija9S3EyaTSQUm5GJXYKDAsugBEhFHH2vYiQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", "cpu": [ "arm64" ], @@ -6903,9 +6938,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.4.tgz", - "integrity": "sha512-F7hHC3gwY11+vByKPRWqwGbeXWVgKmL+pTGCinaEhdihzBV2aQ0fvZOch9cXYUOKuKKq429HeYXOqQLc7wFCEg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", "cpu": [ "x64" ], @@ -6920,9 +6955,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.4.tgz", - "integrity": "sha512-sI5yw+7s92SK6odiEhD5lKCBlWcpjHS5qyqpVQbZAJ0fIzEUXrmbl3DH2ybR3PZogulNJF+COLtmA8hUfvkCCQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", "cpu": [ "x64" ], @@ -6937,9 +6972,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.4.tgz", - "integrity": "sha512-mCi0OKgEieFircrtVYmQAFGszRtMnZ6fpZAXrxanXAu7lqZcsK1E1RAaZNG0uKAnxox3B1f4EyQNnoyMfN1vAA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", "cpu": [ "arm" ], @@ -6954,9 +6989,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.4.tgz", - "integrity": "sha512-B9Ial3Kv5sh0SHnB1g/QWcUQCEvCF6QKGAl4zXypYj65mVI+B4AhFBwPtSN7pDrJeIx8Z7zdy4ntx+wQABom7w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", "cpu": [ "arm64" ], @@ -6974,9 +7009,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.4.tgz", - "integrity": "sha512-lZVym0PuHE1KZ22gmFTC15lAkrg9iTszR617oYRB/iPY1A56ywoJzVKOJBKaot5RiikCObmur6pogpse3gRcng==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", "cpu": [ "arm64" ], @@ -6994,9 +7029,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.4.tgz", - "integrity": "sha512-t2DNiLJWNTbnEHyUzTumldML6ET4/g16467LZoDDJ3tSxGvguL5/NyC2lCsNKuyRycg9XeDQF5SSv+TNOhQEXg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", "cpu": [ "ppc64" ], @@ -7014,9 +7049,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.4.tgz", - "integrity": "sha512-0WIRnL1Uw4BvTZRLQt+PVgo6ZKTJadlC2btP+/EOXv2f/DWbY0rEgl+y834mIVwP1FkTlWVTrGGJXf12lru7EQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", "cpu": [ "s390x" ], @@ -7034,9 +7069,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.4.tgz", - "integrity": "sha512-JWtGshGfX+oENAKonoNkqEJX+7hC8yfhi9GUyPX1VX4mdh1y5r+ZiJLR5XzAB0aoP6s/PcILsGjKq8O0mm24bw==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", "cpu": [ "x64" ], @@ -7054,9 +7089,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.4.tgz", - "integrity": "sha512-rT6yQcxUuXs4CnbofqwHRRV0iem349rLMYpTjkgQGLjrY4ado/eDzwPZPTCgTOlF6Nkp8NEv70yLMTn6qkWxsQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", "cpu": [ "x64" ], @@ -7074,9 +7109,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.4.tgz", - "integrity": "sha512-KXMGoboq5cyaCQjDA4GLuRiOwBQ0EyFnJoVViLeZ45/3rFItRODEr+NdsBcVpll40hhNArlm/speWGRvj08LzA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", "cpu": [ "arm64" ], @@ -7091,9 +7126,9 @@ } }, "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.4.tgz", - "integrity": "sha512-5K83rb36oJiY7BCyE9zLZtGcPV4g5wvq+xwdO0XPIwDVZI8cyB/AUjkNXGb92/rnmezEkjMOpgY61rtwjQtFwg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", "cpu": [ "wasm32" ], @@ -7121,9 +7156,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.4.tgz", - "integrity": "sha512-PnWBtw3TV5KOg69HQQDR0mnQuyCmSGR2pAB4DC1rPF808fgKeTUMj2EOEyKATpgiuxuR5APQmiDO7PDgEjTFSA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", "cpu": [ "arm64" ], @@ -7138,9 +7173,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.4.tgz", - "integrity": "sha512-M1lpniBePobTfsa7Ks9a199e1akxsXn+GYBUKsEzv3YFzOm1HJAMNwKI3qr0Zq+mxwx9gOZoTdP1yXRYsZUocQ==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", "cpu": [ "x64" ], @@ -7356,9 +7391,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", - "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.3.tgz", + "integrity": "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw==", "cpu": [ "arm" ], @@ -7369,9 +7404,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", - "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.3.tgz", + "integrity": "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA==", "cpu": [ "arm64" ], @@ -7382,9 +7417,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", - "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.3.tgz", + "integrity": "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ==", "cpu": [ "arm64" ], @@ -7395,9 +7430,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", - "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.3.tgz", + "integrity": "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g==", "cpu": [ "x64" ], @@ -7408,9 +7443,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", - "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.3.tgz", + "integrity": "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ==", "cpu": [ "arm64" ], @@ -7421,9 +7456,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", - "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.3.tgz", + "integrity": "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw==", "cpu": [ "x64" ], @@ -7434,9 +7469,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", - "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.3.tgz", + "integrity": "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA==", "cpu": [ "arm" ], @@ -7450,9 +7485,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", - "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.3.tgz", + "integrity": "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA==", "cpu": [ "arm" ], @@ -7466,9 +7501,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", - "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.3.tgz", + "integrity": "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q==", "cpu": [ "arm64" ], @@ -7482,9 +7517,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", - "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.3.tgz", + "integrity": "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ==", "cpu": [ "arm64" ], @@ -7498,9 +7533,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", - "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.3.tgz", + "integrity": "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ==", "cpu": [ "loong64" ], @@ -7514,9 +7549,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", - "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.3.tgz", + "integrity": "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw==", "cpu": [ "loong64" ], @@ -7530,9 +7565,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", - "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.3.tgz", + "integrity": "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA==", "cpu": [ "ppc64" ], @@ -7546,9 +7581,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", - "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.3.tgz", + "integrity": "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw==", "cpu": [ "ppc64" ], @@ -7562,9 +7597,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", - "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.3.tgz", + "integrity": "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg==", "cpu": [ "riscv64" ], @@ -7578,9 +7613,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", - "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.3.tgz", + "integrity": "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ==", "cpu": [ "riscv64" ], @@ -7594,9 +7629,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", - "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.3.tgz", + "integrity": "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg==", "cpu": [ "s390x" ], @@ -7610,9 +7645,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", - "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.3.tgz", + "integrity": "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg==", "cpu": [ "x64" ], @@ -7626,9 +7661,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", - "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.3.tgz", + "integrity": "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw==", "cpu": [ "x64" ], @@ -7642,9 +7677,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", - "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.3.tgz", + "integrity": "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA==", "cpu": [ "x64" ], @@ -7655,9 +7690,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", - "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.3.tgz", + "integrity": "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg==", "cpu": [ "arm64" ], @@ -7668,9 +7703,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", - "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.3.tgz", + "integrity": "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA==", "cpu": [ "arm64" ], @@ -7681,9 +7716,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", - "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.3.tgz", + "integrity": "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ==", "cpu": [ "ia32" ], @@ -7694,9 +7729,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", - "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.3.tgz", + "integrity": "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ==", "cpu": [ "x64" ], @@ -7707,9 +7742,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", - "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.3.tgz", + "integrity": "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g==", "cpu": [ "x64" ], @@ -7743,9 +7778,9 @@ } }, "node_modules/@sapphire/snowflake": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", - "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.5.tgz", + "integrity": "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ==", "license": "MIT", "engines": { "node": ">=v14.0.0", @@ -7937,9 +7972,9 @@ } }, "node_modules/@slack/web-api": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.18.0.tgz", - "integrity": "sha512-EWBsKUhOFFp87beQg/ToSC+asWB7BrGHuh7uPC1ZI9vr41GjS+3WmmyWIMqs+mF6U+mh4d6HhtFlv67TrJFsvw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.19.0.tgz", + "integrity": "sha512-ItjyjEZml+LDH8CjcCLRLJHh7VZtevPKExrRN3l5KWyBliyDnGAeoO4Y+K+fFBmRpKLYVPgqWMX4THldv2HVtA==", "license": "MIT", "dependencies": { "@slack/logger": "^4.0.1", @@ -8053,9 +8088,9 @@ } }, "node_modules/@supabase/auth-js": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.110.0.tgz", - "integrity": "sha512-Mi288WCTp6wxMFCOu/UgzgHEXODjdl2uVTLqK11eanzGZaldU3RyP8Am+ZbNuVzFP+5+iOvppxzv7N5Ym84xTg==", + "version": "2.110.9", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.110.9.tgz", + "integrity": "sha512-XQIWyJfwEUdtzinuLUWPNSJbJKWdCQPqC7dDY45lA1qhX/OzvGPE+4OyPPZVOVWVh4DlPvk5RT2XL6SEAY0MoA==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -8065,9 +8100,9 @@ } }, "node_modules/@supabase/functions-js": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.110.0.tgz", - "integrity": "sha512-Fde5wlY8ZZy+9yqrWlQHo8MacSyUBArBEtN2boB4thJQigPnQD/cc61qZN0n3I1L0gwhWtHYwIMnOBKxSvF6Hw==", + "version": "2.110.9", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.110.9.tgz", + "integrity": "sha512-iSL6ih4vWK5Myc1lCuDoApfeB3Ov3cZIExvlCuQEZTzyzOKG4SLxVKPrBZG/QzwAjp7TEy0LCd0zZQtE5UAaDQ==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -8077,15 +8112,15 @@ } }, "node_modules/@supabase/phoenix": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.4.tgz", - "integrity": "sha512-Gt0pqoXuIqX/8dvG0OKp/wMCobXNH3klNbUPBNyOfN0YA1IswrM3HyWFMOPk1Jy+BRaIyDPcFx4jLBwHNmlyfQ==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.5.tgz", + "integrity": "sha512-aAn9H9ovVyeApKy11OWOrrOGq8DV68yWeH4ud2lN9fzn4aO8Zb5GLL9m1pUg9nLqIcT+ZDfAcsZe0E/nqdv2lw==", "license": "MIT" }, "node_modules/@supabase/postgrest-js": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.110.0.tgz", - "integrity": "sha512-ZbC1QZL3jcvBUfVKjJbgRM27G4Mg3Zzqdm44m5pJafe1e52Cli793EOnwQucomBAGEUDd03Nzaf7XV3ji/XexQ==", + "version": "2.110.9", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.110.9.tgz", + "integrity": "sha512-YEfUzBMNkDE9OMfjzZnVgJH9h7y+wxxXryrgYk/t3boVtjPPlfwTdWRx8YkihuIbl4zxzdG4I0yiS4nd4Lmj8Q==", "license": "MIT", "dependencies": { "tslib": "2.8.1" @@ -8095,12 +8130,12 @@ } }, "node_modules/@supabase/realtime-js": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.110.0.tgz", - "integrity": "sha512-Wn2AWpneZuDFTkp/65tqctvoh+3JvyTjMam8sTMqVWy5BgkU8zAvFwilPYPPPhkINeKF8NAJKP7FclJ2iGCUMw==", + "version": "2.110.9", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.110.9.tgz", + "integrity": "sha512-XHau+5jIOEAtS9hNiSrL4/2SXSt0EApChsj+f2VJL2mL+eicpUYLkANBu+5awFLIjXGOkys+ClYQ7Dg/3UTHcA==", "license": "MIT", "dependencies": { - "@supabase/phoenix": "0.4.4", + "@supabase/phoenix": "0.4.5", "tslib": "2.8.1" }, "engines": { @@ -8133,9 +8168,9 @@ } }, "node_modules/@supabase/storage-js": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.110.0.tgz", - "integrity": "sha512-71+gU3HrhiylAhftY6FmO5PPdcsScnVcS766CVD+vTYK9qTDLbrx8FhgBYbqGm3iV/wkTfzrNJfjGsMeFRkJRQ==", + "version": "2.110.9", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.110.9.tgz", + "integrity": "sha512-UmyL+SB4cOBsejAaJ8LnLIm31585shJtnTezCCLMHyo2AauoH13sKJqPllf/8HMcGYqd0a4kHrA5t2nz+MSARA==", "license": "MIT", "dependencies": { "iceberg-js": "^0.8.1", @@ -8146,16 +8181,16 @@ } }, "node_modules/@supabase/supabase-js": { - "version": "2.110.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.110.0.tgz", - "integrity": "sha512-8yI84VJiEVW4zxZpLUmxXmjzQ7O2St9X/ymzlBETDHTURPWG3LmvbSiibq+7dqAJmyoUfxZnSfXeM4HCM8s4XQ==", + "version": "2.110.9", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.110.9.tgz", + "integrity": "sha512-C8UVe+x6hymwiLdJntQCm9zMD5+40tWF6j+17Z6g8NJnBAWEiuM9wXYAqgDzGAQF6oqrkHddmnZwWZZtEp0zeA==", "license": "MIT", "dependencies": { - "@supabase/auth-js": "2.110.0", - "@supabase/functions-js": "2.110.0", - "@supabase/postgrest-js": "2.110.0", - "@supabase/realtime-js": "2.110.0", - "@supabase/storage-js": "2.110.0" + "@supabase/auth-js": "2.110.9", + "@supabase/functions-js": "2.110.9", + "@supabase/postgrest-js": "2.110.9", + "@supabase/realtime-js": "2.110.9", + "@supabase/storage-js": "2.110.9" }, "engines": { "node": ">=22.0.0" @@ -8171,49 +8206,49 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", - "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "5.21.6", + "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.3.2" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", - "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", "dev": true, "license": "MIT", "engines": { "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-x64": "4.3.2", - "@tailwindcss/oxide-freebsd-x64": "4.3.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-x64-musl": "4.3.2", - "@tailwindcss/oxide-wasm32-wasi": "4.3.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", - "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", "cpu": [ "arm64" ], @@ -8228,9 +8263,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", - "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", "cpu": [ "arm64" ], @@ -8245,9 +8280,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", - "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", "cpu": [ "x64" ], @@ -8262,9 +8297,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", - "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", "cpu": [ "x64" ], @@ -8279,9 +8314,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", - "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", "cpu": [ "arm" ], @@ -8296,9 +8331,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", - "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", "cpu": [ "arm64" ], @@ -8316,9 +8351,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", - "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", "cpu": [ "arm64" ], @@ -8336,9 +8371,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", - "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", "cpu": [ "x64" ], @@ -8356,9 +8391,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", - "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", "cpu": [ "x64" ], @@ -8376,9 +8411,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", - "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -8406,9 +8441,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", - "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", "cpu": [ "arm64" ], @@ -8423,9 +8458,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", - "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", "cpu": [ "x64" ], @@ -8440,17 +8475,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.2.tgz", - "integrity": "sha512-rjVWYCa7Ngbi5AarT6k8TkxUG3Wl1QKzHdIZVsjZSzf36Jmo2IKZt/NHRAwly8oDkbBOH0YTu+CHuf9jPxMc+g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.3.tgz", + "integrity": "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.3.2", - "@tailwindcss/oxide": "4.3.2", - "postcss": "^8.5.15", - "tailwindcss": "4.3.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "postcss": "^8.5.16", + "tailwindcss": "4.3.3" } }, "node_modules/@testing-library/jest-dom": { @@ -8512,16 +8547,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -8824,6 +8849,13 @@ "@types/estree": "*" } }, + "node_modules/@types/gensync": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.5.tgz", + "integrity": "sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", @@ -8831,14 +8863,21 @@ "license": "MIT" }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { "@types/unist": "*" } }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -8912,12 +8951,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", - "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/node-fetch": { @@ -8974,9 +9013,9 @@ "license": "MIT" }, "node_modules/@types/superagent": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.10.tgz", - "integrity": "sha512-nbt4IWXABhW0jGmmpRzCFNlbmwCTzZ2gTUsNIr+X+ItdqPms+PAJZbWsNzpS2USqXjcoNLQcO6nXo60zcPQiIg==", + "version": "8.1.11", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.11.tgz", + "integrity": "sha512-KA7srSW/HENDtOw9DOqaFLgWuMqN9WgjEw62lh9dpvRaZDkhdOkazASd7X7i2eMUYLHa1U37ZttnePsH5zTDHw==", "dev": true, "license": "MIT", "dependencies": { @@ -8987,9 +9026,9 @@ } }, "node_modules/@types/supertest": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-7.2.0.tgz", - "integrity": "sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-7.2.1.tgz", + "integrity": "sha512-4CbBvoYVLHL7+yhbYrZET0vsvuyXTC05aRe7dNQkwMzm56auceoy6Yu3K50uZmwfHna1os3CMSgM/3QVkUtPTw==", "dev": true, "license": "MIT", "dependencies": { @@ -9026,9 +9065,9 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", - "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", "license": "ISC" }, "node_modules/@upsetjs/venn.js": { @@ -9051,16 +9090,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz", - "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", + "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.9", - "@vitest/utils": "4.1.9", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -9069,13 +9108,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", - "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", + "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.9", + "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -9096,9 +9135,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz", - "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", + "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9109,13 +9148,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz", - "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", + "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.9", + "@vitest/utils": "4.1.10", "pathe": "^2.0.3" }, "funding": { @@ -9123,14 +9162,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz", - "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", + "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.9", - "@vitest/utils": "4.1.9", + "@vitest/pretty-format": "4.1.10", + "@vitest/utils": "4.1.10", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -9139,9 +9178,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz", - "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", + "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", "dev": true, "license": "MIT", "funding": { @@ -9149,13 +9188,13 @@ } }, "node_modules/@vitest/ui": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.9.tgz", - "integrity": "sha512-U/cRvtqfEPj27FI1n9cyUvi4vXXdcLhjJiI+InYKdk8hP4VrS6RXOjGL7rfFaeBc37iRKANsR6eEzIoC7lmgBQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.10.tgz", + "integrity": "sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.9", + "@vitest/utils": "4.1.10", "fflate": "^0.8.2", "flatted": "^3.4.2", "pathe": "^2.0.3", @@ -9167,17 +9206,17 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.1.9" + "vitest": "4.1.10" } }, "node_modules/@vitest/utils": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz", - "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", + "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.9", + "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -9196,9 +9235,9 @@ } }, "node_modules/@workflow/serde": { - "version": "4.1.0-beta.2", - "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0-beta.2.tgz", - "integrity": "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0.tgz", + "integrity": "sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==", "license": "Apache-2.0" }, "node_modules/@yarnpkg/lockfile": { @@ -9228,28 +9267,29 @@ } }, "node_modules/@zapier/zapier-sdk": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk/-/zapier-sdk-0.81.0.tgz", - "integrity": "sha512-ngdN3zevitIQJq/BzvJ5PZPzHX3ogtvtikuz9gDYRAwURe3bAagTyYUIbajAMvglb7pNO0pl9QtUGbkv1RDjAw==", + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk/-/zapier-sdk-0.91.0.tgz", + "integrity": "sha512-3/3yOeqiZV5Bx4eGVlsN9kbRtwlgP2aRIFXKNtYRIhH6QiwQiMe9Ky+96r3rkhLRsAJwVhVWI7+JR7wBWROX+Q==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@zapier/policy-context": "1.2.2", "@zapier/policy-schema": "0.15.0", - "@zapier/zapier-sdk-core": "0.12.0", + "@zapier/zapier-sdk-core": "0.15.1", "zod": "4.3.6" } }, "node_modules/@zapier/zapier-sdk-cli": { - "version": "0.62.0", - "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk-cli/-/zapier-sdk-cli-0.62.0.tgz", - "integrity": "sha512-uN1wVWv47wiwG2wI1UdGVzMCUlD35A28lQRRUH1D/LdixVrr2gL9lMAL/aNNnGmWRGacHgWpR/fXCXw7InVWng==", + "version": "0.67.5", + "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk-cli/-/zapier-sdk-cli-0.67.5.tgz", + "integrity": "sha512-wvghYlSoIePHcw1rnFenOJMPRi3bLHBDeLOVQB3spMz8HTN7KoGV7SSjEMPeCcSD8E4SXg713Ag42of98iysUQ==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { + "@inquirer/core": "^10.3.2", "@inquirer/search": "^3.2.2", "@zapier/policy-schema": "0.15.0", - "@zapier/zapier-sdk": "0.81.0", - "@zapier/zapier-sdk-mcp": "0.17.0", + "@zapier/zapier-sdk": "0.91.0", + "@zapier/zapier-sdk-mcp": "0.18.19", "chalk": "^5.3.0", "cli-table3": "^0.6.5", "commander": "^12.0.0", @@ -9258,7 +9298,6 @@ "esbuild": "^0.25.5", "express": "^5.1.0", "handlebars": "^4.7.8", - "ink": "7.0.5", "inquirer": "^12.6.3", "is-installed-globally": "^1.0.0", "jsonwebtoken": "^9.0.2", @@ -9267,7 +9306,6 @@ "package-json": "^10.0.1", "pkce-challenge": "^5.0.0", "proper-lockfile": "^4.1.2", - "react": "19.2.6", "semver": "^7.7.3", "typescript": "^5.8.3", "wrap-ansi": "^10.0.0", @@ -9280,23 +9318,44 @@ } }, "node_modules/@zapier/zapier-sdk-core": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk-core/-/zapier-sdk-core-0.12.0.tgz", - "integrity": "sha512-Nq0OHMVohOjWI862/iHXHMYGRvAsdkGdPrP2x63dLrozFcFnGe73IKEv+qjA6aynMEgKSzF4Ja+QckVY1edGHA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk-core/-/zapier-sdk-core-0.15.1.tgz", + "integrity": "sha512-W40zTWV0YhcqhkV0RoO2Vsf47rFPWCN7fnZq8IqM400Aj05hfpGbW/h3uzQHtGEnRmF+wm5C5SiMQlLZKKap8A==", "license": "SEE LICENSE IN LICENSE", "dependencies": { + "@zapier/policy-context": "1.1.1", "zod": "4.3.6" } }, + "node_modules/@zapier/zapier-sdk-core/node_modules/@zapier/policy-context": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@zapier/policy-context/-/policy-context-1.1.1.tgz", + "integrity": "sha512-DSFIUXRUZQLRxKZvvq84oANGTDLoXWdj6F8ZUI7O92CkCMhm9C/DZI1wf4j4s1va2cIUwEUFZW6xIT9b2LpZwg==", + "dependencies": { + "@asteasolutions/zod-to-openapi": "^8.5.0", + "@zapier/policy-schema": "0.12.0" + }, + "peerDependencies": { + "zod": "^4.0.0" + } + }, + "node_modules/@zapier/zapier-sdk-core/node_modules/@zapier/policy-schema": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@zapier/policy-schema/-/policy-schema-0.12.0.tgz", + "integrity": "sha512-dKfygnnzitobXJgzxLcAkiR/NTj0Lqzo9Rkfz3XNv7BHXTRzgBuO/EgvkPaNREvUyOT15h5zUpNy6dsJWJyRAA==", + "peerDependencies": { + "zod": "^4.0.0" + } + }, "node_modules/@zapier/zapier-sdk-mcp": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk-mcp/-/zapier-sdk-mcp-0.17.0.tgz", - "integrity": "sha512-fQIo61FYO/Wp0XEjXmdyzZWt4irVPTBd3NH3rTo//ouiq+31vWRiMWGoKiaczjzqQreaE3qBgheOfMYQYDvmtA==", + "version": "0.18.19", + "resolved": "https://registry.npmjs.org/@zapier/zapier-sdk-mcp/-/zapier-sdk-mcp-0.18.19.tgz", + "integrity": "sha512-/sKEVlpSQqHyyYxaTiSkz5mR0ebk42TLBaFVN1Xo6uMjYSSNB8dH685BTYvz9gD1FxstKEOROcNnFbxHLzs5Ww==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { "@modelcontextprotocol/sdk": "^1.17.3", - "@zapier/zapier-sdk": "0.81.0", + "@zapier/zapier-sdk": "0.91.0", "zod": "4.3.6" } }, @@ -9333,9 +9392,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -9354,12 +9413,12 @@ } }, "node_modules/adm-zip": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.18.tgz", - "integrity": "sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.6.0.tgz", + "integrity": "sha512-XleryMhbuksdKtofnWZ9Sk+4CUTbms4Mb/EU32SZwToAyZ5RgVos/ki8n+yr0LWHOGKuakbXTuuYNHLQjhddgg==", "license": "MIT", "engines": { - "node": ">=12.0" + "node": ">=14.0" } }, "node_modules/agent-base": { @@ -9387,18 +9446,17 @@ } }, "node_modules/ai": { - "version": "6.0.219", - "resolved": "https://registry.npmjs.org/ai/-/ai-6.0.219.tgz", - "integrity": "sha512-rtTDz99Rc9HsstSJ7YdO8DX7DQwS442N2vQ5jOopXDdo4qfkLrtIRpORdztFMOZxX/XjBzHRlvqF6eMg3cpyLA==", + "version": "7.0.40", + "resolved": "https://registry.npmjs.org/ai/-/ai-7.0.40.tgz", + "integrity": "sha512-Q113Nory1PNgWzo2X7x/bUnJhd95UPNEtWlv+nnM5bSuEkA9iy+VZ3WZFcOvGMZjNDQzD5sZnJgIKQjGh8lv9Q==", "license": "Apache-2.0", "dependencies": { - "@ai-sdk/gateway": "3.0.143", - "@ai-sdk/provider": "3.0.13", - "@ai-sdk/provider-utils": "4.0.35", - "@opentelemetry/api": "^1.9.0" + "@ai-sdk/gateway": "4.0.30", + "@ai-sdk/provider": "4.0.4", + "@ai-sdk/provider-utils": "5.0.14" }, "engines": { - "node": ">=18" + "node": ">=22" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" @@ -9438,9 +9496,9 @@ } }, "node_modules/anser": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/anser/-/anser-2.3.5.tgz", - "integrity": "sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==", + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", "license": "MIT" }, "node_modules/ansi-align": { @@ -9453,26 +9511,11 @@ "string-width": "^4.1.0" } }, - "node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9485,6 +9528,7 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9494,18 +9538,17 @@ } }, "node_modules/ansi-to-react": { - "version": "6.2.6", - "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-6.2.6.tgz", - "integrity": "sha512-Eqi0iaMK5OZ3jsVFxWvU2B74UZBnGuHlkflKMX6wTOeH+luy9KE2O0gUkc2PxhIP1R4IO0xohv62UMFInQOSeg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/ansi-to-react/-/ansi-to-react-6.1.6.tgz", + "integrity": "sha512-+HWn72GKydtupxX9TORBedqOMsJRiKTqaLUKW8txSBZw9iBpzPKLI8KOu4WzwD4R7hSv1zEspobY6LwlWvwZ6Q==", "license": "BSD-3-Clause", "dependencies": { - "anser": "^2.3.2", - "escape-carriage": "^1.3.1", - "linkify-it": "^3.0.3" + "anser": "^1.4.1", + "escape-carriage": "^1.3.0" }, "peerDependencies": { - "react": "^16.3.2 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.3.2 || ^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^16.3.2 || ^17.0.0", + "react-dom": "^16.3.2 || ^17.0.0" } }, "node_modules/arch": { @@ -9530,41 +9573,37 @@ "license": "MIT" }, "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-8.0.0.tgz", + "integrity": "sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==", "dev": true, "license": "MIT", "dependencies": { - "archiver-utils": "^5.0.2", "async": "^3.2.4", "buffer-crc32": "^1.0.0", + "is-stream": "^4.0.0", + "lazystream": "^1.0.0", + "normalize-path": "^3.0.0", "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", + "readdir-glob": "^3.0.0", "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" + "zip-stream": "^7.0.2" }, "engines": { - "node": ">= 14" + "node": ">=18" } }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "node_modules/archiver/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, "engines": { - "node": ">= 14" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/arg": { @@ -9670,23 +9709,10 @@ "when-exit": "^2.1.4" } }, - "node_modules/auto-bind": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", - "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/autoprefixer": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", - "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "dev": true, "funding": [ { @@ -9704,8 +9730,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.4", - "caniuse-lite": "^1.0.30001799", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -9758,10 +9784,13 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/bare-events": { "version": "2.9.1", @@ -9779,9 +9808,9 @@ } }, "node_modules/bare-fs": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.3.tgz", - "integrity": "sha512-xRgplks8SvcKkdlv2M6Z2LZmRsmqd+x0nXXGXeMEjwdibj1HSDrlnqBRLeYdMvsgCox7Bq0e+DHwfczOfsn6IA==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.4.tgz", + "integrity": "sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9803,25 +9832,12 @@ } } }, - "node_modules/bare-os": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.3.tgz", - "integrity": "sha512-fF4Q7QsyKVF5Rj0qvI8BgUNjqzC2JvQlpTaPLjVJVxYVUX5Zr9un+y3w1HmA4nNKdFmRBT8z/WmrjvXzXVerKQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "bare": ">=1.14.0" - } - }, "node_modules/bare-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz", - "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.1.tgz", + "integrity": "sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bare-os": "^3.0.1" - } + "license": "Apache-2.0" }, "node_modules/bare-stream": { "version": "2.13.3", @@ -9852,9 +9868,9 @@ } }, "node_modules/bare-url": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz", - "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.6.tgz", + "integrity": "sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9882,9 +9898,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.42", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.42.tgz", - "integrity": "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q==", + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.5.tgz", + "integrity": "sha512-xJo6a6YZnwZfnyGmQKWMbVOcii7XRibjOskRh+WJ9UHQoX16xrQrcIgAMQOzfvs8XiLMx6ih/fsLPF73iY2D1A==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -10077,19 +10093,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/boxen/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -10115,30 +10118,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10175,12 +10162,15 @@ } }, "node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/braces": { @@ -10197,9 +10187,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "devOptional": true, "funding": [ { @@ -10217,10 +10207,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -10365,9 +10355,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001800", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", - "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "funding": [ { "type": "opencollective", @@ -10514,9 +10504,9 @@ "license": "MIT" }, "node_modules/chat": { - "version": "4.32.0", - "resolved": "https://registry.npmjs.org/chat/-/chat-4.32.0.tgz", - "integrity": "sha512-0NlJcCLycTy8kytRsZEnW4Gzomm+SNh1Yg7y9GVYB5fTjyhOxCcnzqrythgXNn2dvv7VeihDIISpNU0WZdOKKg==", + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/chat/-/chat-4.35.0.tgz", + "integrity": "sha512-IUbdgTBvgs/XYhKcpKGrpmZgcl8KcA5NZ+eOww+0rBdhPf+95INjcUauQTk5e48UI1V4PRg9stToPsT4vle07g==", "license": "MIT", "dependencies": { "@workflow/serde": "4.1.0-beta.2", @@ -10531,13 +10521,17 @@ "node": ">=20" }, "peerDependencies": { - "ai": "^6.0.182", + "ai": "^6.0.182 || ^7.0.0", + "workflow": "^5.0.0-beta.35", "zod": "^3.0.0 || ^4.0.0" }, "peerDependenciesMeta": { "ai": { "optional": true }, + "workflow": { + "optional": true + }, "zod": { "optional": true } @@ -10557,6 +10551,12 @@ "chat": "^4.14.0" } }, + "node_modules/chat/node_modules/@workflow/serde": { + "version": "4.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0-beta.2.tgz", + "integrity": "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==", + "license": "Apache-2.0" + }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", @@ -10616,29 +10616,29 @@ "license": "MIT" }, "node_modules/cli-boxes": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-4.0.1.tgz", - "integrity": "sha512-5IOn+jcCEHEraYolBPs/sT4BxYCe2nHg374OPiItB1O96KZFseS2gthU4twyYzeDcFew4DaUM/xwc5BQf08JJw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, "license": "MIT", "engines": { - "node": ">=18.20 <19 || >=20.10" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10686,40 +10686,6 @@ "@colors/colors": "1.5.0" } }, - "node_modules/cli-truncate": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-6.1.0.tgz", - "integrity": "sha512-ofWtXdvPO1WepoE9Gn4dPdZw+ADud1Yz9K+xm9FjK5vvrs/D60vrlKIQeSw1wJX4cphW2bnWi8GZSKvf9T6shw==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^9.0.0", - "string-width": "^8.2.0" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", @@ -10843,6 +10809,22 @@ "node": ">=8" } }, + "node_modules/clipboardy/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clipboardy/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -10927,19 +10909,6 @@ "cnfast": "bin/cli.js" } }, - "node_modules/code-excerpt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", - "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-to-spaces": "^2.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/codemirror": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", @@ -11039,20 +11008,33 @@ } }, "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-7.0.1.tgz", + "integrity": "sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==", "dev": true, "license": "MIT", "dependencies": { "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", + "crc32-stream": "^7.0.1", + "is-stream": "^4.0.0", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=18" + } + }, + "node_modules/compress-commons/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/compressible": { @@ -11115,9 +11097,9 @@ } }, "node_modules/compromise": { - "version": "14.15.1", - "resolved": "https://registry.npmjs.org/compromise/-/compromise-14.15.1.tgz", - "integrity": "sha512-9F3UkUaEU1PPz2fgStkE/TI4tk++0wHxS8xfWq9PQWL/v28dy8bEcPVVSLh3dISIRD7PEhJ8YTzHRKF8y9tnLA==", + "version": "14.16.0", + "resolved": "https://registry.npmjs.org/compromise/-/compromise-14.16.0.tgz", + "integrity": "sha512-4DFYl/Hl7sW4XWUDfx9S5vxqyYKpZDwwqrpXsQv5acdbVP+joKceIcIaLb0lhVWUpDBV0OnExk/o/dnYUwXnhQ==", "license": "MIT", "dependencies": { "efrt": "2.7.0", @@ -11228,16 +11210,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/convert-to-spaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", - "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -11310,9 +11282,9 @@ } }, "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-7.0.1.tgz", + "integrity": "sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==", "dev": true, "license": "MIT", "dependencies": { @@ -11320,7 +11292,7 @@ "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=18" } }, "node_modules/crelt": { @@ -12274,24 +12246,24 @@ } }, "node_modules/discord.js": { - "version": "14.26.4", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.26.4.tgz", - "integrity": "sha512-4oBp8tc6Kf8IDBwAHhbsMaAqx1b5fob9SNasZT7V6yyyUydoO5i5fGuX7TmvRtR+q/WgKRnRViRoAWnG7fNyvA==", + "version": "14.27.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.27.0.tgz", + "integrity": "sha512-qHbFlFG2N7y3LjPySYsL6A1+BnX6bkTVgo842EX0CqVPk/KTMwZkojPHEXKsQUpWZNyz5BISNHK1cPpQw0+m4A==", "license": "Apache-2.0", "dependencies": { "@discordjs/builders": "^1.14.1", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.2", - "@discordjs/rest": "^2.6.1", + "@discordjs/rest": "^2.6.2", "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", - "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.40", + "@sapphire/snowflake": "3.5.5", + "discord-api-types": "^0.38.49", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", - "undici": "6.24.1" + "undici": "^6.27.0" }, "engines": { "node": ">=18" @@ -12301,18 +12273,18 @@ } }, "node_modules/discord.js/node_modules/discord-api-types": { - "version": "0.38.49", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.49.tgz", - "integrity": "sha512-XnqcWmnFZFAE8ZM8SHAw9DIV8D3Or00rMQ8iQLotrEA2PmXhl+ykaf6L6q4l474hrSUH1JaYcv+iOMRWp2p6Tg==", + "version": "0.38.52", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.52.tgz", + "integrity": "sha512-uwe9EKfbjsmgWc2fdFjvDbj+dQqx3lp7wqDCmIha0jInuU+xeQjkCK9tMMn+p7RXfdVQORCInq4cD3U2ymDmyg==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" ] }, "node_modules/discord.js/node_modules/undici": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz", - "integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "license": "MIT", "engines": { "node": ">=18.17" @@ -12326,9 +12298,9 @@ "license": "MIT" }, "node_modules/dompurify": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.11.tgz", - "integrity": "sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==", + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.12.tgz", + "integrity": "sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -12396,6 +12368,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, "license": "MIT" }, "node_modules/ecdsa-sig-formatter": { @@ -12423,9 +12396,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.387", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.387.tgz", - "integrity": "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ==", + "version": "1.5.397", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.397.tgz", + "integrity": "sha512-khGTy9U9x02KEtsKM8vx5A62BsRmcOsIgDpWr1ImE32Ax8GxHGPHZf+Eu9H8zOOyHJnB0jTbseyTHbq2XCT8yw==", "devOptional": true, "license": "ISC" }, @@ -12461,6 +12434,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "devOptional": true, "license": "MIT" }, "node_modules/empathic": { @@ -12514,9 +12488,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12553,19 +12527,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -12585,9 +12546,9 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true, "license": "MIT" }, @@ -12619,13 +12580,14 @@ } }, "node_modules/es-toolkit": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", - "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==", + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz", + "integrity": "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w==", "license": "MIT", "workspaces": [ "docs", - "benchmarks" + "benchmarks", + "tests/types" ] }, "node_modules/esast-util-from-estree": { @@ -13027,11 +12989,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz", - "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==", + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", "license": "MIT", "dependencies": { + "debug": "^4.4.3", "ip-address": "^10.2.0" }, "engines": { @@ -13045,9 +13008,9 @@ } }, "node_modules/exsolve": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", - "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", "devOptional": true, "license": "MIT" }, @@ -13070,9 +13033,9 @@ } }, "node_modules/fast-copy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.3.tgz", - "integrity": "sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-4.0.4.tgz", + "integrity": "sha512-eVAiWVNPSEGIzDl5yPuLrx8fNMogScXvD9xp1Kzd41FjRIz2I3sSIcxsFeM5EzFfHAfobdvs8ZySffUopljvIA==", "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -13129,9 +13092,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", "funding": [ { "type": "github", @@ -13298,9 +13261,9 @@ } }, "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", "dev": true, "license": "ISC" }, @@ -13324,22 +13287,6 @@ } } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", @@ -13522,9 +13469,9 @@ } }, "node_modules/fumadocs-core": { - "version": "16.10.7", - "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.10.7.tgz", - "integrity": "sha512-lR1hDOtJ8ubsLKYH2VMkp+iVZTDdOiMh4StFaWtuTvy8Wfnngz0YSHeFijmm2K+4lg2DLXLMuCEHQ6my54g2Eg==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.13.0.tgz", + "integrity": "sha512-J+XhngvMn+tKCrk3MyZzE0xMECCJUjSfRtGTKKP4lP8Py8lXGhgnRMuc+yUip2eCdUIs2+maYyeYEgAFIGHMtA==", "license": "MIT", "dependencies": { "@orama/orama": "^3.1.18", @@ -13532,18 +13479,19 @@ "github-slugger": "^2.0.0", "hast-util-to-estree": "^3.1.3", "hast-util-to-jsx-runtime": "^2.3.6", - "js-yaml": "^5.1.0", "mdast-util-mdx": "^3.0.0", "mdast-util-to-markdown": "^2.1.2", + "npm-to-yarn": "3.1.0", "remark": "^15.0.1", "remark-gfm": "^4.0.1", "remark-rehype": "^11.1.2", "scroll-into-view-if-needed": "^3.1.0", - "shiki": "^4.2.0", + "shiki": "^4.3.1", "tinyglobby": "^0.2.17", "unified": "^11.0.5", "unist-util-visit": "^5.1.0", - "vfile": "^6.0.3" + "vfile": "^6.0.3", + "yaml": "^2.9.0" }, "peerDependencies": { "@mdx-js/mdx": "*", @@ -13782,28 +13730,6 @@ } } }, - "node_modules/fumadocs-mdx/node_modules/js-yaml": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", - "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/nodeca" - } - ], - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/fumadocs-mdx/node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", @@ -13817,47 +13743,44 @@ } }, "node_modules/fumadocs-ui": { - "version": "16.10.7", - "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.10.7.tgz", - "integrity": "sha512-zE93/DKW5bhedXRKHYg3rhE/juYi+kXx1xl3ey1dArWbCiPx6lq6/4RLswYXS0lQp1W1f8NsbY1TeA8wSQuEvw==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.13.0.tgz", + "integrity": "sha512-kaULXwY9W0MYEKzFCeDjCX9XW3ABDmsabdYWAFPp2jncH9BO+9xgI/t8OWkTIVngyT5PAMvTJphjMxCSTeIVRQ==", "license": "MIT", "dependencies": { "@fuma-translate/react": "^1.0.2", - "@fumadocs/tailwind": "0.0.5", - "@radix-ui/react-accordion": "^1.2.14", - "@radix-ui/react-collapsible": "^1.1.14", - "@radix-ui/react-dialog": "^1.1.17", + "@fumadocs/tailwind": "0.1.1", + "@radix-ui/react-accordion": "^1.2.17", + "@radix-ui/react-collapsible": "^1.1.17", + "@radix-ui/react-dialog": "^1.1.20", "@radix-ui/react-direction": "^1.1.2", - "@radix-ui/react-navigation-menu": "^1.2.16", - "@radix-ui/react-popover": "^1.1.17", - "@radix-ui/react-presence": "^1.1.6", - "@radix-ui/react-scroll-area": "^1.2.12", + "@radix-ui/react-navigation-menu": "^1.2.19", + "@radix-ui/react-popover": "^1.1.20", + "@radix-ui/react-presence": "^1.1.8", + "@radix-ui/react-scroll-area": "^1.2.15", "@radix-ui/react-slot": "^1.3.0", - "@radix-ui/react-tabs": "^1.1.15", + "@radix-ui/react-tabs": "^1.1.18", "class-variance-authority": "^0.7.1", "cnfast": "^0.0.8", - "lucide-react": "^1.21.0", - "motion": "^12.41.0", + "lucide-react": "^1.25.0", + "motion": "^12.42.2", "next-themes": "^0.4.6", "react-remove-scroll": "^2.7.2", "rehype-raw": "^7.0.0", "scroll-into-view-if-needed": "^3.1.0", - "shiki": "^4.2.0", + "shiki": "^4.3.1", "unist-util-visit": "^5.1.0" }, "peerDependencies": { - "@takumi-rs/image-response": "*", "@types/mdx": "*", "@types/react": "*", - "fumadocs-core": "16.10.7", + "fumadocs-core": "16.13.0", "next": "16.x.x", "react": "^19.2.0", - "react-dom": "^19.2.0" + "react-dom": "^19.2.0", + "takumi-js": "*" }, "peerDependenciesMeta": { - "@takumi-rs/image-response": { - "optional": true - }, "@types/mdx": { "optional": true }, @@ -13866,6 +13789,9 @@ }, "next": { "optional": true + }, + "takumi-js": { + "optional": true } } }, @@ -14033,9 +13959,9 @@ } }, "node_modules/gcp-metadata": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.3.tgz", - "integrity": "sha512-ziTrzUhhpL9Zk5k0HHzgP/KIpWDJT0VMBC/ynt/QIBvTW+UUcSivQRl6VlwTf/EilDxtSWklHoRsKy1c4k+59w==", + "version": "8.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.4.tgz", + "integrity": "sha512-iJ9KMsiu+xKtNRX0PmGLSaIU3bUBAyzWTyqKemKPzNPsmmsBCQYmlNg+brEbES7IHSXtdVwzBPzx1vz3FAaipw==", "license": "Apache-2.0", "dependencies": { "gaxios": "7.1.3", @@ -14052,6 +13978,15 @@ "integrity": "sha512-UhzJL4KXSdqAKepy/tZwmi2Rcy0YMmtiC4DQS4SURCuIWdh8ECZtnXK2ePRMLigfB61hRKdLK/Vgg2bSw73izQ==", "license": "MIT" }, + "node_modules/geist": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/geist/-/geist-1.7.2.tgz", + "integrity": "sha512-Gu5lDFa3pLRyoBlBPf0QIFHVdWAnpco7fS1bJm41jyLPFoguBgiubseUN2oLXMgqZ7uxAxDoXcHMhCY/fOTTgg==", + "license": "SIL OPEN FONT LICENSE", + "peerDependencies": { + "next": ">=13.2.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -14188,21 +14123,17 @@ "license": "ISC" }, "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -14296,9 +14227,9 @@ } }, "node_modules/googleapis-common": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.2.tgz", - "integrity": "sha512-5MXeQzIZaqCH7B+HJWqhQm946VARpZep6acbWSr/fcgF2cQANq7allgX+i/G0EqF0WyUxB277gtWMzRYHMl9tg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.3.tgz", + "integrity": "sha512-7g1yzQKx0mmNTjiK0H9dJ8eqKqDBveES9vLHeg5neb3BMQy/d1oQefIMhIpOVT8a+f+LOcixMEdRbFIW/cQUJw==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -14309,7 +14240,7 @@ "url-template": "^2.0.8" }, "engines": { - "node": ">=18.0.0" + "node": ">=18" } }, "node_modules/gopd": { @@ -14811,9 +14742,9 @@ "license": "MIT" }, "node_modules/hono": { - "version": "4.12.27", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz", - "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==", + "version": "4.12.32", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", + "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -14966,9 +14897,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "license": "MIT", "engines": { "node": ">= 4" @@ -14987,9 +14918,9 @@ } }, "node_modules/immer": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.11.tgz", - "integrity": "sha512-qzXuyXAkPySAGYkfsAwodDPWT8Zm7/Uo5BNt4BjhMhG5WlWyZZ4wQqnWwdS8kjlQ1Cwu6gjw3A6+0gTQwlyYtw==", + "version": "11.1.15", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.15.tgz", + "integrity": "sha512-VrNANlmnWQnh5COXIIOQXM9oOJw7naGKlBT74ZOOR6lpVXc3gFEu9FJLDFcpCJ2j+NWr8TIwtWD//T6ZX6TKiQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -15007,16 +14938,13 @@ } }, "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/inherits": { @@ -15029,100 +14957,10 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ink": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ink/-/ink-7.0.5.tgz", - "integrity": "sha512-zWNjGHQPxSeiSAmDUOq+QPQ6CfmMhmNi85vrJIuy4prafKKUSoZlXEy4wbM7LuLuF1pDURk7qvF4fxrQlLxv3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alcalzone/ansi-tokenize": "^0.3.0", - "ansi-escapes": "^7.3.0", - "ansi-styles": "^6.2.3", - "auto-bind": "^5.0.1", - "chalk": "^5.6.2", - "cli-boxes": "^4.0.1", - "cli-cursor": "^4.0.0", - "cli-truncate": "^6.0.0", - "code-excerpt": "^4.0.0", - "es-toolkit": "^1.45.1", - "indent-string": "^5.0.0", - "is-in-ci": "^2.0.0", - "patch-console": "^2.0.0", - "react-reconciler": "^0.33.0", - "scheduler": "^0.27.0", - "signal-exit": "^3.0.7", - "slice-ansi": "^9.0.0", - "stack-utils": "^2.0.6", - "string-width": "^8.2.0", - "terminal-size": "^4.0.1", - "type-fest": "^5.5.0", - "widest-line": "^6.0.0", - "wrap-ansi": "^10.0.0", - "ws": "^8.20.0", - "yoga-layout": "~3.2.1" - }, - "engines": { - "node": ">=22" - }, - "peerDependencies": { - "@types/react": ">=19.2.0", - "react": ">=19.2.0", - "react-devtools-core": ">=6.1.2" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-devtools-core": { - "optional": true - } - } - }, - "node_modules/ink/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ink/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ink/node_modules/type-fest": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", - "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "dependencies": { - "tagged-tag": "^1.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/inline-style-parser": { @@ -15178,9 +15016,9 @@ } }, "node_modules/ip-address": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", - "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", + "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", "license": "MIT", "engines": { "node": ">= 12" @@ -15287,19 +15125,13 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true, "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/is-glob": { @@ -15325,22 +15157,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-in-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", - "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", - "dev": true, - "license": "MIT", - "bin": { - "is-in-ci": "cli.js" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", @@ -15533,21 +15349,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", @@ -15559,9 +15360,9 @@ } }, "node_modules/jose": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", - "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz", + "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -15576,6 +15377,12 @@ "node": ">=10" } }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, "node_modules/js-tiktoken": { "version": "1.0.21", "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", @@ -15586,16 +15393,16 @@ } }, "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", "devOptional": true, "license": "MIT" }, "node_modules/js-yaml": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.2.1.tgz", - "integrity": "sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", "funding": [ { "type": "github", @@ -15611,7 +15418,7 @@ "argparse": "^2.0.1" }, "bin": { - "js-yaml": "bin/js-yaml.mjs" + "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsdom": { @@ -15725,9 +15532,9 @@ } }, "node_modules/json-with-bigint": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.8.tgz", - "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", + "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", "license": "MIT" }, "node_modules/json5": { @@ -16251,12 +16058,22 @@ "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/local-pkg": { @@ -16415,9 +16232,9 @@ } }, "node_modules/lru-cache": { - "version": "11.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", - "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -16452,18 +16269,18 @@ "license": "ISC" }, "node_modules/lucide-react": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.23.0.tgz", - "integrity": "sha512-38BpJcD0JhFosxHApP/BYsBetLpQFRoTRzEzstM/XCc3jsAG7wqaY1lgVwxiUe3xqYE+lNxo2PkCmYwXWrwwIw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.27.0.tgz", + "integrity": "sha512-rJicGl/3Fly/E0rOH1YmPZ6e49JCnKknh1ox1vpHnkfjujAkKA6sqUZvH3MTAaXXjgexyUwgNwTJzTtYuAFYJw==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/magic-bytes.js": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.13.0.tgz", - "integrity": "sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.13.1.tgz", + "integrity": "sha512-x5sn4UX2k5gCWlcfmoFwG4TPie8+dctESyqOBdhB5p6MsgWXdBKGmt9nXPObj/JI50TTL928lc5Yt1WntMn1bw==", "license": "MIT" }, "node_modules/magic-string": { @@ -16527,31 +16344,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/markdown-it/node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/puzrin" - }, - { - "type": "github", - "url": "https://github.com/sponsors/markdown-it" - } - ], - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/markdown-it/node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" - }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -16575,34 +16367,34 @@ } }, "node_modules/mastra": { - "version": "1.12.3-alpha.3", - "resolved": "https://registry.npmjs.org/mastra/-/mastra-1.12.3-alpha.3.tgz", - "integrity": "sha512-IsYnqvnE7inOEYmEXIvuc9LrjvJw1rRFoNvBUxYn37reogaUJndWbcTYhgluF3W7odmIBEhqwP2pMnzW2lcVzA==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/mastra/-/mastra-1.20.2.tgz", + "integrity": "sha512-cNbA/uUQXZaw0W+VrArh04PFrIYlOgwsJXWsNZ5GA3nKNWVDSqRvRhP1VTfF1BckFJ1N2M7Tarf3U7Fz4IYyng==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@clack/prompts": "^1.1.0", + "@babel/parser": "^8.0.4", + "@babel/types": "^8.0.4", + "@clack/prompts": "^1.7.0", "@expo/devcert": "^1.2.1", - "@mastra/deployer": "^1.42.0-alpha.3", - "@mastra/loggers": "^1.1.2", - "archiver": "^7.0.1", + "@mastra/deployer": "^1.53.0", + "@mastra/loggers": "^1.2.0", + "archiver": "^8.0.0", "commander": "^14.0.3", "dotenv": "^17.3.1", "execa": "^9.6.1", - "fs-extra": "^11.3.4", + "fs-extra": "^11.3.5", "get-port": "^7.1.0", "local-pkg": "^1.1.2", "openapi-fetch": "^0.17.0", "picocolors": "^1.1.1", - "posthog-node": "^5.30.6", + "posthog-node": "^5.37.0", "semver": "^7.7.4", "serve": "^14.2.6", "serve-handler": "^6.1.7", "shell-quote": "^1.8.3", "strip-json-comments": "^5.0.3", - "tinyglobby": "^0.2.16", + "tinyglobby": "^0.2.17", "yocto-spinner": "^1.1.0" }, "bin": { @@ -16612,7 +16404,7 @@ "node": ">=22.13.0" }, "peerDependencies": { - "@mastra/core": ">=1.34.0-0 <2.0.0-0" + "@mastra/core": ">=1.50.0-0 <2.0.0-0" } }, "node_modules/mastra/node_modules/commander": { @@ -16626,9 +16418,9 @@ } }, "node_modules/mastra/node_modules/fs-extra": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", - "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", "dev": true, "license": "MIT", "dependencies": { @@ -17048,18 +16840,22 @@ "license": "CC0-1.0" }, "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", "license": "MIT" }, "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", "license": "MIT", "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/meow": { @@ -18049,15 +17845,15 @@ } }, "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -18188,9 +17984,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "funding": [ { "type": "github", @@ -18267,12 +18063,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.10.tgz", - "integrity": "sha512-2som5AVXb3kE6Yjine3/mNbBayYF58eguBWIVVUdr1y/L426xyVEgYxgBG+1QC34P2x5E+tcDup6XkuOAX3dCA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.12.tgz", + "integrity": "sha512-iD59eYQWmbFcEbX7v/acG5DRym9iw1DdaPoD0WTA920naWsE25wShzJW4+UvAs8MK9EC2kBfIH6vtto1H1PHGw==", "license": "MIT", "dependencies": { - "@next/env": "16.2.10", + "@next/env": "16.2.12", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", @@ -18286,14 +18082,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.10", - "@next/swc-darwin-x64": "16.2.10", - "@next/swc-linux-arm64-gnu": "16.2.10", - "@next/swc-linux-arm64-musl": "16.2.10", - "@next/swc-linux-x64-gnu": "16.2.10", - "@next/swc-linux-x64-musl": "16.2.10", - "@next/swc-win32-arm64-msvc": "16.2.10", - "@next/swc-win32-x64-msvc": "16.2.10", + "@next/swc-darwin-arm64": "16.2.12", + "@next/swc-darwin-x64": "16.2.12", + "@next/swc-linux-arm64-gnu": "16.2.12", + "@next/swc-linux-arm64-musl": "16.2.12", + "@next/swc-linux-x64-gnu": "16.2.12", + "@next/swc-linux-x64-musl": "16.2.12", + "@next/swc-win32-arm64-msvc": "16.2.12", + "@next/swc-win32-x64-msvc": "16.2.12", "sharp": "^0.34.5" }, "peerDependencies": { @@ -18414,9 +18210,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.50.tgz", - "integrity": "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "devOptional": true, "license": "MIT", "engines": { @@ -18470,6 +18266,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-to-yarn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-3.1.0.tgz", + "integrity": "sha512-9gNsO/JB3LeWOZXBX09cKMsCPwVcu1ExIf+GUuTN9G+0zZvLIK0nU9+lE9jue3MSKAxPdrh0rO072mWNvciqeQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/nebrelbug/npm-to-yarn?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -18501,10 +18309,10 @@ } }, "node_modules/obug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", - "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", - "dev": true, + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", + "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==", + "devOptional": true, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" @@ -18555,16 +18363,16 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -18630,9 +18438,9 @@ } }, "node_modules/openai": { - "version": "6.45.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.45.0.tgz", - "integrity": "sha512-5DQVNErssk0afNpTTHUm/qZPU4iKR9OYdNid8Ib4puq4gHNNvGWZht2zY4h9a8JMF949Ik6m8gQutllVPbjdnw==", + "version": "6.49.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.49.0.tgz", + "integrity": "sha512-aYCc0C6L864eR6WSYIwQGyXriw/nIyZx0ObvhzOEVuk0zoBDpynjSbrionWI7q65B5H8jJX0DXR9snEzM6bfPg==", "license": "Apache-2.0", "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", @@ -18676,6 +18484,15 @@ "dev": true, "license": "MIT" }, + "node_modules/openapi3-ts": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.6.0.tgz", + "integrity": "sha512-a4sfn6L2sIShhtzJqmjGrARvxAW/3F2BJDdyRVvNF9VhAsZSh5hSyI3a9TNvmzBxXmq66nY5LNT5bQcBxYAZZg==", + "license": "MIT", + "dependencies": { + "yaml": "^2.9.0" + } + }, "node_modules/ora": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", @@ -18700,22 +18517,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora/node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -18723,39 +18524,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ora/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -18790,9 +18558,9 @@ } }, "node_modules/p-map": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.5.tgz", - "integrity": "sha512-e8vJF4XdVkzqqSHguEMz41mQO1wKwxKm5ENrUJQUu9kLDCtn83cxbyHZcszr4QC5zEA7WffRRC4gsTecC7J9oA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "license": "MIT", "engines": { "node": ">=18" @@ -18876,9 +18644,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/package-manager-detector": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz", - "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", "license": "MIT" }, "node_modules/papaparse": { @@ -18946,16 +18714,6 @@ "node": ">= 0.8" } }, - "node_modules/patch-console": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", - "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/patch-package": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", @@ -19095,27 +18853,21 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, "node_modules/path-to-regexp": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", @@ -19130,6 +18882,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "devOptional": true, "license": "MIT" }, "node_modules/pg": { @@ -19335,35 +19088,35 @@ } }, "node_modules/playwright": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", - "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.0.tgz", + "integrity": "sha512-Z14dG305dgaLu6foB1TXQagFiW8JfSUIUaUuPaKQ6NtBPKF1P/qXcqfh6c6K/icPqdy37JmjbiBXf6JNg6Sylw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.61.1" + "playwright-core": "1.62.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", - "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.0.tgz", + "integrity": "sha512-nsNRyq0r2zsG8AcRHWknc9QRA5XCueC7gWMrs+Gx2tlZn9hcl8zudfh00lhJPY1DE7NmZ6bDsT9g2yey8mXljA==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/points-on-curve": { @@ -19383,9 +19136,9 @@ } }, "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "funding": [ { "type": "opencollective", @@ -19402,7 +19155,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -19457,12 +19210,12 @@ } }, "node_modules/posthog-node": { - "version": "5.39.4", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.39.4.tgz", - "integrity": "sha512-+fCQ7htBFRQQFbIzl1T0TA7bDwYyaB9XP308ZFMCUoB5LzTzOFxBa6TYVrxdH/VQl43WXTp6sf0QsG2Z4XlNBg==", + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.46.1.tgz", + "integrity": "sha512-WjCqExq44pBdyg9MSsH6UAE0tNZ88p4aIuVFicgqhjf2Fbws6IhS4ioYUa4aBrbUPS9EDRXtBTtF5DpP1ml8Pw==", "license": "MIT", "dependencies": { - "@posthog/core": "^1.39.5" + "@posthog/core": "^1.45.1" }, "engines": { "node": "^20.20.0 || >=22.22.0" @@ -19623,9 +19376,9 @@ } }, "node_modules/prosemirror-dropcursor": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", - "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.3.tgz", + "integrity": "sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -19695,9 +19448,9 @@ } }, "node_modules/prosemirror-markdown": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.4.tgz", - "integrity": "sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.5.tgz", + "integrity": "sha512-ac8trNQ01ybKDRTcfUc56LZufG3oYyU4N25qSXgp8dS0U4JtzzCj7oQlKu5v09VSmS5IseYoQ2yDkTbo7f7D8Q==", "license": "MIT", "dependencies": { "@types/markdown-it": "^14.0.0", @@ -19718,9 +19471,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.25.9", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.9.tgz", - "integrity": "sha512-pRTklkDDMMRopyoAcrr9wV/8g/RYgrLHBuJAb5hlEuYZRdm5yqmPjWId83fpBwPpSFqEdja0H7Dfd7z1X/npcA==", + "version": "1.25.11", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.11.tgz", + "integrity": "sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" @@ -19767,9 +19520,9 @@ } }, "node_modules/prosemirror-view": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.0.tgz", - "integrity": "sha512-N54DF3OXNWDuP81G1kbfCys8ZzIjuL1VnvJ2mk5STSu/fNxWIcX/EutQLA3s9KR/2wVhgDi4hzBB/1fINVxk0A==", + "version": "1.42.2", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.2.tgz", + "integrity": "sha512-Pdg0l5kXm8aLDquFAnQFTCITg0q44sLqBlHlpsVLD9segdOao8TOfQdAhCrCXyVgPSRr6UDDROOIWA3bIrN9YQ==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.25.8", @@ -19836,9 +19589,9 @@ } }, "node_modules/pusher-js": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.5.0.tgz", - "integrity": "sha512-V7uzGi9bqOOOyM/6IkJdpFyjGZj7llz1v0oWnYkZKcYLvbz6VcHVLmzKqkvegjuMumpfIEKGLmWHwFb39XFCpw==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/pusher-js/-/pusher-js-8.6.0.tgz", + "integrity": "sha512-wShJPfCS/kYkCBVzVW67wa9cnQIgHTszEK2XHNrFkOgGruuGw081aERAxfRjfdFU+WcIt8x6dvbwkTW4iZuQ8Q==", "license": "MIT", "dependencies": { "tweetnacl": "^1.0.3" @@ -19877,6 +19630,15 @@ ], "license": "MIT" }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -19905,66 +19667,66 @@ "license": "MIT" }, "node_modules/radix-ui": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.1.tgz", - "integrity": "sha512-QXDXJtB6sK83mLASONYUZCauatcWb+knFviFpN1EhtdbbmlsRmzCLrbZSKztnNiem2KOHIBbiDbauVB7SORXMw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.4", - "@radix-ui/react-accessible-icon": "1.1.11", - "@radix-ui/react-accordion": "1.2.15", - "@radix-ui/react-alert-dialog": "1.1.18", - "@radix-ui/react-arrow": "1.1.11", - "@radix-ui/react-aspect-ratio": "1.1.11", - "@radix-ui/react-avatar": "1.2.1", - "@radix-ui/react-checkbox": "1.3.6", - "@radix-ui/react-collapsible": "1.1.15", - "@radix-ui/react-collection": "1.1.11", - "@radix-ui/react-compose-refs": "1.1.3", - "@radix-ui/react-context": "1.1.4", - "@radix-ui/react-context-menu": "2.3.2", - "@radix-ui/react-dialog": "1.1.18", - "@radix-ui/react-direction": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.14", - "@radix-ui/react-dropdown-menu": "2.1.19", - "@radix-ui/react-focus-guards": "1.1.4", - "@radix-ui/react-focus-scope": "1.1.11", - "@radix-ui/react-form": "0.1.11", - "@radix-ui/react-hover-card": "1.1.18", - "@radix-ui/react-label": "2.1.11", - "@radix-ui/react-menu": "2.1.19", - "@radix-ui/react-menubar": "1.1.19", - "@radix-ui/react-navigation-menu": "1.2.17", - "@radix-ui/react-one-time-password-field": "0.1.11", - "@radix-ui/react-password-toggle-field": "0.1.6", - "@radix-ui/react-popover": "1.1.18", - "@radix-ui/react-popper": "1.3.2", - "@radix-ui/react-portal": "1.1.13", - "@radix-ui/react-presence": "1.1.6", - "@radix-ui/react-primitive": "2.1.7", - "@radix-ui/react-progress": "1.1.11", - "@radix-ui/react-radio-group": "1.4.2", - "@radix-ui/react-roving-focus": "1.1.14", - "@radix-ui/react-scroll-area": "1.2.13", - "@radix-ui/react-select": "2.3.2", - "@radix-ui/react-separator": "1.1.11", - "@radix-ui/react-slider": "1.4.2", - "@radix-ui/react-slot": "1.3.0", - "@radix-ui/react-switch": "1.3.2", - "@radix-ui/react-tabs": "1.1.16", - "@radix-ui/react-toast": "1.2.18", - "@radix-ui/react-toggle": "1.1.13", - "@radix-ui/react-toggle-group": "1.1.14", - "@radix-ui/react-toolbar": "1.1.14", - "@radix-ui/react-tooltip": "1.2.11", - "@radix-ui/react-use-callback-ref": "1.1.2", - "@radix-ui/react-use-controllable-state": "1.2.3", - "@radix-ui/react-use-effect-event": "0.0.3", - "@radix-ui/react-use-escape-keydown": "1.1.3", - "@radix-ui/react-use-is-hydrated": "0.1.1", - "@radix-ui/react-use-layout-effect": "1.1.2", - "@radix-ui/react-use-size": "1.1.2", - "@radix-ui/react-visually-hidden": "1.2.7" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.7.tgz", + "integrity": "sha512-QBdhh1arIEUvPC0dQ5+nwWAxt7+N+oP/9jPwjJkGFoSk/sqxg32gJtSXGtFh8frAIcS6oC9cx2Q+7KYCQLOAeA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-accessible-icon": "1.1.15", + "@radix-ui/react-accordion": "1.2.20", + "@radix-ui/react-alert-dialog": "1.1.23", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-aspect-ratio": "1.1.15", + "@radix-ui/react-avatar": "1.2.6", + "@radix-ui/react-checkbox": "1.3.11", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-context-menu": "2.3.7", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-dropdown-menu": "2.1.24", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-form": "0.1.16", + "@radix-ui/react-hover-card": "1.1.23", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-menubar": "1.1.24", + "@radix-ui/react-navigation-menu": "1.2.22", + "@radix-ui/react-one-time-password-field": "0.1.16", + "@radix-ui/react-password-toggle-field": "0.1.11", + "@radix-ui/react-popover": "1.1.23", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-progress": "1.1.16", + "@radix-ui/react-radio-group": "1.4.7", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-scroll-area": "1.2.18", + "@radix-ui/react-select": "2.3.7", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-slider": "1.4.7", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-switch": "1.3.7", + "@radix-ui/react-tabs": "1.1.21", + "@radix-ui/react-toast": "1.2.23", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-toggle-group": "1.1.19", + "@radix-ui/react-toolbar": "1.1.19", + "@radix-ui/react-tooltip": "1.2.16", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-escape-keydown": "1.1.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" }, "peerDependencies": { "@types/react": "*", @@ -20033,9 +19795,9 @@ "license": "ISC" }, "node_modules/react": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", - "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -20081,39 +19843,23 @@ } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.7" + "react": "^19.2.8" } }, "node_modules/react-is": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", - "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", "license": "MIT" }, - "node_modules/react-reconciler": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", - "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^19.2.0" - } - }, "node_modules/react-redux": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", @@ -20185,9 +19931,9 @@ } }, "node_modules/react-resizable-panels": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.12.1.tgz", - "integrity": "sha512-ElE/UpOvMLRWtAqbCgyizHXcbws8RPMyN3cBqmdY17Nxr5f01+DEwzOLqhgcy68GSnjtIUFgKWKl8aIgx5aypQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-4.12.2.tgz", + "integrity": "sha512-NwY5LCo4WrxVvDh0xoMML6EMLPONP/8ckKcIdpnojxexoatZdjLiRqLJQjQK5CPkd4SYiB/2M5BVrjZBQtOO7Q==", "license": "MIT", "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -20234,26 +19980,19 @@ } }, "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-3.0.0.tgz", + "integrity": "sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "minimatch": "^10.2.2" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/yqnn" } }, "node_modules/readdirp": { @@ -20279,9 +20018,9 @@ } }, "node_modules/recharts": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.2.tgz", - "integrity": "sha512-G4fy+Pk46RaXgwWMh+Nzhyo/lbFAVqXo9gtetlyehe6Ehge9CsgDuOTwQDD+i1+llaLktNBiNq4bhnGlDRXFtw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.10.1.tgz", + "integrity": "sha512-QXFrvt6IVcw7eeZCoyXTwkIJAX3Dv1nyVhMicXJ47GsGDDpcN8z6o644DibE9XjpBTThtsomLKnTV6lc+cVFUA==", "license": "MIT", "workspaces": [ "www" @@ -20389,16 +20128,6 @@ "node": ">=8" } }, - "node_modules/redent/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -20765,28 +20494,21 @@ } }, "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/retry": { "version": "0.12.0", @@ -20809,16 +20531,20 @@ } }, "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^10.3.7" + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -20830,13 +20556,13 @@ "license": "Unlicense" }, "node_modules/rolldown": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.4.tgz", - "integrity": "sha512-IjZYiLxZwpnhwhdBH2ugdTGVSdhCQUmLxLoqyjiL0JxYjyRst+5a0P3xfrTxJ5F638j4Mvvw5FAX5XE6eHpXbA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.138.0", + "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -20846,27 +20572,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.1.4", - "@rolldown/binding-darwin-arm64": "1.1.4", - "@rolldown/binding-darwin-x64": "1.1.4", - "@rolldown/binding-freebsd-x64": "1.1.4", - "@rolldown/binding-linux-arm-gnueabihf": "1.1.4", - "@rolldown/binding-linux-arm64-gnu": "1.1.4", - "@rolldown/binding-linux-arm64-musl": "1.1.4", - "@rolldown/binding-linux-ppc64-gnu": "1.1.4", - "@rolldown/binding-linux-s390x-gnu": "1.1.4", - "@rolldown/binding-linux-x64-gnu": "1.1.4", - "@rolldown/binding-linux-x64-musl": "1.1.4", - "@rolldown/binding-openharmony-arm64": "1.1.4", - "@rolldown/binding-wasm32-wasi": "1.1.4", - "@rolldown/binding-win32-arm64-msvc": "1.1.4", - "@rolldown/binding-win32-x64-msvc": "1.1.4" + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" } }, "node_modules/rollup": { - "version": "4.62.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", - "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "version": "4.62.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.3.tgz", + "integrity": "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q==", "devOptional": true, "license": "MIT", "dependencies": { @@ -20880,31 +20606,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.62.2", - "@rollup/rollup-android-arm64": "4.62.2", - "@rollup/rollup-darwin-arm64": "4.62.2", - "@rollup/rollup-darwin-x64": "4.62.2", - "@rollup/rollup-freebsd-arm64": "4.62.2", - "@rollup/rollup-freebsd-x64": "4.62.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", - "@rollup/rollup-linux-arm-musleabihf": "4.62.2", - "@rollup/rollup-linux-arm64-gnu": "4.62.2", - "@rollup/rollup-linux-arm64-musl": "4.62.2", - "@rollup/rollup-linux-loong64-gnu": "4.62.2", - "@rollup/rollup-linux-loong64-musl": "4.62.2", - "@rollup/rollup-linux-ppc64-gnu": "4.62.2", - "@rollup/rollup-linux-ppc64-musl": "4.62.2", - "@rollup/rollup-linux-riscv64-gnu": "4.62.2", - "@rollup/rollup-linux-riscv64-musl": "4.62.2", - "@rollup/rollup-linux-s390x-gnu": "4.62.2", - "@rollup/rollup-linux-x64-gnu": "4.62.2", - "@rollup/rollup-linux-x64-musl": "4.62.2", - "@rollup/rollup-openbsd-x64": "4.62.2", - "@rollup/rollup-openharmony-arm64": "4.62.2", - "@rollup/rollup-win32-arm64-msvc": "4.62.2", - "@rollup/rollup-win32-ia32-msvc": "4.62.2", - "@rollup/rollup-win32-x64-gnu": "4.62.2", - "@rollup/rollup-win32-x64-msvc": "4.62.2", + "@rollup/rollup-android-arm-eabi": "4.62.3", + "@rollup/rollup-android-arm64": "4.62.3", + "@rollup/rollup-darwin-arm64": "4.62.3", + "@rollup/rollup-darwin-x64": "4.62.3", + "@rollup/rollup-freebsd-arm64": "4.62.3", + "@rollup/rollup-freebsd-x64": "4.62.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", + "@rollup/rollup-linux-arm-musleabihf": "4.62.3", + "@rollup/rollup-linux-arm64-gnu": "4.62.3", + "@rollup/rollup-linux-arm64-musl": "4.62.3", + "@rollup/rollup-linux-loong64-gnu": "4.62.3", + "@rollup/rollup-linux-loong64-musl": "4.62.3", + "@rollup/rollup-linux-ppc64-gnu": "4.62.3", + "@rollup/rollup-linux-ppc64-musl": "4.62.3", + "@rollup/rollup-linux-riscv64-gnu": "4.62.3", + "@rollup/rollup-linux-riscv64-musl": "4.62.3", + "@rollup/rollup-linux-s390x-gnu": "4.62.3", + "@rollup/rollup-linux-x64-gnu": "4.62.3", + "@rollup/rollup-linux-x64-musl": "4.62.3", + "@rollup/rollup-openbsd-x64": "4.62.3", + "@rollup/rollup-openharmony-arm64": "4.62.3", + "@rollup/rollup-win32-arm64-msvc": "4.62.3", + "@rollup/rollup-win32-ia32-msvc": "4.62.3", + "@rollup/rollup-win32-x64-gnu": "4.62.3", + "@rollup/rollup-win32-x64-msvc": "4.62.3", "fsevents": "~2.3.2" } }, @@ -21068,9 +20794,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -21249,10 +20975,17 @@ "range-parser": "1.2.0" } }, + "node_modules/serve-handler/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/serve-handler/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", "dev": true, "license": "MIT", "dependencies": { @@ -21407,47 +21140,52 @@ "license": "ISC" }, "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, + "version": "0.35.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.3.tgz", + "integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==", "license": "Apache-2.0", "dependencies": { - "@img/colour": "^1.0.0", + "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", - "semver": "^7.7.3" + "semver": "^7.8.5" }, "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + "node": ">=20.9.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" + "@img/sharp-darwin-arm64": "0.35.3", + "@img/sharp-darwin-x64": "0.35.3", + "@img/sharp-freebsd-wasm32": "0.35.3", + "@img/sharp-libvips-darwin-arm64": "1.3.2", + "@img/sharp-libvips-darwin-x64": "1.3.2", + "@img/sharp-libvips-linux-arm": "1.3.2", + "@img/sharp-libvips-linux-arm64": "1.3.2", + "@img/sharp-libvips-linux-ppc64": "1.3.2", + "@img/sharp-libvips-linux-riscv64": "1.3.2", + "@img/sharp-libvips-linux-s390x": "1.3.2", + "@img/sharp-libvips-linux-x64": "1.3.2", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.2", + "@img/sharp-libvips-linuxmusl-x64": "1.3.2", + "@img/sharp-linux-arm": "0.35.3", + "@img/sharp-linux-arm64": "0.35.3", + "@img/sharp-linux-ppc64": "0.35.3", + "@img/sharp-linux-riscv64": "0.35.3", + "@img/sharp-linux-s390x": "0.35.3", + "@img/sharp-linux-x64": "0.35.3", + "@img/sharp-linuxmusl-arm64": "0.35.3", + "@img/sharp-linuxmusl-x64": "0.35.3", + "@img/sharp-webcontainers-wasm32": "0.35.3", + "@img/sharp-win32-arm64": "0.35.3", + "@img/sharp-win32-ia32": "0.35.3", + "@img/sharp-win32-x64": "0.35.3" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/shebang-command": { @@ -21472,9 +21210,9 @@ } }, "node_modules/shell-quote": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.9.0.tgz", - "integrity": "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", "dev": true, "license": "MIT", "engines": { @@ -21670,23 +21408,6 @@ "node": ">=6" } }, - "node_modules/slice-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-9.0.0.tgz", - "integrity": "sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.3", - "is-fullwidth-code-point": "^5.1.0" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/socket.io-client": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", @@ -21703,9 +21424,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz", - "integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", + "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -21789,29 +21510,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -21829,9 +21527,9 @@ } }, "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, @@ -21945,6 +21643,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -21955,64 +21654,11 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string-width/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -22022,6 +21668,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -22048,6 +21695,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.2.2" @@ -22059,28 +21707,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -22282,19 +21908,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tailwind-merge": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", @@ -22306,9 +21919,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", "dev": true, "license": "MIT" }, @@ -22327,9 +21940,9 @@ } }, "node_modules/tar": { - "version": "7.5.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.19.tgz", - "integrity": "sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -22417,19 +22030,6 @@ "streamx": "^2.12.5" } }, - "node_modules/terminal-size": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz", - "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/text-decoder": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", @@ -22531,22 +22131,22 @@ } }, "node_modules/tldts": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.6.tgz", - "integrity": "sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q==", + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.9.tgz", + "integrity": "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.4.6" + "tldts-core": "^7.4.9" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.6.tgz", - "integrity": "sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA==", + "version": "7.4.9", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.9.tgz", + "integrity": "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==", "dev": true, "license": "MIT" }, @@ -22592,9 +22192,9 @@ } }, "node_modules/tokenx": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tokenx/-/tokenx-1.3.0.tgz", - "integrity": "sha512-NLdXTEZkKiO0gZuLtMoZKjCXTREXeZZt8nnnNeyoXtNZAfG/GKGSbQtLU5STspc0rMSwcA+UJfWZkbNU01iKmQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tokenx/-/tokenx-1.6.0.tgz", + "integrity": "sha512-CKTjk345ajvBAUp5xUI9a5KKN0zU0lBueVHQbCskH1Hp6WkUKsPW2qGCYNs0pxNyfzxfo+IIjdt2W4sMbw/qBw==", "license": "MIT" }, "node_modules/totalist": { @@ -22608,9 +22208,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22675,9 +22275,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.0.tgz", - "integrity": "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22805,9 +22405,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "license": "MIT" }, "node_modules/ufo": { @@ -22845,9 +22445,9 @@ } }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "dev": true, "license": "MIT", "engines": { @@ -22855,9 +22455,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/unicorn-magic": { @@ -23322,16 +22922,16 @@ } }, "node_modules/vite": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.3.tgz", - "integrity": "sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.16", - "rolldown": "~1.1.3", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "bin": { @@ -23428,19 +23028,19 @@ } }, "node_modules/vitest": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", - "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", + "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.9", - "@vitest/mocker": "4.1.9", - "@vitest/pretty-format": "4.1.9", - "@vitest/runner": "4.1.9", - "@vitest/snapshot": "4.1.9", - "@vitest/spy": "4.1.9", - "@vitest/utils": "4.1.9", + "@vitest/expect": "4.1.10", + "@vitest/mocker": "4.1.10", + "@vitest/pretty-format": "4.1.10", + "@vitest/runner": "4.1.10", + "@vitest/snapshot": "4.1.10", + "@vitest/spy": "4.1.10", + "@vitest/utils": "4.1.10", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -23468,12 +23068,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.9", - "@vitest/browser-preview": "4.1.9", - "@vitest/browser-webdriverio": "4.1.9", - "@vitest/coverage-istanbul": "4.1.9", - "@vitest/coverage-v8": "4.1.9", - "@vitest/ui": "4.1.9", + "@vitest/browser-playwright": "4.1.10", + "@vitest/browser-preview": "4.1.10", + "@vitest/browser-webdriverio": "4.1.10", + "@vitest/coverage-istanbul": "4.1.10", + "@vitest/coverage-v8": "4.1.10", + "@vitest/ui": "4.1.10", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -23643,33 +23243,41 @@ } }, "node_modules/widest-line": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-6.0.0.tgz", - "integrity": "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", "dev": true, "license": "MIT", "dependencies": { - "string-width": "^8.1.0" + "string-width": "^5.0.1" }, "engines": { - "node": ">=20" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, "node_modules/widest-line/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=20" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -23700,64 +23308,10 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi/node_modules/string-width": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", - "integrity": "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { @@ -23778,9 +23332,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", - "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -23867,7 +23421,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "devOptional": true, "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -23880,9 +23433,9 @@ } }, "node_modules/yocto-spinner": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.2.0.tgz", - "integrity": "sha512-Yw0hUB6UA3o4YUgKy3oSe9a4cxoaZ9sBfYDw+JSxo6Id0KoJGoxzPA24qqUXYKBWABs/zDSGTz9kww7t3F0XGw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-1.2.2.tgz", + "integrity": "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==", "dev": true, "license": "MIT", "dependencies": { @@ -23896,9 +23449,9 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "license": "MIT", "engines": { "node": ">=18" @@ -23920,13 +23473,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoga-layout": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", - "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", - "dev": true, - "license": "MIT" - }, "node_modules/zeroentropy": { "version": "0.1.0-alpha.7", "resolved": "https://registry.npmjs.org/zeroentropy/-/zeroentropy-0.1.0-alpha.7.tgz", @@ -23958,18 +23504,18 @@ "license": "MIT" }, "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-7.0.5.tgz", + "integrity": "sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w==", "dev": true, "license": "MIT", "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", + "compress-commons": "^7.0.0", + "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=18" } }, "node_modules/zlib-sync": { @@ -23984,18 +23530,18 @@ } }, "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-from-json-schema": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/zod-from-json-schema/-/zod-from-json-schema-0.5.3.tgz", - "integrity": "sha512-44YFiuq+WHw9YZQAo/Ad0F7o9c/im0Q6cnHI23BsXhEmZtkNn4cD0bljLMMjkfb/EidopPWdsmKI8EvLHX5ZyA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/zod-from-json-schema/-/zod-from-json-schema-0.5.6.tgz", + "integrity": "sha512-U33AJ7ZWS6y9XNSzMWcdy8hRAvZmWhTtpYJu0SXPT5AArbc9nq2ur7Magzmn5RF9KBV4b3FP0nCpmqqlfXlR9w==", "license": "MIT", "dependencies": { "zod": "^4.0.17" @@ -24043,21 +23589,21 @@ "@chat-adapter/teams": "^4.28.1", "@chat-adapter/telegram": "^4.28.1", "@chat-adapter/whatsapp": "^4.28.1", - "@hono/node-server": "^1.19.14", - "@mastra/ai-sdk": "1.4.5-alpha.0", - "@mastra/core": "1.42.0-alpha.3", - "@mastra/editor": "0.11.2-alpha.0", - "@mastra/evals": "1.2.4-alpha.0", - "@mastra/fastembed": "^1.1.2", - "@mastra/loggers": "1.1.2-alpha.0", - "@mastra/memory": "1.20.2-alpha.0", - "@mastra/observability": "1.14.1-alpha.1", - "@mastra/pg": "1.13.0-alpha.0", - "@mastra/rag": "2.2.1-alpha.0", - "@mastra/voice-openai": "0.12.2-alpha.0", + "@mastra/ai-sdk": "1.6.3", + "@mastra/core": "1.53.0", + "@mastra/editor": "0.13.8", + "@mastra/evals": "1.6.0", + "@mastra/fastembed": "^1.2.0", + "@mastra/loggers": "1.2.0", + "@mastra/memory": "1.23.1", + "@mastra/observability": "1.16.2", + "@mastra/pg": "1.17.1", + "@mastra/rag": "2.4.2", + "@mastra/voice-openai": "0.13.0", + "@opentelemetry/api": "^1.9.1", "@supabase/supabase-js": "^2.105.4", - "@zapier/zapier-sdk": "^0.81.0", - "ai": "^6.0.177", + "@zapier/zapier-sdk": "^0.91.0", + "ai": "^7.0.37", "async-mutex": "^0.5.0", "chat": "^4.28.1", "chat-adapter-imessage": "^0.1.1", @@ -24074,20 +23620,23 @@ "string-similarity": "^4.0.4", "tokenx": "^1.3.0", "xxhash-wasm": "^1.1.0", - "zod": "^4.3.6" + "zod": "^4.4.3" }, "devDependencies": { "@copilotkit/aimock": "^1.14.3", - "@types/node": "^20", - "@zapier/zapier-sdk-cli": "^0.62.0", - "mastra": "1.12.3-alpha.3", + "@types/node": "^24", + "@zapier/zapier-sdk-cli": "^0.67.4", + "mastra": "1.20.2", "typescript": "^5", "vitest": "^4.1.4", "zlib-sync": "^0.1.10" }, + "engines": { + "node": ">=24" + }, "optionalDependencies": { - "@mastra/deployer-cloudflare": "1.1.43-alpha.0", - "@mastra/deployer-vercel": "1.1.37-alpha.0" + "@mastra/deployer-cloudflare": "1.2.10", + "@mastra/deployer-vercel": "1.2.10" } }, "packages/web": { @@ -24095,7 +23644,7 @@ "version": "0.1.0", "hasInstallScript": true, "dependencies": { - "@ai-sdk/react": "^3.0.118", + "@ai-sdk/react": "^4.0.40", "@base-ui/react": "^1.4.1", "@codemirror/lang-python": "^6.1.6", "@codemirror/state": "^6.5.0", @@ -24111,8 +23660,8 @@ "@streamdown/mermaid": "^1.0.2", "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.104.1", - "ai": "^6.0.168", - "ansi-to-react": "^6.2.6", + "ai": "^7.0.37", + "ansi-to-react": "6.1.6", "class-variance-authority": "^0.7.1", "classnames": "^2.5.1", "clsx": "^2.1.1", @@ -24126,11 +23675,12 @@ "fumadocs-core": "^16.8.0", "fumadocs-mdx": "^14.3.1", "fumadocs-ui": "^16.8.0", + "geist": "^1.7.2", "input-otp": "^1.4.2", "lucide-react": "^1.11.0", "motion": "^12.38.0", "nanoid": "^5.1.3", - "next": "16.2.10", + "next": "16.2.12", "next-themes": "^0.4.6", "orderedmap": "^2.1.1", "papaparse": "^5.5.2", @@ -24159,11 +23709,11 @@ "use-stick-to-bottom": "^1.1.4", "usehooks-ts": "^3.1.0", "vaul": "^1.1.2", - "zod": "^4.3.6" + "zod": "^4.4.3" }, "devDependencies": { "@tailwindcss/postcss": "^4.1.13", - "@types/node": "^22.8.6", + "@types/node": "^24", "@types/papaparse": "^5.3.15", "@types/react": "^19", "@types/react-dom": "^19", @@ -24173,14 +23723,6 @@ "typescript": "^5.6.3" } }, - "packages/web/node_modules/@types/node": { - "version": "22.19.21", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, "packages/web/node_modules/nanoid": { "version": "5.1.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz", diff --git a/package.json b/package.json index 655743f2..ca3c56cc 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "workspaces": [ "packages/*" ], + "engines": { + "node": ">=24" + }, "scripts": { "dev": "next dev", "build": "next build", @@ -30,37 +33,41 @@ }, "overrides": { "esbuild": ">=0.25.0", - "zod": "4.3.6", + "zod": "4.4.3", "postcss": "^8.5.10", - "@mastra/core": "1.42.0-alpha.3", - "@mastra/deployer": "1.42.0-alpha.3", - "@mastra/server": "1.42.0-alpha.3", - "@mastra/ai-sdk": "1.4.5-alpha.0", - "@mastra/editor": "0.11.2-alpha.0", - "@mastra/evals": "1.2.4-alpha.0", - "@mastra/fastembed": "1.1.2", - "@mastra/loggers": "1.1.2-alpha.0", - "@mastra/memory": "1.20.2-alpha.0", - "@mastra/observability": "1.14.1-alpha.1", - "@mastra/pg": "1.13.0-alpha.0", - "@mastra/rag": "2.2.1-alpha.0", - "@mastra/voice-openai": "0.12.2-alpha.0", - "@mastra/deployer-cloudflare": "1.1.43-alpha.0", - "@mastra/deployer-vercel": "1.1.37-alpha.0" + "sharp": "^0.35.3", + "adm-zip": "^0.6.0", + "rimraf": "^6.1.3", + "@hono/node-server": "^2.0.12", + "@mastra/core": "1.53.0", + "@mastra/deployer": "1.53.0", + "@mastra/server": "1.53.0", + "@mastra/ai-sdk": "1.6.3", + "@mastra/editor": "0.13.8", + "@mastra/evals": "1.6.0", + "@mastra/fastembed": "1.2.0", + "@mastra/loggers": "1.2.0", + "@mastra/memory": "1.23.1", + "@mastra/observability": "1.16.2", + "@mastra/pg": "1.17.1", + "@mastra/rag": "2.4.2", + "@mastra/voice-openai": "0.13.0", + "@mastra/deployer-cloudflare": "1.2.10", + "@mastra/deployer-vercel": "1.2.10" }, "devDependencies": { - "@biomejs/biome": "2.4.16", + "@biomejs/biome": "2.5.4", "@copilotkit/aimock": "^1.14.3", "@playwright/test": "^1.59.1", "@tailwindcss/postcss": "^4", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", - "@types/node": "^20", + "@types/node": "^24", "@types/react": "^19", "@types/react-dom": "^19", "@types/supertest": "^7.2.0", "@vitest/ui": "^4.1.4", - "@zapier/zapier-sdk-cli": "^0.62.0", + "@zapier/zapier-sdk-cli": "^0.67.4", "autoprefixer": "^10.5.0", "drizzle-kit": "^0.31.10", "jsdom": "^29.0.2", diff --git a/packages/agents/package.json b/packages/agents/package.json index 4e3cf952..44a3d8ec 100644 --- a/packages/agents/package.json +++ b/packages/agents/package.json @@ -3,6 +3,9 @@ "version": "0.1.0", "private": true, "type": "module", + "engines": { + "node": ">=24" + }, "scripts": { "dev": "mastra dev", "build": "mastra build", @@ -49,21 +52,21 @@ "@chat-adapter/teams": "^4.28.1", "@chat-adapter/telegram": "^4.28.1", "@chat-adapter/whatsapp": "^4.28.1", - "@hono/node-server": "^1.19.14", - "@mastra/ai-sdk": "1.4.5-alpha.0", - "@mastra/core": "1.42.0-alpha.3", - "@mastra/editor": "0.11.2-alpha.0", - "@mastra/evals": "1.2.4-alpha.0", - "@mastra/fastembed": "^1.1.2", - "@mastra/loggers": "1.1.2-alpha.0", - "@mastra/memory": "1.20.2-alpha.0", - "@mastra/observability": "1.14.1-alpha.1", - "@mastra/pg": "1.13.0-alpha.0", - "@mastra/rag": "2.2.1-alpha.0", - "@mastra/voice-openai": "0.12.2-alpha.0", + "@mastra/ai-sdk": "1.6.3", + "@mastra/core": "1.53.0", + "@mastra/editor": "0.13.8", + "@mastra/evals": "1.6.0", + "@mastra/fastembed": "^1.2.0", + "@mastra/loggers": "1.2.0", + "@mastra/memory": "1.23.1", + "@mastra/observability": "1.16.2", + "@mastra/pg": "1.17.1", + "@mastra/rag": "2.4.2", + "@mastra/voice-openai": "0.13.0", + "@opentelemetry/api": "^1.9.1", "@supabase/supabase-js": "^2.105.4", - "@zapier/zapier-sdk": "^0.81.0", - "ai": "^6.0.177", + "@zapier/zapier-sdk": "^0.91.0", + "ai": "^7.0.37", "async-mutex": "^0.5.0", "chat": "^4.28.1", "chat-adapter-imessage": "^0.1.1", @@ -80,17 +83,17 @@ "string-similarity": "^4.0.4", "tokenx": "^1.3.0", "xxhash-wasm": "^1.1.0", - "zod": "^4.3.6" + "zod": "^4.4.3" }, "optionalDependencies": { - "@mastra/deployer-cloudflare": "1.1.43-alpha.0", - "@mastra/deployer-vercel": "1.1.37-alpha.0" + "@mastra/deployer-cloudflare": "1.2.10", + "@mastra/deployer-vercel": "1.2.10" }, "devDependencies": { "@copilotkit/aimock": "^1.14.3", - "@types/node": "^20", - "@zapier/zapier-sdk-cli": "^0.62.0", - "mastra": "1.12.3-alpha.3", + "@types/node": "^24", + "@zapier/zapier-sdk-cli": "^0.67.4", + "mastra": "1.20.2", "typescript": "^5", "vitest": "^4.1.4", "zlib-sync": "^0.1.10" diff --git a/packages/agents/src/discord/bot.ts b/packages/agents/src/discord/bot.ts index eb97228e..dc9735ca 100644 --- a/packages/agents/src/discord/bot.ts +++ b/packages/agents/src/discord/bot.ts @@ -1,9 +1,9 @@ import { createDiscordAdapter } from "@chat-adapter/discord"; import { createMemoryState } from "@chat-adapter/state-memory"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { redeemChannelLinkCode, registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ discord: ReturnType }> | undefined; diff --git a/packages/agents/src/gchat/bot.ts b/packages/agents/src/gchat/bot.ts index 813ae37f..28f61d31 100644 --- a/packages/agents/src/gchat/bot.ts +++ b/packages/agents/src/gchat/bot.ts @@ -1,9 +1,9 @@ import { createGoogleChatAdapter } from "@chat-adapter/gchat"; import { createMemoryState } from "@chat-adapter/state-memory"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ gchat: ReturnType }> | undefined; diff --git a/packages/agents/src/github/bot.ts b/packages/agents/src/github/bot.ts index 8ac0243a..4d92f865 100644 --- a/packages/agents/src/github/bot.ts +++ b/packages/agents/src/github/bot.ts @@ -1,9 +1,9 @@ import { createGitHubAdapter } from "@chat-adapter/github"; import { createMemoryState } from "@chat-adapter/state-memory"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ github: ReturnType }> | undefined; diff --git a/packages/agents/src/imessage/bot.ts b/packages/agents/src/imessage/bot.ts index dab4f842..7d7708bf 100644 --- a/packages/agents/src/imessage/bot.ts +++ b/packages/agents/src/imessage/bot.ts @@ -1,9 +1,9 @@ import { createMemoryState } from "@chat-adapter/state-memory"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { createiMessageAdapter } from "chat-adapter-imessage"; import { registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat | undefined; diff --git a/packages/agents/src/lib/durable/deps.ts b/packages/agents/src/lib/durable/deps.ts index 9e48c476..c7b0ac0a 100644 --- a/packages/agents/src/lib/durable/deps.ts +++ b/packages/agents/src/lib/durable/deps.ts @@ -4,10 +4,14 @@ * Zapier runs durable source in a Vercel sandbox that installs deps with * `pnpm install --config.minimumReleaseAge=1440`, so any direct dependency * published less than 24h ago is REJECTED. `@zapier/zapier-sdk` publishes several - * times a day, so its npm-latest is regularly too young. These are the latest - * versions of each that were >=24h old on 2026-06-25 and proven end-to-end by the - * durable PoC capstone (foreman-l7xq) — runDurable + publishWorkflowVersion + - * triggerWorkflow all succeeded against this set. + * times a day, so its npm-latest is regularly too young. These are the newest + * stable versions of each that were >=24h old as of 2026-07-14, selected by + * publish DATE (not semver — `@zapier/zapier-sdk` has an ancient 1.1.0 that + * out-sorts the live 0.8x line). npm-latest sdk 0.85.0 was only ~3h old then, so + * 0.84.4 is the aged pick. Durable moved 0.6.1 -> 0.9.1 in this pass; unlike the + * original set (proven end-to-end by the foreman-l7xq capstone — runDurable + + * publishWorkflowVersion + triggerWorkflow), the 0.9.x bump still needs a live + * runDurable/publishWorkflowVersion to re-prove end-to-end. * * `@zapier/zapier-sdk` and `zod` are passed in `dependencies` (the source imports * them); `@zapier/zapier-durable` is passed via `zapierDurableVersion`. None of @@ -16,7 +20,7 @@ * of pinning constants. */ export const AGED_DURABLE_DEPS = { - sdk: "0.79.0", - durable: "0.6.1", + sdk: "0.84.4", + durable: "0.9.1", zod: "4.4.3", } as const; diff --git a/packages/agents/src/lib/prompt-template.ts b/packages/agents/src/lib/prompt-template.ts index 2d469189..36b8ca09 100644 --- a/packages/agents/src/lib/prompt-template.ts +++ b/packages/agents/src/lib/prompt-template.ts @@ -128,7 +128,7 @@ For write actions, confirm using this template: > > Confirm? -**Account name is mandatory** — name the specific account (e.g., "@admin (Otaku Solutions)", "tylan@otakusolutions.io") even when there's only one account connected for that app. "using the **HubSpot** connection" is wrong; "using the **** HubSpot connection" is right. The account name is what disambiguates a connection from the app and reassures the user which credentials will execute the write. +**Account name is mandatory** — name the specific account (e.g., "@sales (Acme Inc)", "billing@acme.com") even when there's only one account connected for that app. "using the **HubSpot** connection" is wrong; "using the **** HubSpot connection" is right. The account name is what disambiguates a connection from the app and reassures the user which credentials will execute the write. **Field labels use Title Case.** The user-visible field name in the bullet list should be Title Case ("Channel", "Message Text", "First Name") regardless of the SDK's internal key (\`channel\`, \`text\`, \`firstname\`). This is for the user, not for the API. diff --git a/packages/agents/src/lib/stop-conditions.ts b/packages/agents/src/lib/stop-conditions.ts new file mode 100644 index 00000000..593b3ffd --- /dev/null +++ b/packages/agents/src/lib/stop-conditions.ts @@ -0,0 +1,24 @@ +/** + * Agent stop conditions. + * + * `stopWhen` is a **Mastra** agent option, so what we pass must satisfy Mastra's + * `StopCondition` — not the AI SDK's. Those two drifted apart in AI SDK v7: + * `ai`'s `stepCountIs` now returns `StopCondition` (its `StepResult` + * gained `callId`, `stepNumber`, `model`, `toolsContext`, …) while Mastra 1.53 + * still declares the single-parameter `StopCondition`. Importing it from + * `ai` therefore stops type-checking against every `agent.generate()` / + * `agent.stream()` call. + * + * The behaviour is a one-line step count and identical in both versions, so we + * own it here rather than coupling eleven channel bots to the AI SDK's major + * version. Nothing about this is a workaround at runtime — Mastra invokes the + * condition with `{ steps }` exactly as before. + * + * Revisit when Mastra's agent surface adopts the v7 `StopCondition` shape; at + * that point this can go back to a plain `import { stepCountIs } from "ai"`. + */ + +/** Stop once the agent has taken `stepCount` steps. */ +export function stepCountIs(stepCount: number) { + return ({ steps }: { steps: readonly unknown[] }) => steps.length >= stepCount; +} diff --git a/packages/agents/src/lib/zapier-sdk-tools.ts b/packages/agents/src/lib/zapier-sdk-tools.ts index 35f83f42..99ed7494 100644 --- a/packages/agents/src/lib/zapier-sdk-tools.ts +++ b/packages/agents/src/lib/zapier-sdk-tools.ts @@ -290,7 +290,7 @@ export function generateZapierTools( ...(hasConnections ? { manifest: { connections } } : {}), debug: isDebug, maxNetworkRetries: 3, - maxNetworkRetryDelayMs: 30000, + maxNetworkRetryDelaySeconds: 30, canDeleteTables: true, onEvent: onZapierSdkEvent, }); @@ -341,7 +341,20 @@ export function generateZapierTools( // user context is available — e.g., during channel webhook processing. const userCtx = requestUserContext.getStore(); const activeSdk = userCtx?.userId ? await getSdkForUser(userCtx.userId) : sdk; - const activeMethod = (activeSdk as any)[fn.name] as (args: any) => Promise; + const activeMethod = (activeSdk as any)[fn.name] as (...args: any[]) => Promise; + + // Positional-projection methods (only `fetch` today) take SPREAD + // arguments, not the canonical single bag — the surface is + // `(...args) => canonicalValue(pack(args))`, so handing it one + // object binds that whole object to the first positional key. + // SDK 0.86 replaced the old `inputParameters` metadata (objects + // carrying `.name`) with `positional`: an ordered list of input + // KEYS to project onto arguments. Every registry entry now also + // has an `inputSchema`, so this can no longer be a sibling branch. + if (fn.positional) { + const args = fn.positional.map((key) => (input as any)[key]); + return summarize(await activeMethod.call(activeSdk, ...args)); + } if (PAGINATED_METHODS.has(fn.name)) { const maxItems = (input as any).maxItems ?? DEFAULT_MAX_ITEMS; @@ -354,45 +367,6 @@ export function generateZapierTools( } }, }); - } else if (fn.inputParameters) { - // Positional-params function (fetch) - const _sdkFn = (sdk as any)[fn.name] as (...args: any[]) => Promise; - - // Build a Zod schema from input parameters. - // fetch has url (required) and init (optional). - const shape: Record = {}; - for (const param of fn.inputParameters) { - // url is always required for fetch; init is optional - const isRequired = param.name === "url"; - if (isRequired) { - shape[param.name] = z.any().describe((param as any).description || param.name); - } else { - shape[param.name] = z - .any() - .optional() - .describe((param as any).description || param.name); - } - } - - const summarizeFetch = createSummarizer(fn.name); - tools[toolName] = createTool({ - id: toolName, - description, - inputSchema: z.object(shape).describe(description), - ...(isDestructive ? { requireApproval: true } : {}), - ...mcpAnnotations, - execute: async (input) => { - try { - const userCtx = requestUserContext.getStore(); - const activeSdk = userCtx?.userId ? await getSdkForUser(userCtx.userId) : sdk; - const activeMethod = (activeSdk as any)[fn.name] as (...args: any[]) => Promise; - const args = fn.inputParameters!.map((p: any) => input[p.name]); - return summarizeFetch(await activeMethod.call(activeSdk, ...args)); - } catch (err) { - return handleSdkError(err, fn.name); - } - }, - }); } } diff --git a/packages/agents/src/lib/zapier/execution.ts b/packages/agents/src/lib/zapier/execution.ts index 6090f248..07bb0826 100644 --- a/packages/agents/src/lib/zapier/execution.ts +++ b/packages/agents/src/lib/zapier/execution.ts @@ -91,7 +91,7 @@ export async function runAction( actionType: actionType as ActionType, action, inputs, - timeoutMs: 180000, + timeoutSeconds: 180, ...(resolvedConnection ? { connection: resolvedConnection } : {}), }); return result; diff --git a/packages/agents/src/linear/bot.ts b/packages/agents/src/linear/bot.ts index ce0f1af1..f2cd6a2a 100644 --- a/packages/agents/src/linear/bot.ts +++ b/packages/agents/src/linear/bot.ts @@ -1,9 +1,9 @@ import { createLinearAdapter } from "@chat-adapter/linear"; import { createMemoryState } from "@chat-adapter/state-memory"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ linear: ReturnType }> | undefined; diff --git a/packages/agents/src/mastra/agents/foreman.ts b/packages/agents/src/mastra/agents/foreman.ts index c1c03e9f..d1329b10 100644 --- a/packages/agents/src/mastra/agents/foreman.ts +++ b/packages/agents/src/mastra/agents/foreman.ts @@ -4,7 +4,6 @@ import { createAnswerRelevancyScorer, createToxicityScorer } from "@mastra/evals import { fastembed } from "@mastra/fastembed"; import { Memory } from "@mastra/memory"; import { PgVector, PostgresStore } from "@mastra/pg"; -import { stepCountIs } from "ai"; import { backgroundToolsConfig } from "../../lib/background"; import { contextInjector, piiRedactor } from "../../lib/processors"; import { buildSystemPrompt, type PromptContext } from "../../lib/prompt-template"; @@ -16,6 +15,7 @@ import { systemPromptFor, toolsWithCacheControl, } from "../../lib/providers"; +import { stepCountIs } from "../../lib/stop-conditions"; import { sanitizeToolSchemas } from "../../lib/tool-schema-sanitizer"; import { generateZapierTools } from "../../lib/zapier-sdk-tools"; import { diff --git a/packages/agents/src/mastra/index.ts b/packages/agents/src/mastra/index.ts index 450c7d94..3e05945a 100644 --- a/packages/agents/src/mastra/index.ts +++ b/packages/agents/src/mastra/index.ts @@ -11,10 +11,11 @@ import { MastraEditor } from "@mastra/editor"; import { PinoLogger } from "@mastra/loggers"; import { ConsoleExporter, DefaultExporter, Observability } from "@mastra/observability"; import { PostgresStore } from "@mastra/pg"; -import { createUIMessageStreamResponse, stepCountIs } from "ai"; +import { createUIMessageStreamResponse } from "ai"; import { resolveActiveWorkspace, resolveFromRequest } from "../lib/identity"; import { validateAgentCapabilities } from "../lib/providers"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { dailyDigestWorkflow } from "../workflows/daily-digest"; import { runAutomationWorkflow } from "../workflows/run-automation"; import { webhookHandlerWorkflow } from "../workflows/webhook-handler"; diff --git a/packages/agents/src/slack/bot.ts b/packages/agents/src/slack/bot.ts index 1150c7ea..1632dda9 100644 --- a/packages/agents/src/slack/bot.ts +++ b/packages/agents/src/slack/bot.ts @@ -1,11 +1,11 @@ import { createSlackAdapter } from "@chat-adapter/slack"; import { createMemoryState } from "@chat-adapter/state-memory"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { decryptToken } from "../lib/crypto"; import { getSupabase } from "../lib/db"; import { redeemChannelLinkCode, registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ slack: ReturnType }> | undefined; diff --git a/packages/agents/src/teams/bot.ts b/packages/agents/src/teams/bot.ts index c7532ca8..ac2174b7 100644 --- a/packages/agents/src/teams/bot.ts +++ b/packages/agents/src/teams/bot.ts @@ -1,9 +1,9 @@ import { createMemoryState } from "@chat-adapter/state-memory"; import { createTeamsAdapter } from "@chat-adapter/teams"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ teams: ReturnType }> | undefined; diff --git a/packages/agents/src/telegram/bot.ts b/packages/agents/src/telegram/bot.ts index 3727de8b..ce9fa711 100644 --- a/packages/agents/src/telegram/bot.ts +++ b/packages/agents/src/telegram/bot.ts @@ -1,9 +1,9 @@ import { createMemoryState } from "@chat-adapter/state-memory"; import { createTelegramAdapter } from "@chat-adapter/telegram"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { redeemChannelLinkCode, registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ telegram: ReturnType }> | undefined; diff --git a/packages/agents/src/whatsapp/bot.ts b/packages/agents/src/whatsapp/bot.ts index e2f5cb72..21e4a8f7 100644 --- a/packages/agents/src/whatsapp/bot.ts +++ b/packages/agents/src/whatsapp/bot.ts @@ -1,9 +1,9 @@ import { createMemoryState } from "@chat-adapter/state-memory"; import { createWhatsAppAdapter } from "@chat-adapter/whatsapp"; -import { stepCountIs } from "ai"; import { Chat } from "chat"; import { registerChannelUser } from "../lib/identity"; import { requestUserContext } from "../lib/request-user-context"; +import { stepCountIs } from "../lib/stop-conditions"; import { getMastra } from "../mastra"; let _bot: Chat<{ whatsapp: ReturnType }> | undefined; diff --git a/packages/agents/tests/sdk/inspect-output.txt b/packages/agents/tests/sdk/inspect-output.txt deleted file mode 100644 index b8327be1..00000000 --- a/packages/agents/tests/sdk/inspect-output.txt +++ /dev/null @@ -1,80 +0,0 @@ -=== 5 CONNECTIONS === -KEYS: ["id","date","account_id","is_invite_only","is_private","shared_with_all","title","lastchanged","is_stale","is_shared","identifier","groups","members","permissions","implementation_id","profile_id","is_expired","expired_at","app_key","app_version"] -FIRST: { - "id": "02dad18c-1105-8afb-b3dc-46d9db6e3725", - "date": "2026-04-18T22:42:46Z", - "account_id": "03ca6759-8d97-8994-a7ce-3f3b13d73043", - "is_invite_only": false, - "is_private": false, - "shared_with_all": false, - "title": "admin@otakusolutions.io (id: oaaGIW3QnUFO7kyMl)", - "lastchanged": "2026-04-18T22:42:46Z", - "is_stale": "false", - "is_shared": "false", - "identifier": null, - "groups": [], - "members": "", - "permissions": { - "delete": true, - "edit": true, - "reconnect": true, - "share": true, - "test": true, - "transfer": true, - "use": true - }, - "implementation_id": "AirtableCLIAPI@3.12.1", - "profile_id": "012c8c5b-edc9-85e0-88aa-45610b8697d2", - "is_expired": "false", - "expired_at": null, - "app_key": "AirtableCLIAPI", - "app_version": "3.12.1" -} - CONN: {"title":"admin@otakusolutions.io (id: oaaGIW3QnUFO7kyMl)","app_key":"AirtableCLIAPI"} - CONN: {"title":"tylan@otakusolutions.io","app_key":"GoogleSheetsV2CLIAPI"} - CONN: {"title":"kawaiichowderr@gmail.com","app_key":"GoogleMailV2CLIAPI"} - CONN: {"title":"AITable.ai","app_key":"APITableCLIAPI"} - CONN: {"title":"Skool","app_key":"SkoolCLIAPI"} - -=== APPS (first 5 of ?) === -nextCursor: undefined - APP: {"key":"100HiresCLIAPI","slug":"100hires-ats","title":"100Hires ATS"} - APP: {"key":"1SaaSCoCLIAPI","slug":"0codekit","title":"0CodeKit"} - APP: {"key":"1stThings1stCLIAPI","slug":"1st-things-1st","title":"1st things 1st"} - APP: {"key":"360DialogCLIAPI","slug":"360dialog","title":"360dialog"} - APP: {"key":"7ShiftsCLIAPI","slug":"7shifts","title":"7shifts"} - -=== SCHEMA PARAMS === -createClientCredentials: name, allowedScopes -createTable: name, description -createTableFields: table, fields -createTableRecords: table, records, keyMode -deleteClientCredentials: clientId -deleteTable: table -deleteTableFields: table, fields -deleteTableRecords: table, records -fetch (positional): url, init -findFirstAuthentication: search, title, owner, app, appKey, account, accountId, includeShared, isExpired, expired -findFirstConnection: search, title, owner, app, appKey, account, accountId, includeShared, isExpired, expired -findUniqueAuthentication: search, title, owner, app, appKey, account, accountId, includeShared, isExpired, expired -findUniqueConnection: search, title, owner, app, appKey, account, accountId, includeShared, isExpired, expired -getAction: app, actionType, action -getApp: app -getAuthentication: connection, connectionId, authenticationId -getConnection: connection, connectionId, authenticationId -getInputFieldsSchema: app, actionType, action, connection, connectionId, authenticationId, inputs -getTable: table -getTableRecord: table, record, keyMode -listActions: app, actionType, pageSize, maxItems, cursor -listApps: appKeys, search, pageSize, apps, maxItems, cursor -listAuthentications: search, title, owner, app, appKey, connections, connectionIds, authenticationIds, account, accountId, includeShared, isExpired, expired, pageSize, maxItems, cursor -listClientCredentials: pageSize, maxItems, cursor -listConnections: search, title, owner, app, appKey, connections, connectionIds, authenticationIds, account, accountId, includeShared, isExpired, expired, pageSize, maxItems, cursor -listInputFieldChoices: app, actionType, action, inputField, connection, connectionId, authenticationId, inputs, page, pageSize, maxItems, cursor -listInputFields: app, actionType, action, connection, connectionId, authenticationId, inputs, pageSize, maxItems, cursor -listTableFields: table, fields, fieldKeys -listTableRecords: table, filters, sort, pageSize, maxItems, cursor, keyMode -listTables: tables, tableIds, kind, search, owner, includeShared, pageSize, maxItems, cursor -request: url, method, body, connection, connectionId, authenticationId, callbackUrl, headers -runAction: app, actionType, action, connection, connectionId, authenticationId, inputs, timeoutMs, pageSize, maxItems, cursor -updateTableRecords: table, records, keyMode \ No newline at end of file diff --git a/packages/web/content/docs/core-concepts/memory.mdx b/packages/web/content/docs/core-concepts/memory.mdx index 7718aa2b..9a95e724 100644 --- a/packages/web/content/docs/core-concepts/memory.mdx +++ b/packages/web/content/docs/core-concepts/memory.mdx @@ -21,7 +21,7 @@ team, the boards you use most, the way you like emails signed off. Working memory: -- Is editable at any time via chat ("remember that I sign emails Best, Tylan") +- Is editable at any time via chat ("remember that I sign emails Best, Alex") - Is included in every prompt as part of the system message - Has a budget of roughly 500 tokens; older entries are summarized diff --git a/packages/web/package.json b/packages/web/package.json index 9cd50f5c..ba0b63e8 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -11,7 +11,7 @@ "test:e2e": "npx playwright test" }, "dependencies": { - "@ai-sdk/react": "^3.0.118", + "@ai-sdk/react": "^4.0.40", "@base-ui/react": "^1.4.1", "@codemirror/lang-python": "^6.1.6", "@codemirror/state": "^6.5.0", @@ -27,8 +27,8 @@ "@streamdown/mermaid": "^1.0.2", "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.104.1", - "ai": "^6.0.168", - "ansi-to-react": "^6.2.6", + "ai": "^7.0.37", + "ansi-to-react": "6.1.6", "class-variance-authority": "^0.7.1", "classnames": "^2.5.1", "clsx": "^2.1.1", @@ -42,11 +42,12 @@ "fumadocs-core": "^16.8.0", "fumadocs-mdx": "^14.3.1", "fumadocs-ui": "^16.8.0", + "geist": "^1.7.2", "input-otp": "^1.4.2", "lucide-react": "^1.11.0", "motion": "^12.38.0", "nanoid": "^5.1.3", - "next": "16.2.10", + "next": "16.2.12", "next-themes": "^0.4.6", "orderedmap": "^2.1.1", "papaparse": "^5.5.2", @@ -75,11 +76,11 @@ "use-stick-to-bottom": "^1.1.4", "usehooks-ts": "^3.1.0", "vaul": "^1.1.2", - "zod": "^4.3.6" + "zod": "^4.4.3" }, "devDependencies": { "@tailwindcss/postcss": "^4.1.13", - "@types/node": "^22.8.6", + "@types/node": "^24", "@types/papaparse": "^5.3.15", "@types/react": "^19", "@types/react-dom": "^19", diff --git a/packages/web/src/app/globals.css b/packages/web/src/app/globals.css index 2888fa71..b5aff934 100644 --- a/packages/web/src/app/globals.css +++ b/packages/web/src/app/globals.css @@ -146,8 +146,8 @@ --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); - --font-sans: "Geist", "Geist Fallback", ui-sans-serif, system-ui, sans-serif; - --font-mono: "Geist Mono", "Geist Mono Fallback", ui-monospace, monospace; + --font-sans: var(--font-geist-sans), "Geist", "Geist Fallback", ui-sans-serif, system-ui, sans-serif; + --font-mono: var(--font-geist-mono), "Geist Mono", "Geist Mono Fallback", ui-monospace, monospace; } body { diff --git a/packages/web/src/app/layout.tsx b/packages/web/src/app/layout.tsx index a6b77398..c73c8491 100644 --- a/packages/web/src/app/layout.tsx +++ b/packages/web/src/app/layout.tsx @@ -1,19 +1,10 @@ +import { GeistMono } from "geist/font/mono"; +import { GeistSans } from "geist/font/sans"; import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; import { Suspense } from "react"; import { ThemeProvider } from "@/components/theme-provider"; import "./globals.css"; -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - export const metadata: Metadata = { title: "Foreman", description: "AI assistant that helps you take actions across 10,000+ apps via Zapier", @@ -28,7 +19,7 @@ export default function RootLayout({ {/* Apply the saved color theme preset before paint to avoid a flash. */} diff --git a/packages/web/src/components/landing/sections/site-footer.tsx b/packages/web/src/components/landing/sections/site-footer.tsx index 484f11cd..359b108c 100644 --- a/packages/web/src/components/landing/sections/site-footer.tsx +++ b/packages/web/src/components/landing/sections/site-footer.tsx @@ -31,7 +31,7 @@ const COLUMNS: Array<{ { heading: "Get in touch", links: [ - { label: "tylan@otakusolutions.io", href: "mailto:tylan@otakusolutions.io" }, + { label: "hello@otakusolutions.io", href: "mailto:hello@otakusolutions.io" }, { label: "Sign in", href: "/chat" }, { label: "Issues", href: "https://github.com/hamchowderr/foreman/issues", external: true }, ],