aimeat 1.33.2 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/locales/en.json +437 -15
- package/dist/locales/fi.json +437 -15
- package/dist/public/cortex-bundled/aimeat-charts.js +3 -3
- package/dist/public/cortex-bundled/aimeat-charts.yaml +3 -3
- package/dist/public/cortex-bundled/aimeat-i18n.js +123 -0
- package/dist/public/cortex-bundled/aimeat-i18n.yaml +64 -0
- package/dist/public/css/views/landing.css +2 -0
- package/dist/public/css/views/secretary.css +464 -2
- package/dist/public/js/i18n.js +9 -0
- package/dist/public/js/services/apps.js +4 -2
- package/dist/public/js/services/memory.js +9 -3
- package/dist/public/js/services/offers.js +1 -1
- package/dist/public/js/services/organisms.js +49 -17
- package/dist/public/js/services/secretary-helpers.js +266 -17
- package/dist/public/js/services/secretary-policy.js +28 -2
- package/dist/public/js/services/secretary-rules.js +70 -0
- package/dist/public/js/theme.js +20 -0
- package/dist/public/lib/VENDORED-STYLING.md +31 -0
- package/dist/public/lib/aimeat-daisyui-bridge.css +48 -0
- package/dist/public/lib/chartjs@4.js +14 -0
- package/dist/public/lib/daisyui@5.css +7 -0
- package/dist/public/lib/tailwindcss@4.js +8 -0
- package/dist/public/llms-template.txt +9 -6
- package/dist/public/showroom.html +104 -0
- package/dist/public/showroom.js +247 -0
- package/dist/public/spa.html +18 -16
- package/dist/public/views/aimeat-os.js +3 -2
- package/dist/public/views/landing.js +50 -6
- package/dist/public/views/profile/agents/agent-card.js +13 -4
- package/dist/public/views/profile/agents/state-detector.js +6 -0
- package/dist/public/views/profile/agents/tab-integration.js +11 -2
- package/dist/public/views/profile/apps-tab.js +46 -0
- package/dist/public/views/profile/extensions-tab.js +4 -0
- package/dist/public/views/profile/inbox-tab.js +1 -1
- package/dist/public/views/profile/landing-page.js +8 -3
- package/dist/public/views/profile/memory-tab.js +37 -6
- package/dist/public/views/profile/organisms/home.js +32 -0
- package/dist/public/views/profile/organisms/workspace-list.js +36 -5
- package/dist/public/views/profile/organisms/workspace.js +29 -4
- package/dist/public/views/profile/organisms-tab.js +61 -8
- package/dist/public/views/secretary/calendar.js +327 -0
- package/dist/public/views/secretary/cards-reach.js +16 -17
- package/dist/public/views/secretary/cards.js +217 -79
- package/dist/public/views/secretary/dashboard.js +617 -0
- package/dist/public/views/secretary/quality.js +156 -0
- package/dist/public/views/secretary/use-autonomy.js +17 -2
- package/dist/public/views/secretary/use-freshness.js +50 -0
- package/dist/public/views/secretary/use-intake.js +23 -4
- package/dist/public/views/secretary/use-layout.js +122 -0
- package/dist/public/views/secretary/use-quick-actions.js +98 -0
- package/dist/public/views/secretary/use-specialists.js +103 -0
- package/dist/public/views/secretary/use-triggers.js +159 -0
- package/dist/public/views/secretary/use-whats-next.js +340 -0
- package/dist/public/views/secretary/workflow-design.js +112 -0
- package/dist/public/views/secretary.js +836 -44
- package/dist/scripts/check-no-max-tokens.d.ts +2 -0
- package/dist/scripts/check-no-max-tokens.d.ts.map +1 -0
- package/dist/scripts/check-no-max-tokens.js +71 -0
- package/dist/scripts/check-no-max-tokens.js.map +1 -0
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts +2 -0
- package/dist/src/cli/connect/mcp/tools/organisms.d.ts.map +1 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js +9 -1
- package/dist/src/cli/connect/mcp/tools/organisms.js.map +1 -1
- package/dist/src/cli/connect/onboarding-prompt.d.ts +3 -0
- package/dist/src/cli/connect/onboarding-prompt.d.ts.map +1 -1
- package/dist/src/cli/connect/onboarding-prompt.js +10 -3
- package/dist/src/cli/connect/onboarding-prompt.js.map +1 -1
- package/dist/src/data/aimeat-iam-package.d.ts +25 -0
- package/dist/src/data/aimeat-iam-package.d.ts.map +1 -0
- package/dist/src/data/aimeat-iam-package.js +312 -0
- package/dist/src/data/aimeat-iam-package.js.map +1 -0
- package/dist/src/data/aimeat-marketplace-package.d.ts +25 -0
- package/dist/src/data/aimeat-marketplace-package.d.ts.map +1 -0
- package/dist/src/data/aimeat-marketplace-package.js +231 -0
- package/dist/src/data/aimeat-marketplace-package.js.map +1 -0
- package/dist/src/data/app-templates.d.ts +48 -0
- package/dist/src/data/app-templates.d.ts.map +1 -0
- package/dist/src/data/app-templates.js +856 -0
- package/dist/src/data/app-templates.js.map +1 -0
- package/dist/src/data/example-packages.d.ts.map +1 -1
- package/dist/src/data/example-packages.js +3 -1
- package/dist/src/data/example-packages.js.map +1 -1
- package/dist/src/generated/api-types.d.ts +689 -7
- package/dist/src/generated/api-types.d.ts.map +1 -1
- package/dist/src/generated/prisma-postgres/edge.js +10 -3
- package/dist/src/generated/prisma-postgres/index-browser.js +7 -0
- package/dist/src/generated/prisma-postgres/index.d.ts +205 -2
- package/dist/src/generated/prisma-postgres/index.js +10 -3
- package/dist/src/generated/prisma-postgres/package.json +1 -1
- package/dist/src/generated/prisma-postgres/schema.prisma +23 -13
- package/dist/src/generated/prisma-postgres/wasm.js +10 -3
- package/dist/src/mcp/agent-onboarding.d.ts +4 -0
- package/dist/src/mcp/agent-onboarding.d.ts.map +1 -1
- package/dist/src/mcp/agent-onboarding.js +28 -2
- package/dist/src/mcp/agent-onboarding.js.map +1 -1
- package/dist/src/mcp/annotations.d.ts.map +1 -1
- package/dist/src/mcp/annotations.js +1 -0
- package/dist/src/mcp/annotations.js.map +1 -1
- package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
- package/dist/src/mcp/catalog/definitions.js +16 -1
- package/dist/src/mcp/catalog/definitions.js.map +1 -1
- package/dist/src/mcp/catalog/surfaces.js +3 -3
- package/dist/src/mcp/catalog/surfaces.js.map +1 -1
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -1
- package/dist/src/mcp/index.js +11 -0
- package/dist/src/mcp/index.js.map +1 -1
- package/dist/src/mcp/organisms.d.ts.map +1 -1
- package/dist/src/mcp/organisms.js +48 -8
- package/dist/src/mcp/organisms.js.map +1 -1
- package/dist/src/mcp/workspaces.d.ts.map +1 -1
- package/dist/src/mcp/workspaces.js +6 -4
- package/dist/src/mcp/workspaces.js.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.d.ts +47 -0
- package/dist/src/models/agent-onboarding-schemas.d.ts.map +1 -1
- package/dist/src/models/agent-onboarding-schemas.js +117 -0
- package/dist/src/models/agent-onboarding-schemas.js.map +1 -1
- package/dist/src/models/offer-schemas.d.ts +8 -8
- package/dist/src/routes/agent-onboarding.d.ts +5 -0
- package/dist/src/routes/agent-onboarding.d.ts.map +1 -1
- package/dist/src/routes/agent-onboarding.js +21 -2
- package/dist/src/routes/agent-onboarding.js.map +1 -1
- package/dist/src/routes/ai.d.ts +8 -4
- package/dist/src/routes/ai.d.ts.map +1 -1
- package/dist/src/routes/ai.js +38 -14
- package/dist/src/routes/ai.js.map +1 -1
- package/dist/src/routes/app-grants.d.ts +2 -0
- package/dist/src/routes/app-grants.d.ts.map +1 -1
- package/dist/src/routes/app-grants.js +7 -1
- package/dist/src/routes/app-grants.js.map +1 -1
- package/dist/src/routes/app-templates.d.ts +16 -0
- package/dist/src/routes/app-templates.d.ts.map +1 -0
- package/dist/src/routes/app-templates.js +40 -0
- package/dist/src/routes/app-templates.js.map +1 -0
- package/dist/src/routes/apps.d.ts.map +1 -1
- package/dist/src/routes/apps.js +55 -5
- package/dist/src/routes/apps.js.map +1 -1
- package/dist/src/routes/auth.d.ts +3 -0
- package/dist/src/routes/auth.d.ts.map +1 -1
- package/dist/src/routes/auth.js +9 -4
- package/dist/src/routes/auth.js.map +1 -1
- package/dist/src/routes/bootstrap.d.ts.map +1 -1
- package/dist/src/routes/bootstrap.js +1 -0
- package/dist/src/routes/bootstrap.js.map +1 -1
- package/dist/src/routes/generator.d.ts.map +1 -1
- package/dist/src/routes/generator.js +3 -2
- package/dist/src/routes/generator.js.map +1 -1
- package/dist/src/routes/lib-ai.d.ts +0 -1
- package/dist/src/routes/lib-ai.d.ts.map +1 -1
- package/dist/src/routes/lib-ai.js +13 -6
- package/dist/src/routes/lib-ai.js.map +1 -1
- package/dist/src/routes/lib-header.d.ts +2 -0
- package/dist/src/routes/lib-header.d.ts.map +1 -1
- package/dist/src/routes/lib-header.js +7 -16
- package/dist/src/routes/lib-header.js.map +1 -1
- package/dist/src/routes/lib-markdown.d.ts +18 -0
- package/dist/src/routes/lib-markdown.d.ts.map +1 -0
- package/dist/src/routes/lib-markdown.js +236 -0
- package/dist/src/routes/lib-markdown.js.map +1 -0
- package/dist/src/routes/libs.d.ts +22 -0
- package/dist/src/routes/libs.d.ts.map +1 -1
- package/dist/src/routes/libs.js +133 -10
- package/dist/src/routes/libs.js.map +1 -1
- package/dist/src/routes/memory.d.ts.map +1 -1
- package/dist/src/routes/memory.js +21 -2
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/openrouter.d.ts +4 -0
- package/dist/src/routes/openrouter.d.ts.map +1 -1
- package/dist/src/routes/openrouter.js +17 -0
- package/dist/src/routes/openrouter.js.map +1 -1
- package/dist/src/routes/organisms.d.ts.map +1 -1
- package/dist/src/routes/organisms.js +107 -7
- package/dist/src/routes/organisms.js.map +1 -1
- package/dist/src/routes/portal.d.ts +9 -0
- package/dist/src/routes/portal.d.ts.map +1 -1
- package/dist/src/routes/portal.js +1 -1
- package/dist/src/routes/portal.js.map +1 -1
- package/dist/src/routes/public-stats.d.ts +3 -0
- package/dist/src/routes/public-stats.d.ts.map +1 -1
- package/dist/src/routes/public-stats.js +9 -2
- package/dist/src/routes/public-stats.js.map +1 -1
- package/dist/src/routes/secretary.d.ts +34 -0
- package/dist/src/routes/secretary.d.ts.map +1 -0
- package/dist/src/routes/secretary.js +311 -0
- package/dist/src/routes/secretary.js.map +1 -0
- package/dist/src/routes/specialists.d.ts.map +1 -1
- package/dist/src/routes/specialists.js +21 -0
- package/dist/src/routes/specialists.js.map +1 -1
- package/dist/src/routes/subdomains.js +1 -1
- package/dist/src/routes/subdomains.js.map +1 -1
- package/dist/src/routes/workflows.d.ts +9 -3
- package/dist/src/routes/workflows.d.ts.map +1 -1
- package/dist/src/routes/workflows.js +9 -3
- package/dist/src/routes/workflows.js.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
- package/dist/src/server-bootstrap/routes-loader.js +4 -0
- package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
- package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
- package/dist/src/server-bootstrap/service-init.js +7 -0
- package/dist/src/server-bootstrap/service-init.js.map +1 -1
- package/dist/src/server-bootstrap/static-files.d.ts +4 -0
- package/dist/src/server-bootstrap/static-files.d.ts.map +1 -1
- package/dist/src/server-bootstrap/static-files.js +18 -0
- package/dist/src/server-bootstrap/static-files.js.map +1 -1
- package/dist/src/services/archive.d.ts +74 -0
- package/dist/src/services/archive.d.ts.map +1 -0
- package/dist/src/services/archive.js +132 -0
- package/dist/src/services/archive.js.map +1 -0
- package/dist/src/services/cortex-seeder.d.ts +4 -1
- package/dist/src/services/cortex-seeder.d.ts.map +1 -1
- package/dist/src/services/cortex-seeder.js +25 -6
- package/dist/src/services/cortex-seeder.js.map +1 -1
- package/dist/src/services/directory.d.ts.map +1 -1
- package/dist/src/services/directory.js +3 -2
- package/dist/src/services/directory.js.map +1 -1
- package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
- package/dist/src/services/generator-prompt-seeds.js +5 -4
- package/dist/src/services/generator-prompt-seeds.js.map +1 -1
- package/dist/src/services/message-send.d.ts.map +1 -1
- package/dist/src/services/message-send.js +14 -0
- package/dist/src/services/message-send.js.map +1 -1
- package/dist/src/services/onboarding-guide.d.ts +53 -0
- package/dist/src/services/onboarding-guide.d.ts.map +1 -0
- package/dist/src/services/onboarding-guide.js +81 -0
- package/dist/src/services/onboarding-guide.js.map +1 -0
- package/dist/src/services/organism-search.d.ts +6 -2
- package/dist/src/services/organism-search.d.ts.map +1 -1
- package/dist/src/services/organism-search.js +2 -2
- package/dist/src/services/organism-search.js.map +1 -1
- package/dist/src/services/owner-memory.d.ts +1 -0
- package/dist/src/services/owner-memory.d.ts.map +1 -1
- package/dist/src/services/owner-memory.js.map +1 -1
- package/dist/src/services/owner-session.d.ts +1 -0
- package/dist/src/services/owner-session.d.ts.map +1 -1
- package/dist/src/services/owner-session.js +10 -2
- package/dist/src/services/owner-session.js.map +1 -1
- package/dist/src/services/package-seeder.d.ts +22 -0
- package/dist/src/services/package-seeder.d.ts.map +1 -0
- package/dist/src/services/package-seeder.js +30 -0
- package/dist/src/services/package-seeder.js.map +1 -0
- package/dist/src/services/presence.d.ts +3 -0
- package/dist/src/services/presence.d.ts.map +1 -1
- package/dist/src/services/presence.js +10 -0
- package/dist/src/services/presence.js.map +1 -1
- package/dist/src/services/prompt-defaults.d.ts.map +1 -1
- package/dist/src/services/prompt-defaults.js +8 -3
- package/dist/src/services/prompt-defaults.js.map +1 -1
- package/dist/src/services/scheduler.d.ts +50 -2
- package/dist/src/services/scheduler.d.ts.map +1 -1
- package/dist/src/services/scheduler.js +454 -26
- package/dist/src/services/scheduler.js.map +1 -1
- package/dist/src/services/secretary-authoring.d.ts +71 -0
- package/dist/src/services/secretary-authoring.d.ts.map +1 -0
- package/dist/src/services/secretary-authoring.js +336 -0
- package/dist/src/services/secretary-authoring.js.map +1 -0
- package/dist/src/services/secretary-clarify.d.ts +57 -0
- package/dist/src/services/secretary-clarify.d.ts.map +1 -0
- package/dist/src/services/secretary-clarify.js +104 -0
- package/dist/src/services/secretary-clarify.js.map +1 -0
- package/dist/src/services/secretary-feed.d.ts +11 -0
- package/dist/src/services/secretary-feed.d.ts.map +1 -0
- package/dist/src/services/secretary-feed.js +28 -0
- package/dist/src/services/secretary-feed.js.map +1 -0
- package/dist/src/services/secretary-tick.d.ts +243 -3
- package/dist/src/services/secretary-tick.d.ts.map +1 -1
- package/dist/src/services/secretary-tick.js +273 -3
- package/dist/src/services/secretary-tick.js.map +1 -1
- package/dist/src/services/secretary-workbrief.d.ts +144 -0
- package/dist/src/services/secretary-workbrief.d.ts.map +1 -0
- package/dist/src/services/secretary-workbrief.js +315 -0
- package/dist/src/services/secretary-workbrief.js.map +1 -0
- package/dist/src/services/secretary-worktier.d.ts +118 -0
- package/dist/src/services/secretary-worktier.d.ts.map +1 -0
- package/dist/src/services/secretary-worktier.js +157 -0
- package/dist/src/services/secretary-worktier.js.map +1 -0
- package/dist/src/services/skill-bundle/generator.d.ts +3 -0
- package/dist/src/services/skill-bundle/generator.d.ts.map +1 -1
- package/dist/src/services/skill-bundle/generator.js +19 -0
- package/dist/src/services/skill-bundle/generator.js.map +1 -1
- package/dist/src/services/specialist-runner.d.ts +36 -0
- package/dist/src/services/specialist-runner.d.ts.map +1 -0
- package/dist/src/services/specialist-runner.js +91 -0
- package/dist/src/services/specialist-runner.js.map +1 -0
- package/dist/src/services/specialist.d.ts +9 -0
- package/dist/src/services/specialist.d.ts.map +1 -1
- package/dist/src/services/specialist.js +42 -0
- package/dist/src/services/specialist.js.map +1 -1
- package/dist/src/services/structure-overview.d.ts +13 -0
- package/dist/src/services/structure-overview.d.ts.map +1 -1
- package/dist/src/services/structure-overview.js +34 -11
- package/dist/src/services/structure-overview.js.map +1 -1
- package/dist/src/services/system-agent-responder.d.ts +36 -0
- package/dist/src/services/system-agent-responder.d.ts.map +1 -0
- package/dist/src/services/system-agent-responder.js +107 -0
- package/dist/src/services/system-agent-responder.js.map +1 -0
- package/dist/src/services/system-agent.d.ts +34 -1
- package/dist/src/services/system-agent.d.ts.map +1 -1
- package/dist/src/services/system-agent.js +73 -0
- package/dist/src/services/system-agent.js.map +1 -1
- package/dist/src/storage/interface.d.ts +33 -0
- package/dist/src/storage/interface.d.ts.map +1 -1
- package/dist/src/storage/interface.js.map +1 -1
- package/dist/src/storage/providers/mongodb/index.d.ts +37 -0
- package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
- package/dist/src/storage/providers/mongodb/index.js +132 -12
- package/dist/src/storage/providers/mongodb/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/index.d.ts +23 -1
- package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/index.js +60 -8
- package/dist/src/storage/providers/sqlite/index.js.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/memory.d.ts +29 -1
- package/dist/src/storage/providers/sqlite/repos/memory.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/repos/memory.js +109 -10
- package/dist/src/storage/providers/sqlite/repos/memory.js.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.d.ts +3 -0
- package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
- package/dist/src/storage/providers/sqlite/schema.js +64 -9
- package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
- package/dist/src/storage/repositories/app.repository.d.ts +15 -0
- package/dist/src/storage/repositories/app.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/memory.repository.d.ts +41 -1
- package/dist/src/storage/repositories/memory.repository.d.ts.map +1 -1
- package/dist/src/storage/repositories/organism.repository.d.ts +2 -1
- package/dist/src/storage/repositories/organism.repository.d.ts.map +1 -1
- package/dist/static/app-catalog.html +469 -122
- package/package.json +2 -1
- package/prisma/schema.postgres.prisma +10 -0
- package/prisma/schema.prisma +12 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file secretary-authoring.ts
|
|
3
|
+
* @description Autonomous content authoring for the Secretary tick (document-first). The tick used to
|
|
4
|
+
* only file a free-text note into a generic `notes` bucket; this lets it actually FILL the active
|
|
5
|
+
* context's workspaces. It reads each workspace's manifest, finds EMPTY memory-backed spaces —
|
|
6
|
+
* document spaces FIRST (free markdown "about a topic"), then record spaces (schema-bound, list/task
|
|
7
|
+
* shaped) — and asks the owner's AI to author real content toward the strategy's focus milestone. The
|
|
8
|
+
* model MAY draw on its general knowledge (per the owner's setup choice), grounded in the strategy +
|
|
9
|
+
* existing material. Each item is written as a draft and, when the authoring band is 'act' and the
|
|
10
|
+
* workspace publish gate is off, published straight away. Band 'draft'/'ask' leaves drafts for review;
|
|
11
|
+
* 'off' skips the phase entirely. The draft→publish convention mirrors src/mcp/workspaces.ts so the
|
|
12
|
+
* activity feed, counts and reads see exactly what an agent's workspace writes would produce.
|
|
13
|
+
*
|
|
14
|
+
* Metered: one paid AI call per workspace that has something to fill; the caller passes the remaining
|
|
15
|
+
* per-day morsel budget and authoring stops when it's exhausted. Content is attributed to the
|
|
16
|
+
* Secretary's GAII so the workspace activity feed credits the secretary, not the bare owner.
|
|
17
|
+
* @structure authorWorkspaceContent(storage, config, owner, ownerName, active, wsList, opts) · pure helpers
|
|
18
|
+
* @usage import { authorWorkspaceContent } from './secretary-authoring.js';
|
|
19
|
+
* @version-history
|
|
20
|
+
* v0.4.0 — 2026-06-30 — Authoring prompt now tells the model it MAY use ```mermaid diagrams in documents
|
|
21
|
+
* (the doc viewer renders them) — but judiciously, only where a chart genuinely clarifies, never by default.
|
|
22
|
+
* v0.3.0 — 2026-06-30 — Retry transient provider failures (completeWithRetry), honouring the owner's
|
|
23
|
+
* autoRetry/maxRetries. Stealth/alpha endpoints (owl-alpha) intermittently 400 and succeed on the next
|
|
24
|
+
* attempt — a single try killed the authoring even though the model is fine; permanent failures (bad
|
|
25
|
+
* key/malformed) are still not retried. Plus visible failures (log + ⚠️ feed line) from v0.2.x.
|
|
26
|
+
* v0.2.0 — 2026-06-30 — Agentic, not one-shot: each record space's exact JSON Schema goes into the
|
|
27
|
+
* prompt, and a rejected record's validation errors are fed BACK to the model for a bounded
|
|
28
|
+
* correction round (read→write→see-error→correct) instead of being silently dropped. writeAndMaybePublish
|
|
29
|
+
* now returns the schema errors so the loop can self-correct.
|
|
30
|
+
* v0.1.0 — 2026-06-30 — Initial: document-first autonomous authoring phase for the secretary tick
|
|
31
|
+
* (band-gated act→publish / draft→review, budget-metered, fills empty spaces toward the focus milestone).
|
|
32
|
+
*/
|
|
33
|
+
import { randomUUID } from 'node:crypto';
|
|
34
|
+
import { completeForOwner } from './ai-completion.js';
|
|
35
|
+
import { validateMemoryWrite } from './schema-validator.js';
|
|
36
|
+
import { isMemoryBackedSpace } from './workspace-meta.js';
|
|
37
|
+
import { emitChange } from './event-bus.js';
|
|
38
|
+
import { logger } from '../utils/logger.js';
|
|
39
|
+
/** Error codes that are PERMANENT (don't retry) — a bad key / malformed request won't fix itself. */
|
|
40
|
+
const PERMANENT_AI_CODES = new Set(['INVALID_API_KEY', 'INVALID_BODY', 'PROMPT_TOO_LONG', 'APP_NOT_ALLOWED', 'APP_ID_REQUIRED']);
|
|
41
|
+
/**
|
|
42
|
+
* Run a completion, retrying on TRANSIENT provider failures up to `maxRetries` times with a short linear
|
|
43
|
+
* backoff. Stealth/alpha endpoints (e.g. owl-alpha) intermittently return a provider error and succeed on
|
|
44
|
+
* the next attempt — a single try kills the authoring even though the model is fine. Permanent failures
|
|
45
|
+
* (bad key, malformed request) are thrown immediately. The final failure is re-thrown for the caller to
|
|
46
|
+
* surface. A retried attempt that failed costs nothing (the provider 400s before billing).
|
|
47
|
+
*/
|
|
48
|
+
async function completeWithRetry(run, args, maxRetries, label) {
|
|
49
|
+
let lastErr;
|
|
50
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
51
|
+
try {
|
|
52
|
+
return await run(args);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
lastErr = e;
|
|
56
|
+
const code = e?.code;
|
|
57
|
+
if (code && PERMANENT_AI_CODES.has(code))
|
|
58
|
+
throw e; // permanent → don't waste retries
|
|
59
|
+
if (attempt < maxRetries) {
|
|
60
|
+
logger.warn('Secretary authoring: transient completion error, retrying', { label, attempt: attempt + 1, of: maxRetries, error: e?.message });
|
|
61
|
+
await new Promise((r) => setTimeout(r, 750 * (attempt + 1)));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
throw lastErr;
|
|
66
|
+
}
|
|
67
|
+
/** Document-space predicate — mirrors the frontend isDocSpace + server normalizeObjectTypes inference. */
|
|
68
|
+
function isDocSpace(ot) {
|
|
69
|
+
return ot.mode === 'document' || (!ot.mode && ot.kind === 'document');
|
|
70
|
+
}
|
|
71
|
+
/** Distinct existing instance ids for one space (bare/latest/draft count; version-only does not). */
|
|
72
|
+
function instancesOf(content, root, namespace) {
|
|
73
|
+
const present = new Map();
|
|
74
|
+
const nsPrefix = `${root}.${namespace}.`;
|
|
75
|
+
for (const r of content) {
|
|
76
|
+
if (!r.key.startsWith(nsPrefix))
|
|
77
|
+
continue;
|
|
78
|
+
const parts = r.key.slice(nsPrefix.length).split('.');
|
|
79
|
+
const id = parts[0];
|
|
80
|
+
const role = parts.slice(1).join('.');
|
|
81
|
+
if (role.startsWith('version.')) {
|
|
82
|
+
if (!present.has(id))
|
|
83
|
+
present.set(id, false);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
present.set(id, true);
|
|
87
|
+
}
|
|
88
|
+
const ids = new Set();
|
|
89
|
+
for (const [id, real] of present)
|
|
90
|
+
if (real)
|
|
91
|
+
ids.add(id);
|
|
92
|
+
return ids;
|
|
93
|
+
}
|
|
94
|
+
/** Tolerant JSON-object extraction from a model reply (may be fenced / wrapped in prose). */
|
|
95
|
+
function extractJsonObject(text) {
|
|
96
|
+
let s = String(text || '').trim();
|
|
97
|
+
const fence = s.match(/```(?:json)?\s*\n?([\s\S]*?)```/i);
|
|
98
|
+
if (fence)
|
|
99
|
+
s = fence[1].trim();
|
|
100
|
+
if (s[0] !== '{') {
|
|
101
|
+
const i = s.indexOf('{');
|
|
102
|
+
const j = s.lastIndexOf('}');
|
|
103
|
+
if (i >= 0 && j > i)
|
|
104
|
+
s = s.slice(i, j + 1);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const v = JSON.parse(s);
|
|
108
|
+
return v && typeof v === 'object' && !Array.isArray(v) ? v : null;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Slug an instance id from a title (id stays stable-ish + unique via a short suffix). */
|
|
115
|
+
function slugId(title, prefix) {
|
|
116
|
+
const base = String(title || '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 40);
|
|
117
|
+
return `${base || prefix}-${randomUUID().slice(0, 6)}`;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Author content into the active context's workspaces. Returns the writes, per-workspace feed lines, and
|
|
121
|
+
* the morsels spent. Safe no-op (empty result) when the band is 'off', there's no organism, or nothing is
|
|
122
|
+
* empty to fill. Never throws on a single bad item — a record that fails its schema (or a workspace whose
|
|
123
|
+
* AI reply won't parse) is skipped, not fatal, so one bad space can't sink the whole tick.
|
|
124
|
+
*/
|
|
125
|
+
export async function authorWorkspaceContent(storage, config, owner, ownerName, active, wsList, opts) {
|
|
126
|
+
const result = { writes: [], summaries: [], morsels: 0 };
|
|
127
|
+
if (opts.band === 'off' || !active.organismId || !wsList.length)
|
|
128
|
+
return result;
|
|
129
|
+
const runComplete = opts.complete ?? ((a) => completeForOwner(storage, config, owner, a));
|
|
130
|
+
const orgId = active.organismId;
|
|
131
|
+
const writerGaii = `secretary#${ownerName}@${config.nodeId}`;
|
|
132
|
+
const publishWanted = opts.band === 'act';
|
|
133
|
+
// Honour the workspace publish gate: if it's on, leave everything as drafts for human review even on act.
|
|
134
|
+
const cfgRec = await storage.getMemory(owner, `organism.${orgId}.meta.config`);
|
|
135
|
+
const gateOn = !!cfgRec?.value?.gates?.publish?.enabled;
|
|
136
|
+
const doPublish = publishWanted && !gateOn;
|
|
137
|
+
const MAX_WS = 12; // bound the per-tick fan-out
|
|
138
|
+
const MAX_DOC_SPACES = opts.aggressive ? 8 : 2; // empty doc spaces filled per workspace
|
|
139
|
+
const MAX_REC_SPACES = opts.aggressive ? 8 : 1; // empty record spaces filled per workspace
|
|
140
|
+
const RECS_PER_SPACE = opts.aggressive ? 3 : 1;
|
|
141
|
+
for (const ws of wsList.slice(0, MAX_WS)) {
|
|
142
|
+
if (opts.budgetRemaining !== null && result.morsels >= opts.budgetRemaining)
|
|
143
|
+
break;
|
|
144
|
+
const root = `organism.${orgId}.w.${ws.id}`;
|
|
145
|
+
const manRec = (await storage.listAllMemory({ prefix: `${root}.meta.manifest`, limit: 5 })).items.find((r) => r.key === `${root}.meta.manifest`);
|
|
146
|
+
const manifest = manRec?.value;
|
|
147
|
+
const types = manifest?.objectTypes;
|
|
148
|
+
if (!Array.isArray(types) || !types.length)
|
|
149
|
+
continue;
|
|
150
|
+
const { items: content } = await storage.listAllMemory({ prefix: `${root}.`, limit: 5000 });
|
|
151
|
+
// Find the EMPTY memory-backed spaces — documents first, then records.
|
|
152
|
+
const emptyDocs = [];
|
|
153
|
+
const emptyRecs = [];
|
|
154
|
+
for (const ot of types) {
|
|
155
|
+
if (!ot.namespace || !ot.name || !isMemoryBackedSpace(ot))
|
|
156
|
+
continue;
|
|
157
|
+
if (instancesOf(content, root, ot.namespace).size > 0)
|
|
158
|
+
continue; // only fill empties (idempotent / converges)
|
|
159
|
+
if (isDocSpace(ot))
|
|
160
|
+
emptyDocs.push(ot);
|
|
161
|
+
else
|
|
162
|
+
emptyRecs.push(ot);
|
|
163
|
+
}
|
|
164
|
+
const docTargets = emptyDocs.slice(0, MAX_DOC_SPACES);
|
|
165
|
+
const recTargets = emptyRecs.slice(0, MAX_REC_SPACES);
|
|
166
|
+
if (!docTargets.length && !recTargets.length)
|
|
167
|
+
continue; // nothing to fill here — no paid call
|
|
168
|
+
// Build the authoring prompt for THIS workspace.
|
|
169
|
+
const readmeRec = content.find((r) => r.key === `${root}.meta.readme`);
|
|
170
|
+
const readme = typeof readmeRec?.value === 'string' ? readmeRec.value : '';
|
|
171
|
+
const strat = active.strategy;
|
|
172
|
+
const focus = strat?.enabled ? (strat.milestones || []).find((m) => m && m.status !== 'reached') : undefined;
|
|
173
|
+
const goalLines = opts.openGoals.length
|
|
174
|
+
? opts.openGoals.map((g) => `- ${String(g.title || '')}${g.why ? ` (why: ${String(g.why)})` : ''}`).join('\n')
|
|
175
|
+
: '(no open goals)';
|
|
176
|
+
const strategyBlock = strat?.enabled
|
|
177
|
+
? `\nStrategy for this area:\n- Current state: ${strat.current || '(unstated)'}\n- Target state: ${strat.target || '(unstated)'}\n- Focus milestone: ${focus ? `${focus.title}${focus.enables ? ` (${focus.enables})` : ''}` : '(all reached)'}`
|
|
178
|
+
+ ((strat.principles || []).filter(Boolean).length ? `\n- Principles to respect: ${(strat.principles || []).filter(Boolean).join('; ')}` : '')
|
|
179
|
+
: '';
|
|
180
|
+
const docList = docTargets.map((o) => `- "${o.name}"${manifest && typeof o.purpose === 'string' ? ` — ${o.purpose}` : ''}`).join('\n') || '(none)';
|
|
181
|
+
// Give the model the EXACT JSON Schema for each record space (not just field names) so it conforms
|
|
182
|
+
// on the first shot — and so the correction round can point at concrete schema violations.
|
|
183
|
+
const recSchemas = new Map();
|
|
184
|
+
for (const o of recTargets) {
|
|
185
|
+
const sc = await storage.findApplicableSchema(`${root}.${o.namespace}.__probe`);
|
|
186
|
+
if (sc?.schemaJson)
|
|
187
|
+
recSchemas.set(o.name, sc.schemaJson);
|
|
188
|
+
}
|
|
189
|
+
const recList = recTargets.map((o) => {
|
|
190
|
+
const sc = recSchemas.get(o.name);
|
|
191
|
+
if (sc)
|
|
192
|
+
return `- "${o.name}" — each record MUST satisfy this JSON Schema: ${JSON.stringify(sc)}`;
|
|
193
|
+
const fields = (o.fields || []).filter((f) => f && f.name).map((f) => `${f.name}${f.type ? `:${f.type}` : ''}`).join(', ');
|
|
194
|
+
return `- "${o.name}"${fields ? ` — fields: ${fields}` : ''}`;
|
|
195
|
+
}).join('\n') || '(none)';
|
|
196
|
+
const systemPrompt = `You are ${ownerName}'s personal Secretary, working autonomously (the owner is not present) in the "${active.name || 'personal'}" context. `
|
|
197
|
+
+ `${active.brain?.purpose || ''} You are FILLING the owner's workspace with real, useful content toward their strategy. `
|
|
198
|
+
+ `${opts.useGeneralKnowledge ? 'You MAY use your own general knowledge to write substantive, correct material' : 'Use ONLY what the owner has given you — organise and synthesise it, never invent facts'}, always grounded in the strategy and the workspace's purpose. `
|
|
199
|
+
+ `Write in the owner's language. Return ONLY a JSON object — no prose around it.`;
|
|
200
|
+
const prompt = `Workspace: "${ws.name}"${readme ? `\nWorkspace intro:\n${readme.slice(0, 1200)}` : ''}\n${strategyBlock}\n\nOpen goals:\n${goalLines}\n\n`
|
|
201
|
+
+ `DOCUMENT spaces to fill (free markdown about a topic — the important ones; write one substantial, well-structured document for EACH):\n${docList}\n\n`
|
|
202
|
+
+ `RECORD spaces to fill (structured list/task entries; add ${RECS_PER_SPACE} concrete, realistic entr${RECS_PER_SPACE === 1 ? 'y' : 'ies'} for EACH, matching its fields):\n${recList}\n\n`
|
|
203
|
+
+ `Return a JSON object EXACTLY like:\n`
|
|
204
|
+
+ `{\n "documents": [ { "space": "<exact document space name above>", "title": "a clear title", "markdown": "# Title\\n\\nReal, structured content in markdown…" } ],\n`
|
|
205
|
+
+ ` "records": [ { "space": "<exact record space name above>", "record": { "<field>": "<value>", "...": "..." } } ]\n}\n`
|
|
206
|
+
+ `Make every document genuinely useful and specific to this area — headings, substance, not a placeholder. Use the EXACT space names listed above. If a space truly has nothing to add, omit it. `
|
|
207
|
+
+ 'A document MAY include a Mermaid diagram via a ```mermaid fenced code block (it renders as a real chart) — but use it JUDICIOUSLY, only where a flowchart, sequence, timeline or relationship genuinely clarifies the content. Do NOT add diagrams by default or decoratively; most documents need none.';
|
|
208
|
+
let reply;
|
|
209
|
+
try {
|
|
210
|
+
const completion = await completeWithRetry(runComplete, { prompt, systemPrompt, appId: opts.appId }, opts.maxRetries ?? 0, ws.name);
|
|
211
|
+
result.morsels += 1;
|
|
212
|
+
reply = completion.content;
|
|
213
|
+
}
|
|
214
|
+
catch (e) {
|
|
215
|
+
// Don't sink the other workspaces — but DON'T fail silently either (the whole point): log it and
|
|
216
|
+
// surface a feed line so the owner sees "couldn't fill X" instead of nothing happening.
|
|
217
|
+
logger.warn('Secretary authoring: completion failed', { ws: ws.name, error: e?.message });
|
|
218
|
+
result.summaries.push(`⚠️ Couldn't author into ${ws.name}: ${e?.message || 'the AI call failed'}`);
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
const parsed = extractJsonObject(reply);
|
|
222
|
+
if (!parsed) {
|
|
223
|
+
logger.warn('Secretary authoring: reply did not parse as JSON', { ws: ws.name, head: reply.slice(0, 300) });
|
|
224
|
+
result.summaries.push(`⚠️ Couldn't author into ${ws.name}: the AI reply was not usable JSON`);
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
let docCount = 0;
|
|
228
|
+
let recCount = 0;
|
|
229
|
+
const docByName = new Map(docTargets.map((o) => [o.name, o]));
|
|
230
|
+
const recByName = new Map(recTargets.map((o) => [o.name, o]));
|
|
231
|
+
// Documents (priority — free markdown, no schema to fight).
|
|
232
|
+
const documents = Array.isArray(parsed.documents) ? parsed.documents : [];
|
|
233
|
+
for (const d of documents) {
|
|
234
|
+
if (!d || typeof d !== 'object')
|
|
235
|
+
continue;
|
|
236
|
+
const dd = d;
|
|
237
|
+
const ot = docByName.get(String(dd.space ?? '').trim());
|
|
238
|
+
const title = String(dd.title ?? '').trim();
|
|
239
|
+
const markdown = String(dd.markdown ?? '').trim();
|
|
240
|
+
if (!ot || !ot.namespace || !title || !markdown)
|
|
241
|
+
continue;
|
|
242
|
+
const id = slugId(title, 'doc');
|
|
243
|
+
const res = await writeAndMaybePublish(storage, config, root, ot.namespace, id, { id, title: title.slice(0, 200), markdown }, doPublish, writerGaii);
|
|
244
|
+
if (res.writes.length) {
|
|
245
|
+
result.writes.push(...res.writes);
|
|
246
|
+
docCount++;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Records (secondary) — AGENTIC: write each, and when the schema REJECTS one, feed the exact errors
|
|
250
|
+
// back to the model for a bounded correction round (read→write→see-error→correct), instead of
|
|
251
|
+
// silently dropping it. This is what makes the MCP agent path "just work"; one-shot drop is what made
|
|
252
|
+
// the old generator path tökkii. MAX_CORRECTION bounds the cost (each round is one metered call).
|
|
253
|
+
const MAX_CORRECTION = 1;
|
|
254
|
+
const toPending = (arr) => (Array.isArray(arr) ? arr : [])
|
|
255
|
+
.filter((r) => !!r && typeof r === 'object' && !Array.isArray(r))
|
|
256
|
+
.map((r) => {
|
|
257
|
+
const rec = r.record;
|
|
258
|
+
return { space: String(r.space ?? '').trim(), record: (rec && typeof rec === 'object' && !Array.isArray(rec)) ? rec : {} };
|
|
259
|
+
})
|
|
260
|
+
.filter((x) => x.space && Object.keys(x.record).length > 0);
|
|
261
|
+
let pending = toPending(parsed.records);
|
|
262
|
+
for (let round = 0; round <= MAX_CORRECTION && pending.length; round++) {
|
|
263
|
+
const rejected = [];
|
|
264
|
+
for (const item of pending) {
|
|
265
|
+
const ot = recByName.get(item.space);
|
|
266
|
+
if (!ot || !ot.namespace)
|
|
267
|
+
continue;
|
|
268
|
+
const id = slugId(String(item.record.title ?? item.record.name ?? ''), 'rec');
|
|
269
|
+
const res = await writeAndMaybePublish(storage, config, root, ot.namespace, id, { ...item.record, id }, doPublish, writerGaii);
|
|
270
|
+
if (res.writes.length) {
|
|
271
|
+
result.writes.push(...res.writes);
|
|
272
|
+
recCount++;
|
|
273
|
+
}
|
|
274
|
+
else
|
|
275
|
+
rejected.push({ space: item.space, record: item.record, errors: res.errors });
|
|
276
|
+
}
|
|
277
|
+
// Done if nothing was rejected, no rounds left, or the budget is spent.
|
|
278
|
+
if (!rejected.length || round === MAX_CORRECTION)
|
|
279
|
+
break;
|
|
280
|
+
if (opts.budgetRemaining !== null && result.morsels >= opts.budgetRemaining)
|
|
281
|
+
break;
|
|
282
|
+
const fixPrompt = `Some records you produced for workspace "${ws.name}" were REJECTED by the schema. Fix ONLY these and return the corrected records.\n\n`
|
|
283
|
+
+ rejected.map((x, i) => `${i + 1}. space "${x.space}" — rejected record: ${JSON.stringify(x.record)}\n schema errors: ${JSON.stringify(x.errors)}`).join('\n\n')
|
|
284
|
+
+ `\n\nFor each, follow that space's JSON Schema EXACTLY: add any required field, fix wrong types, and keep within the allowed fields. Return ONLY:\n{ "records": [ { "space": "<space name>", "record": { ... } } ] }`;
|
|
285
|
+
try {
|
|
286
|
+
const fix = await completeWithRetry(runComplete, { prompt: fixPrompt, systemPrompt, appId: opts.appId }, opts.maxRetries ?? 0, `${ws.name} (correction)`);
|
|
287
|
+
result.morsels += 1;
|
|
288
|
+
pending = toPending(extractJsonObject(fix.content)?.records);
|
|
289
|
+
}
|
|
290
|
+
catch (e) {
|
|
291
|
+
logger.warn('Secretary authoring: correction call failed', { ws: ws.name, error: e?.message });
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (docCount || recCount) {
|
|
296
|
+
const parts = [];
|
|
297
|
+
if (docCount)
|
|
298
|
+
parts.push(`${docCount} document${docCount === 1 ? '' : 's'}`);
|
|
299
|
+
if (recCount)
|
|
300
|
+
parts.push(`${recCount} record${recCount === 1 ? '' : 's'}`);
|
|
301
|
+
result.summaries.push(`🖊️ Authored ${parts.join(' + ')} into ${ws.name}${doPublish ? ' (published)' : ' (drafts for review)'}`);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
// Parsed fine but produced nothing usable (wrong space names / empty arrays) — surface it, don't vanish.
|
|
305
|
+
logger.warn('Secretary authoring: nothing authored', { ws: ws.name, head: reply.slice(0, 300) });
|
|
306
|
+
result.summaries.push(`⚠️ Tried to fill ${ws.name} but the AI returned nothing usable`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (result.writes.length)
|
|
310
|
+
emitChange('organisms');
|
|
311
|
+
return result;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Write one item as a draft and (when `publish`) promote it via the draft→publish convention
|
|
315
|
+
* (validate against the schema, write .version.N + .latest, delete the draft) — identical semantics
|
|
316
|
+
* to aimeat_workspace_write + _publish. Returns `{ writes, errors }`: on a schema rejection nothing is
|
|
317
|
+
* written and `errors` carries the validation problems so the caller can feed them BACK to the model
|
|
318
|
+
* for a correction round (the read→write→see-error→correct loop, not a one-shot drop). Free-markdown
|
|
319
|
+
* document spaces carry no schema, so they always validate; record spaces validate against their schema.
|
|
320
|
+
*/
|
|
321
|
+
async function writeAndMaybePublish(storage, config, root, namespace, instanceId, value, publish, writerGaii) {
|
|
322
|
+
const base = `${root}.${namespace}.${instanceId}`;
|
|
323
|
+
const draftKey = `${base}.draft`;
|
|
324
|
+
const draftValid = await validateMemoryWrite(draftKey, value, storage);
|
|
325
|
+
if (!draftValid.valid)
|
|
326
|
+
return { writes: [], errors: draftValid.errors ?? 'schema rejected' };
|
|
327
|
+
const now = new Date().toISOString();
|
|
328
|
+
await storage.setMemory({ key: draftKey, ownerGaii: writerGaii, value, visibility: 'private', tags: ['secretary', 'authored'], ttlHours: null, version: 1, createdAt: now, updatedAt: now });
|
|
329
|
+
if (!publish)
|
|
330
|
+
return { writes: [draftKey], errors: null };
|
|
331
|
+
await storage.setMemory({ key: `${base}.version.1`, ownerGaii: writerGaii, value, visibility: 'private', tags: ['secretary', 'authored'], ttlHours: null, version: 1, createdAt: now, updatedAt: now });
|
|
332
|
+
await storage.setMemory({ key: `${base}.latest`, ownerGaii: writerGaii, value, visibility: 'private', tags: ['secretary', 'authored'], ttlHours: null, version: 1, createdAt: now, updatedAt: now });
|
|
333
|
+
await storage.deleteMemory(writerGaii, draftKey);
|
|
334
|
+
return { writes: [`${base}.latest`, `${base}.version.1`], errors: null };
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=secretary-authoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretary-authoring.js","sourceRoot":"","sources":["../../../src/services/secretary-authoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Storage } from '../storage/interface.js';
|
|
2
|
+
import type { DeliveryCtx } from './message-delivery.js';
|
|
3
|
+
/** A clarify question (subset used for rendering the produce prompt). */
|
|
4
|
+
export interface ClarifyQuestion {
|
|
5
|
+
id: string;
|
|
6
|
+
prompt: string;
|
|
7
|
+
options?: Array<{
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
/** The owner's answers to a clarify question set (keyed by question id). */
|
|
13
|
+
export type ClarifyAnswers = Record<string, {
|
|
14
|
+
selected?: string[];
|
|
15
|
+
other?: string | null;
|
|
16
|
+
}>;
|
|
17
|
+
/** A persisted `secretary.clarify.<id>` job. */
|
|
18
|
+
export interface ClarifyJob {
|
|
19
|
+
id: string;
|
|
20
|
+
conversationId: string;
|
|
21
|
+
questionId: string;
|
|
22
|
+
questions?: ClarifyQuestion[];
|
|
23
|
+
action?: {
|
|
24
|
+
summary?: string;
|
|
25
|
+
why?: string;
|
|
26
|
+
};
|
|
27
|
+
facts?: string;
|
|
28
|
+
contextId?: string;
|
|
29
|
+
contextName?: string;
|
|
30
|
+
organismId?: string;
|
|
31
|
+
wsId?: string;
|
|
32
|
+
status?: string;
|
|
33
|
+
createdAt?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Render the owner's interactive answers as readable text for the produce prompt. */
|
|
36
|
+
export declare function renderClarifyAnswers(questions: ClarifyQuestion[] | undefined, answers: ClarifyAnswers): string;
|
|
37
|
+
/** Find the owner's pending ('asked') clarify job for a conversation (optionally a specific questionId). */
|
|
38
|
+
export declare function findPendingClarifyJob(storage: Storage, ownerGhii: string, conversationId: string, questionId?: string): Promise<ClarifyJob | null>;
|
|
39
|
+
export interface ProduceClarifyParams {
|
|
40
|
+
ownerGhii: string;
|
|
41
|
+
ownerName: string;
|
|
42
|
+
/** The agent that asked (sends the outcome reply back as itself): `secretary#owner@node` / specialist GAII. */
|
|
43
|
+
agentGaii: string;
|
|
44
|
+
job: ClarifyJob;
|
|
45
|
+
answers: ClarifyAnswers;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Produce the deliverable for an answered clarify job: AI-complete on the owner's key grounded in the
|
|
49
|
+
* facts + answers, file it into the job's workspace (when one is set), append a feed entry, reply the
|
|
50
|
+
* outcome back into the inbox thread, and mark the job done. On AI failure the job is LEFT 'asked' (so the
|
|
51
|
+
* tick retries) and no outcome reply is sent. Returns the memory keys written + whether it produced.
|
|
52
|
+
*/
|
|
53
|
+
export declare function produceClarifyDeliverable(ctx: DeliveryCtx, params: ProduceClarifyParams): Promise<{
|
|
54
|
+
writes: string[];
|
|
55
|
+
produced: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
//# sourceMappingURL=secretary-clarify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretary-clarify.d.ts","sourceRoot":"","sources":["../../../src/services/secretary-clarify.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKzD,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAE5F,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAQ9G;AAED,4GAA4G;AAC5G,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAC/E,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAU5B;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,+GAA+G;IAC/G,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,GAC7C,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAuDlD"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file secretary-clarify.ts
|
|
3
|
+
* @description The Secretary "ask-don't-hallucinate" clarify channel — PRODUCE side. When the Secretary
|
|
4
|
+
* (or a specialist) needs facts it asks the owner a batch of structured questions in the inbox and
|
|
5
|
+
* records a `secretary.clarify.<id>` job (status 'asked'; created by routes/secretary.ts). Once the
|
|
6
|
+
* owner answers, the deliverable is produced grounded ONLY in the stored facts + those answers, filed
|
|
7
|
+
* into the job's workspace, surfaced in the feed, AND — crucially — replied back into the SAME inbox
|
|
8
|
+
* thread so the owner sees what happened (no more "I answered and nothing came back"). Shared by the
|
|
9
|
+
* autonomous tick (scheduler.resumeClarifyJobs) and the live DM responder so both paths behave the same.
|
|
10
|
+
* @structure ClarifyJob · ClarifyAnswers · renderClarifyAnswers() · findPendingClarifyJob() ·
|
|
11
|
+
* produceClarifyDeliverable()
|
|
12
|
+
* @usage const { writes, produced } = await produceClarifyDeliverable(ctx, { ownerGhii, ownerName, agentGaii, job, answers });
|
|
13
|
+
* @version-history
|
|
14
|
+
* v1.0.0 — 2026-06-28 — Extracted produce from scheduler + added the in-thread outcome reply (feedback fix).
|
|
15
|
+
*/
|
|
16
|
+
import { randomUUID } from 'node:crypto';
|
|
17
|
+
import { completeForOwner } from './ai-completion.js';
|
|
18
|
+
import { sendDirectMessage } from './message-send.js';
|
|
19
|
+
import { appendSecretaryFeed } from './secretary-feed.js';
|
|
20
|
+
/** Render the owner's interactive answers as readable text for the produce prompt. */
|
|
21
|
+
export function renderClarifyAnswers(questions, answers) {
|
|
22
|
+
return (questions || []).map((q) => {
|
|
23
|
+
const a = answers[q.id] || {};
|
|
24
|
+
const labels = (a.selected || []).map((sid) => (q.options || []).find((o) => o.id === sid)?.label || sid);
|
|
25
|
+
const parts = [...labels];
|
|
26
|
+
if (a.other)
|
|
27
|
+
parts.push(String(a.other));
|
|
28
|
+
return `- ${q.prompt} → ${parts.join(', ') || '(no answer)'}`;
|
|
29
|
+
}).join('\n');
|
|
30
|
+
}
|
|
31
|
+
/** Find the owner's pending ('asked') clarify job for a conversation (optionally a specific questionId). */
|
|
32
|
+
export async function findPendingClarifyJob(storage, ownerGhii, conversationId, questionId) {
|
|
33
|
+
const recs = await storage.listMemory(ownerGhii, { prefix: 'secretary.clarify.' }).catch(() => []);
|
|
34
|
+
for (const r of recs) {
|
|
35
|
+
const j = (r.value ?? {});
|
|
36
|
+
if (j.status !== 'asked')
|
|
37
|
+
continue;
|
|
38
|
+
if (j.conversationId !== conversationId)
|
|
39
|
+
continue;
|
|
40
|
+
if (questionId && j.questionId !== questionId)
|
|
41
|
+
continue;
|
|
42
|
+
return j;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Produce the deliverable for an answered clarify job: AI-complete on the owner's key grounded in the
|
|
48
|
+
* facts + answers, file it into the job's workspace (when one is set), append a feed entry, reply the
|
|
49
|
+
* outcome back into the inbox thread, and mark the job done. On AI failure the job is LEFT 'asked' (so the
|
|
50
|
+
* tick retries) and no outcome reply is sent. Returns the memory keys written + whether it produced.
|
|
51
|
+
*/
|
|
52
|
+
export async function produceClarifyDeliverable(ctx, params) {
|
|
53
|
+
const { storage, config } = ctx;
|
|
54
|
+
const { ownerGhii, ownerName, agentGaii, job, answers } = params;
|
|
55
|
+
const writes = [];
|
|
56
|
+
const action = job.action ?? {};
|
|
57
|
+
const answersText = renderClarifyAnswers(job.questions, answers);
|
|
58
|
+
const sys = `You are ${ownerName}'s personal Secretary. Produce the deliverable the owner asked for as a usable DRAFT, grounded ONLY in the facts and the owner's answers below. Never invent numbers, metrics, quotes, names, dates, events, or outcomes; if something is still unknown, use a [bracketed placeholder]. Markdown is fine. Output only the deliverable, no preamble.`;
|
|
59
|
+
const prompt = `Task: ${action.summary || ''}${action.why ? `\n(${action.why})` : ''}\n\nFacts:\n${job.facts || '(none)'}\n\nThe owner answered your questions:\n${answersText}`;
|
|
60
|
+
let content = action.summary || '';
|
|
61
|
+
try {
|
|
62
|
+
const r = await completeForOwner(storage, config, ownerGhii, { prompt, systemPrompt: sys, appId: 'secretary-clarify-produce' });
|
|
63
|
+
content = (r?.content || '').trim() || content;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return { writes, produced: false }; // spending paused / error → leave 'asked' to retry next tick
|
|
67
|
+
}
|
|
68
|
+
const now = new Date().toISOString();
|
|
69
|
+
const organismId = job.organismId;
|
|
70
|
+
const wsId = job.wsId;
|
|
71
|
+
let href;
|
|
72
|
+
if (organismId && wsId) {
|
|
73
|
+
const noteId = 'note-' + randomUUID().slice(0, 8);
|
|
74
|
+
const key = `organism.${organismId}.w.${wsId}.notes.${noteId}`;
|
|
75
|
+
await storage.setMemory({
|
|
76
|
+
key, ownerGaii: ownerGhii, value: { id: noteId, title: String(action.summary || '').slice(0, 80), body: content, createdAt: now, via: 'secretary-clarify' },
|
|
77
|
+
visibility: 'private', tags: ['secretary', 'note', String(job.contextId || '')], ttlHours: null, version: 1, createdAt: now, updatedAt: now,
|
|
78
|
+
});
|
|
79
|
+
href = `/v1/profile?tab=organisms&org=${organismId}&ws=${wsId}`;
|
|
80
|
+
await appendSecretaryFeed(storage, ownerGhii, {
|
|
81
|
+
kind: 'act', contextId: String(job.contextId || ''), contextName: String(job.contextName || ''),
|
|
82
|
+
text: `✍️ ${action.summary || ''} — filed after your answers`, href,
|
|
83
|
+
});
|
|
84
|
+
writes.push(key, 'secretary.feed');
|
|
85
|
+
}
|
|
86
|
+
// The feedback the owner was missing: reply the outcome straight back into the inbox thread, so
|
|
87
|
+
// answering a clarify question visibly leads somewhere instead of vanishing.
|
|
88
|
+
const savedLine = href ? `\n\n_Saved to your workspace._` : '';
|
|
89
|
+
await sendDirectMessage(ctx, {
|
|
90
|
+
senderGhii: agentGaii,
|
|
91
|
+
recipientGhii: ownerGhii,
|
|
92
|
+
conversationId: job.conversationId,
|
|
93
|
+
body: `✅ Done — I used your answers to produce **${action.summary || 'the deliverable'}**:\n\n${content}${savedLine}`,
|
|
94
|
+
skipContactGate: true,
|
|
95
|
+
}).catch(() => { });
|
|
96
|
+
const jobKey = `secretary.clarify.${job.id}`;
|
|
97
|
+
await storage.setMemory({
|
|
98
|
+
key: jobKey, ownerGaii: ownerGhii, value: { ...job, status: 'done', producedAt: now },
|
|
99
|
+
visibility: 'private', tags: ['secretary', 'clarify', 'done'], ttlHours: null, version: 1, createdAt: String(job.createdAt || now), updatedAt: now,
|
|
100
|
+
});
|
|
101
|
+
writes.push(jobKey);
|
|
102
|
+
return { writes, produced: true };
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=secretary-clarify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretary-clarify.js","sourceRoot":"","sources":["../../../src/services/secretary-clarify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Storage } from '../storage/interface.js';
|
|
2
|
+
export interface SecretaryFeedEntry {
|
|
3
|
+
kind: string;
|
|
4
|
+
contextId: string;
|
|
5
|
+
contextName: string;
|
|
6
|
+
text: string;
|
|
7
|
+
href?: string;
|
|
8
|
+
}
|
|
9
|
+
/** Prepend an entry to the owner's `secretary.feed` (capped, newest-first). */
|
|
10
|
+
export declare function appendSecretaryFeed(storage: Storage, owner: string, entry: SecretaryFeedEntry): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=secretary-feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretary-feed.d.ts","sourceRoot":"","sources":["../../../src/services/secretary-feed.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD,+EAA+E;AAC/E,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWnH"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file secretary-feed.ts
|
|
3
|
+
* @description The owner's Secretary activity feed (`secretary.feed` memory key) — a capped, newest-first
|
|
4
|
+
* list of what the Secretary did/surfaced (briefings, filed notes, reviews, clarify outcomes). Extracted
|
|
5
|
+
* from scheduler.ts so both the autonomous tick AND the live DM responder / clarify-produce path append
|
|
6
|
+
* to the SAME feed through one helper (single source of truth for the record shape + cap).
|
|
7
|
+
* @structure SecretaryFeedEntry · appendSecretaryFeed()
|
|
8
|
+
* @usage import { appendSecretaryFeed } from './secretary-feed.js';
|
|
9
|
+
* @version-history
|
|
10
|
+
* v1.0.0 — 2026-06-28 — Extracted from scheduler.appendFeed so the clarify-produce + live responder reuse it.
|
|
11
|
+
*/
|
|
12
|
+
import { randomUUID } from 'node:crypto';
|
|
13
|
+
/** Max feed items kept (newest-first); older entries are dropped. */
|
|
14
|
+
const FEED_CAP = 50;
|
|
15
|
+
/** Prepend an entry to the owner's `secretary.feed` (capped, newest-first). */
|
|
16
|
+
export async function appendSecretaryFeed(storage, owner, entry) {
|
|
17
|
+
const feedKey = 'secretary.feed';
|
|
18
|
+
const existing = await storage.getMemory(owner, feedKey);
|
|
19
|
+
const list = Array.isArray(existing?.value?.items)
|
|
20
|
+
? existing.value.items : [];
|
|
21
|
+
const now = new Date().toISOString();
|
|
22
|
+
const items = [{ id: randomUUID(), ts: now, ...entry }, ...list].slice(0, FEED_CAP);
|
|
23
|
+
await storage.setMemory({
|
|
24
|
+
key: feedKey, ownerGaii: owner, value: { items }, visibility: 'private', tags: ['secretary', 'feed'],
|
|
25
|
+
ttlHours: null, version: existing ? existing.version + 1 : 1, createdAt: existing?.createdAt ?? now, updatedAt: now,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=secretary-feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretary-feed.js","sourceRoot":"","sources":["../../../src/services/secretary-feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,qEAAqE;AACrE,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAgB,EAAE,KAAa,EAAE,KAAyB;IAClG,MAAM,OAAO,GAAG,gBAAgB,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAE,QAAQ,EAAE,KAA2C,EAAE,KAAK,CAAC;QACvF,CAAC,CAAE,QAAS,CAAC,KAA8B,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpF,MAAM,OAAO,CAAC,SAAS,CAAC;QACtB,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;QACpG,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG,EAAE,SAAS,EAAE,GAAG;KACpH,CAAC,CAAC;AACL,CAAC"}
|