@cohortapp/agent-sdk 2.3.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/.claude/commands/init-agent.md +104 -0
- package/.claude/commands/init-maestro.md +1187 -0
- package/.claude/settings.json +161 -0
- package/.env.example +216 -0
- package/README.md +632 -0
- package/agents/browser-operator/agent.md +52 -0
- package/agents/calendar-ops/agent.md +50 -0
- package/agents/communications/agent.md +96 -0
- package/agents/decision-log/agent.md +65 -0
- package/agents/desktop-operator/agent.md +59 -0
- package/agents/gmail-operator/agent.md +62 -0
- package/agents/inbound-dispatcher/agent.md +66 -0
- package/agents/inbox-processor/agent.md +39 -0
- package/agents/pmo-execution/agent.md +60 -0
- package/agents/session-spawner/agent.md +64 -0
- package/agents/slack-operator/agent.md +60 -0
- package/agents/whatsapp-operator/agent.md +60 -0
- package/agents/workflow-automation/agent.md +61 -0
- package/archetypes/altitudes/c-suite.yaml +58 -0
- package/archetypes/altitudes/founder.yaml +68 -0
- package/archetypes/altitudes/senior-manager.yaml +63 -0
- package/archetypes/altitudes/svp.yaml +60 -0
- package/archetypes/altitudes/vp.yaml +50 -0
- package/archetypes/archetype.schema.json +77 -0
- package/archetypes/base.yaml +47 -0
- package/archetypes/capabilities/commercial-leader.yaml +159 -0
- package/archetypes/capabilities/compliance-officer.yaml +159 -0
- package/archetypes/capabilities/executive-operator.yaml +169 -0
- package/archetypes/capabilities/finance-leader.yaml +162 -0
- package/archetypes/capabilities/operations-leader.yaml +154 -0
- package/archetypes/capabilities/product-leader.yaml +148 -0
- package/archetypes/capabilities/technical-leader.yaml +146 -0
- package/archetypes/functions/commercial-leader.yaml +62 -0
- package/archetypes/functions/compliance-officer.yaml +64 -0
- package/archetypes/functions/executive-operator.yaml +70 -0
- package/archetypes/functions/finance-leader.yaml +70 -0
- package/archetypes/functions/operations-leader.yaml +62 -0
- package/archetypes/functions/product-leader.yaml +61 -0
- package/archetypes/functions/technical-leader.yaml +57 -0
- package/bin/cohort-mcp.mjs +81 -0
- package/bin/maestro.mjs +3516 -0
- package/bin/maestro.test.mjs +1015 -0
- package/desktop-control/README.md +56 -0
- package/desktop-control/app-profiles/gmail.yaml +120 -0
- package/desktop-control/app-profiles/slack.yaml +315 -0
- package/desktop-control/app-profiles/whatsapp.yaml +107 -0
- package/docs/architecture/agent-topology.md +2239 -0
- package/docs/architecture/archetype-agent-factory.md +110 -0
- package/docs/architecture/collective-memory-and-org-mesh.md +115 -0
- package/docs/architecture/continuous-monitoring.md +221 -0
- package/docs/architecture/mcp-capability-map.md +585 -0
- package/docs/architecture/system-architecture.md +1272 -0
- package/docs/company-context/README.md +40 -0
- package/docs/guides/agent-persona-setup.md +600 -0
- package/docs/guides/agents-observe-setup.md +64 -0
- package/docs/guides/billing-console-keys.md +88 -0
- package/docs/guides/ccxray-diagnostics.md +65 -0
- package/docs/guides/channel-bus.md +127 -0
- package/docs/guides/claude-mem-setup.md +79 -0
- package/docs/guides/claude-pace-setup.md +56 -0
- package/docs/guides/claudraband-sessions.md +98 -0
- package/docs/guides/clawteam-swarm.md +116 -0
- package/docs/guides/code-review-graph-setup.md +86 -0
- package/docs/guides/email-setup.md +431 -0
- package/docs/guides/mac-mini.md +119 -0
- package/docs/guides/media-generation-setup.md +349 -0
- package/docs/guides/model-routing.md +162 -0
- package/docs/guides/observability-otel.md +265 -0
- package/docs/guides/org-onboarding.md +132 -0
- package/docs/guides/outbound-governance-setup.md +437 -0
- package/docs/guides/pdf-generation-setup.md +315 -0
- package/docs/guides/poller-daemon-setup.md +563 -0
- package/docs/guides/rag-context-setup.md +459 -0
- package/docs/guides/self-optimization-pattern.md +82 -0
- package/docs/guides/setup-wizard.md +178 -0
- package/docs/guides/slack-setup.md +350 -0
- package/docs/guides/telegram-setup.md +227 -0
- package/docs/guides/twilio-subaccounts-setup.md +223 -0
- package/docs/guides/verification.md +128 -0
- package/docs/guides/voice-mode.md +188 -0
- package/docs/guides/voice-sms-setup.md +698 -0
- package/docs/guides/webhook-relay-setup.md +349 -0
- package/docs/guides/whatsapp-setup.md +288 -0
- package/docs/prompts/board-pack-cover-template.md +36 -0
- package/docs/prompts/decision-recommendation-template.md +88 -0
- package/docs/prompts/followup-message-template.md +141 -0
- package/docs/prompts/investor-letter-template.md +52 -0
- package/docs/prompts/morning-brief-template.md +82 -0
- package/docs/prompts/presentation-template.md +58 -0
- package/docs/prompts/weekly-strategic-memo-template.md +104 -0
- package/docs/research/hallucinated-tool-output-investigation.md +151 -0
- package/docs/runbooks/backup-restore.md +205 -0
- package/docs/runbooks/cohort-cutover.md +129 -0
- package/docs/runbooks/fleet-operations.md +200 -0
- package/docs/runbooks/incident-response.md +226 -0
- package/docs/runbooks/mac-mini-bootstrap.md +431 -0
- package/docs/runbooks/perpetual-operations.md +509 -0
- package/docs/runbooks/recovery-and-failover.md +260 -0
- package/framework-features.json +267 -0
- package/ingest/README.md +87 -0
- package/lib/action-executor.js +689 -0
- package/lib/action-executor.test.mjs +871 -0
- package/lib/agent-root.mjs +37 -0
- package/lib/archetype.mjs +236 -0
- package/lib/archetype.test.mjs +132 -0
- package/lib/autonomy.mjs +114 -0
- package/lib/autonomy.test.mjs +66 -0
- package/lib/backlog.mjs +358 -0
- package/lib/backlog.test.mjs +266 -0
- package/lib/budget-guard.mjs +279 -0
- package/lib/budget-guard.test.mjs +291 -0
- package/lib/cadence-bus-schedule.test.mjs +194 -0
- package/lib/cadence-bus.mjs +1120 -0
- package/lib/cadence-bus.test.mjs +720 -0
- package/lib/cadences.mjs +205 -0
- package/lib/cadences.test.mjs +125 -0
- package/lib/capability.mjs +154 -0
- package/lib/capability.test.mjs +78 -0
- package/lib/channels/base-adapter.mjs +719 -0
- package/lib/channels/base-adapter.test.mjs +590 -0
- package/lib/channels/channel.mjs +128 -0
- package/lib/channels/channels.test.mjs +371 -0
- package/lib/channels/contract.mjs +215 -0
- package/lib/channels/contract.test.mjs +137 -0
- package/lib/channels/conversation-resolver.mjs +95 -0
- package/lib/channels/gmail/adapter.mjs +87 -0
- package/lib/channels/inbox-item.mjs +255 -0
- package/lib/channels/inbox-item.test.mjs +335 -0
- package/lib/channels/index.mjs +94 -0
- package/lib/channels/orgmail/adapter.mjs +353 -0
- package/lib/channels/orgmail/adapter.test.mjs +311 -0
- package/lib/channels/pairing.mjs +363 -0
- package/lib/channels/pairing.test.mjs +270 -0
- package/lib/channels/registry.mjs +164 -0
- package/lib/channels/slack/adapter.mjs +317 -0
- package/lib/channels/slack-adapter.test.mjs +212 -0
- package/lib/channels/sms/adapter.mjs +43 -0
- package/lib/channels/telegram/adapter.mjs +432 -0
- package/lib/channels/telegram-adapter.test.mjs +306 -0
- package/lib/channels/voice/adapter.mjs +301 -0
- package/lib/channels/voice/adapter.test.mjs +278 -0
- package/lib/channels/whatsapp/adapter-baileys.mjs +587 -0
- package/lib/channels/whatsapp/adapter-baileys.test.mjs +359 -0
- package/lib/channels/whatsapp/adapter-twilio.mjs +65 -0
- package/lib/channels/whatsapp/baileys-typing.test.mjs +154 -0
- package/lib/charter.mjs +256 -0
- package/lib/charter.test.mjs +89 -0
- package/lib/claude-bin.mjs +134 -0
- package/lib/claude-bin.test.mjs +75 -0
- package/lib/collective/capture.mjs +185 -0
- package/lib/collective/capture.test.mjs +121 -0
- package/lib/collective/cards.mjs +201 -0
- package/lib/collective/cards.test.mjs +114 -0
- package/lib/collective/config.mjs +186 -0
- package/lib/collective/config.test.mjs +123 -0
- package/lib/collective/global-config.mjs +113 -0
- package/lib/collective/global-config.test.mjs +75 -0
- package/lib/collective/presence.mjs +201 -0
- package/lib/collective/presence.test.mjs +95 -0
- package/lib/collective/recall.mjs +215 -0
- package/lib/collective/recall.test.mjs +116 -0
- package/lib/comms/send-gate.mjs +554 -0
- package/lib/comms/send-gate.test.mjs +577 -0
- package/lib/comms.mjs +67 -0
- package/lib/comms.test.mjs +41 -0
- package/lib/diagnostics/alerts.mjs +424 -0
- package/lib/diagnostics/alerts.test.mjs +318 -0
- package/lib/diagnostics/backup-freshness.mjs +188 -0
- package/lib/diagnostics/backup-freshness.test.mjs +185 -0
- package/lib/diagnostics/counters.mjs +269 -0
- package/lib/diagnostics/counters.test.mjs +206 -0
- package/lib/diagnostics/events.mjs +188 -0
- package/lib/diagnostics/events.test.mjs +290 -0
- package/lib/diagnostics/otel.mjs +237 -0
- package/lib/diagnostics/otel.test.mjs +196 -0
- package/lib/diagnostics/trace.mjs +216 -0
- package/lib/diagnostics/trace.test.mjs +251 -0
- package/lib/env-compat.mjs +74 -0
- package/lib/env-compat.test.mjs +104 -0
- package/lib/feature-init.mjs +331 -0
- package/lib/fs-atomic.mjs +112 -0
- package/lib/fs-atomic.test.mjs +72 -0
- package/lib/fs-ownership.mjs +111 -0
- package/lib/fs-ownership.test.mjs +158 -0
- package/lib/hooks/bus.mjs +347 -0
- package/lib/hooks/bus.test.mjs +387 -0
- package/lib/index.js +16 -0
- package/lib/learning/config.mjs +106 -0
- package/lib/learning/config.test.mjs +75 -0
- package/lib/learning/counters.mjs +156 -0
- package/lib/learning/counters.test.mjs +69 -0
- package/lib/learning/curator-consolidate.test.mjs +238 -0
- package/lib/learning/curator.mjs +453 -0
- package/lib/learning/curator.test.mjs +106 -0
- package/lib/learning/log.mjs +40 -0
- package/lib/learning/reflect.mjs +534 -0
- package/lib/learning/reflect.test.mjs +0 -0
- package/lib/learning/session-index.mjs +352 -0
- package/lib/learning/session-index.test.mjs +125 -0
- package/lib/learning/skill-writer.mjs +474 -0
- package/lib/learning/skill-writer.test.mjs +210 -0
- package/lib/mcp/server.mjs +328 -0
- package/lib/mcp/server.test.mjs +400 -0
- package/lib/model-router/auth-profiles.mjs +758 -0
- package/lib/model-router/auth-profiles.test.mjs +580 -0
- package/lib/model-router/catalog/anthropic.yaml +153 -0
- package/lib/model-router/catalog/deepseek.yaml +86 -0
- package/lib/model-router/catalog/moonshot.yaml +81 -0
- package/lib/model-router/catalog/qwen.yaml +114 -0
- package/lib/model-router/catalog.mjs +925 -0
- package/lib/model-router/catalog.test.mjs +385 -0
- package/lib/model-router/economics.mjs +564 -0
- package/lib/model-router/economics.test.mjs +344 -0
- package/lib/model-router/failover.mjs +298 -0
- package/lib/model-router/failover.test.mjs +439 -0
- package/lib/model-router/health.mjs +453 -0
- package/lib/model-router/health.test.mjs +338 -0
- package/lib/model-router/integration-coverage.test.mjs +829 -0
- package/lib/model-router/integration.test.mjs +564 -0
- package/lib/model-router/ledger.mjs +402 -0
- package/lib/model-router/ledger.test.mjs +382 -0
- package/lib/model-router/llm-task.mjs +515 -0
- package/lib/model-router/llm-task.test.mjs +392 -0
- package/lib/model-router/org-credentials.mjs +260 -0
- package/lib/model-router/org-credentials.test.mjs +265 -0
- package/lib/model-router/pricing-refresh.mjs +463 -0
- package/lib/model-router/pricing-refresh.test.mjs +286 -0
- package/lib/model-router/reconcile.mjs +429 -0
- package/lib/model-router/reconcile.test.mjs +316 -0
- package/lib/model-router/repair.mjs +471 -0
- package/lib/model-router/repair.test.mjs +180 -0
- package/lib/model-router/resolve.mjs +1206 -0
- package/lib/model-router/spawn.mjs +497 -0
- package/lib/model-router/spawn.test.mjs +425 -0
- package/lib/model-router/taxonomy.mjs +893 -0
- package/lib/model-router/taxonomy.test.mjs +410 -0
- package/lib/model-router.mjs +677 -0
- package/lib/model-router.test.mjs +907 -0
- package/lib/org/activity.mjs +211 -0
- package/lib/org/activity.test.mjs +134 -0
- package/lib/org/approvals.mjs +448 -0
- package/lib/org/approvals.test.mjs +216 -0
- package/lib/org/awareness.mjs +222 -0
- package/lib/org/awareness.test.mjs +159 -0
- package/lib/org/board.mjs +229 -0
- package/lib/org/board.test.mjs +177 -0
- package/lib/org/bootstrap-context.mjs +169 -0
- package/lib/org/bootstrap-context.test.mjs +153 -0
- package/lib/org/client.mjs +1628 -0
- package/lib/org/client.test.mjs +1107 -0
- package/lib/org/cohort-client.mjs +67 -0
- package/lib/org/cohort-client.test.mjs +126 -0
- package/lib/org/cost-sync.mjs +227 -0
- package/lib/org/cost-sync.test.mjs +153 -0
- package/lib/org/doctor.mjs +212 -0
- package/lib/org/doctor.test.mjs +212 -0
- package/lib/org/handoff.mjs +293 -0
- package/lib/org/handoff.test.mjs +269 -0
- package/lib/org/integration-tools.mjs +182 -0
- package/lib/org/integration-tools.test.mjs +160 -0
- package/lib/org/keys.mjs +131 -0
- package/lib/org/keys.test.mjs +92 -0
- package/lib/org/knowledge.mjs +463 -0
- package/lib/org/knowledge.test.mjs +319 -0
- package/lib/org/leases.mjs +335 -0
- package/lib/org/leases.test.mjs +235 -0
- package/lib/org/mesh-integration.test.mjs +127 -0
- package/lib/org/mesh.mjs +459 -0
- package/lib/org/mesh.test.mjs +345 -0
- package/lib/org/messaging.mjs +503 -0
- package/lib/org/messaging.test.mjs +238 -0
- package/lib/org/policy.mjs +345 -0
- package/lib/org/policy.test.mjs +237 -0
- package/lib/org/protocol.checksum +1 -0
- package/lib/org/protocol.checksum.test.mjs +90 -0
- package/lib/org/protocol.mjs +967 -0
- package/lib/org/protocol.test.mjs +264 -0
- package/lib/org/registry.mjs +194 -0
- package/lib/org/registry.test.mjs +100 -0
- package/lib/org/tool-surface-integration.test.mjs +120 -0
- package/lib/org/tool-surface.mjs +2535 -0
- package/lib/org/tool-surface.test.mjs +589 -0
- package/lib/org/ui-parity.mjs +3236 -0
- package/lib/org/ui-parity.test.mjs +348 -0
- package/lib/org/verify.mjs +176 -0
- package/lib/org/verify.test.mjs +194 -0
- package/lib/rag/embed.mjs +188 -0
- package/lib/rag/indexer.mjs +425 -0
- package/lib/rag/rag.test.mjs +505 -0
- package/lib/rag/search.mjs +475 -0
- package/lib/rate-guard.mjs +246 -0
- package/lib/rate-guard.test.mjs +201 -0
- package/lib/render.mjs +112 -0
- package/lib/render.test.mjs +68 -0
- package/lib/resource-governor.mjs +297 -0
- package/lib/resource-governor.test.mjs +262 -0
- package/lib/scheduling/dynamic-jobs.mjs +675 -0
- package/lib/scheduling/dynamic-jobs.test.mjs +344 -0
- package/lib/scheduling/jitter.mjs +0 -0
- package/lib/scheduling/jitter.test.mjs +140 -0
- package/lib/secrets/broker.mjs +315 -0
- package/lib/secrets/broker.test.mjs +280 -0
- package/lib/secrets/providers.mjs +461 -0
- package/lib/secrets/providers.test.mjs +274 -0
- package/lib/security/audit-engine.mjs +684 -0
- package/lib/security/audit-engine.test.mjs +389 -0
- package/lib/security/coerce-args.mjs +552 -0
- package/lib/security/coerce-args.test.mjs +281 -0
- package/lib/security/dangerous-tools.mjs +97 -0
- package/lib/security/dangerous-tools.test.mjs +68 -0
- package/lib/security/external-content.mjs +145 -0
- package/lib/security/external-content.test.mjs +67 -0
- package/lib/security/redact.mjs +592 -0
- package/lib/security/redact.test.mjs +441 -0
- package/lib/security/secret-equal.mjs +73 -0
- package/lib/security/secret-equal.test.mjs +55 -0
- package/lib/session-permissions.mjs +101 -0
- package/lib/session-permissions.test.mjs +100 -0
- package/lib/setup/claude-probe.mjs +74 -0
- package/lib/setup/completeness.mjs +175 -0
- package/lib/setup/completeness.test.mjs +110 -0
- package/lib/setup/context-pack.mjs +173 -0
- package/lib/setup/context-pack.test.mjs +89 -0
- package/lib/setup/enrich.mjs +277 -0
- package/lib/setup/enrich.test.mjs +115 -0
- package/lib/setup/enroll-from-cohort.mjs +441 -0
- package/lib/setup/enroll-from-cohort.test.mjs +233 -0
- package/lib/setup/integration.test.mjs +162 -0
- package/lib/setup/io.mjs +360 -0
- package/lib/setup/io.test.mjs +77 -0
- package/lib/setup/run-generator.mjs +81 -0
- package/lib/setup/runner.mjs +244 -0
- package/lib/setup/runner.test.mjs +132 -0
- package/lib/setup/sections/comms.mjs +173 -0
- package/lib/setup/sections/company.mjs +120 -0
- package/lib/setup/sections/enrich.mjs +138 -0
- package/lib/setup/sections/identity.mjs +182 -0
- package/lib/setup/sections/identity.test.mjs +140 -0
- package/lib/setup/sections/learning.mjs +153 -0
- package/lib/setup/sections/learning.test.mjs +81 -0
- package/lib/setup/sections/messaging.mjs +219 -0
- package/lib/setup/sections/messaging.test.mjs +127 -0
- package/lib/setup/sections/model.mjs +102 -0
- package/lib/setup/sections/operating-model.mjs +78 -0
- package/lib/setup/sections/org.mjs +475 -0
- package/lib/setup/sections/org.test.mjs +313 -0
- package/lib/setup/sections/orgmail.mjs +173 -0
- package/lib/setup/sections/orgmail.test.mjs +118 -0
- package/lib/setup/sections/recovery.mjs +159 -0
- package/lib/setup/sections/recovery.test.mjs +98 -0
- package/lib/setup/sections/tools.mjs +132 -0
- package/lib/setup/sections/verify.mjs +97 -0
- package/lib/setup/sot.mjs +205 -0
- package/lib/setup/sot.test.mjs +81 -0
- package/lib/setup/state.mjs +151 -0
- package/lib/setup/state.test.mjs +92 -0
- package/lib/singleton.js +229 -0
- package/lib/singleton.test.mjs +135 -0
- package/lib/telemetry/alerts.mjs +216 -0
- package/lib/telemetry/alerts.test.mjs +109 -0
- package/lib/telemetry/collect.mjs +512 -0
- package/lib/telemetry/collect.test.mjs +202 -0
- package/lib/tool-definitions-integration.test.mjs +83 -0
- package/lib/tool-definitions.js +738 -0
- package/lib/tool-definitions.test.mjs +437 -0
- package/lib/util/fetch-timeout.mjs +136 -0
- package/lib/util/fetch-timeout.test.mjs +202 -0
- package/lib/util/reconnect.mjs +343 -0
- package/lib/util/reconnect.test.mjs +369 -0
- package/lib/util/unhandled.mjs +205 -0
- package/lib/util/unhandled.test.mjs +216 -0
- package/lib/voice/context-loader.mjs +466 -0
- package/lib/voice/index.mjs +100 -0
- package/lib/voice/openai-realtime.mjs +510 -0
- package/lib/voice/outbound.mjs +542 -0
- package/lib/voice/outbound.test.mjs +69 -0
- package/lib/voice/post-call-brief.mjs +428 -0
- package/lib/voice/provider.mjs +52 -0
- package/lib/voice/session-rotation.mjs +257 -0
- package/lib/voice/stt.mjs +161 -0
- package/lib/voice/stt.test.mjs +226 -0
- package/lib/voice/tool-bridge.mjs +370 -0
- package/lib/voice/tts.mjs +104 -0
- package/lib/voice/twilio-sip-bridge.mjs +288 -0
- package/lib/voice/voice.test.mjs +990 -0
- package/mcp/README.md +80 -0
- package/package.json +151 -0
- package/plugins/maestro-skills/plugin.json +139 -0
- package/plugins/maestro-skills/skills/agents-observe.md +110 -0
- package/plugins/maestro-skills/skills/board-deck.md +68 -0
- package/plugins/maestro-skills/skills/books-close.md +77 -0
- package/plugins/maestro-skills/skills/brand-steward.md +121 -0
- package/plugins/maestro-skills/skills/calendar-plan.md +57 -0
- package/plugins/maestro-skills/skills/call-working-sessions.md +124 -0
- package/plugins/maestro-skills/skills/ccxray-diagnostics.md +91 -0
- package/plugins/maestro-skills/skills/claude-pace.md +61 -0
- package/plugins/maestro-skills/skills/code-review-graph.md +99 -0
- package/plugins/maestro-skills/skills/crm-pipeline.md +65 -0
- package/plugins/maestro-skills/skills/decision-brief.md +89 -0
- package/plugins/maestro-skills/skills/directory-hygiene.md +125 -0
- package/plugins/maestro-skills/skills/draft-comms.md +84 -0
- package/plugins/maestro-skills/skills/evening-wrap.md +53 -0
- package/plugins/maestro-skills/skills/files-find.md +65 -0
- package/plugins/maestro-skills/skills/generative-ui.md +228 -0
- package/plugins/maestro-skills/skills/hiring-triage.md +74 -0
- package/plugins/maestro-skills/skills/inbox-triage.md +61 -0
- package/plugins/maestro-skills/skills/mail-triage.md +86 -0
- package/plugins/maestro-skills/skills/morning-brief.md +54 -0
- package/plugins/maestro-skills/skills/native-artifacts.md +157 -0
- package/plugins/maestro-skills/skills/org-board.md +133 -0
- package/plugins/maestro-skills/skills/org-credential.md +68 -0
- package/plugins/maestro-skills/skills/org-recall.md +81 -0
- package/plugins/maestro-skills/skills/pipeline-review.md +76 -0
- package/plugins/maestro-skills/skills/regulatory-status.md +81 -0
- package/plugins/maestro-skills/skills/router-why.md +78 -0
- package/plugins/maestro-skills/skills/schedule-meeting.md +91 -0
- package/plugins/maestro-skills/skills/session-search.md +71 -0
- package/plugins/maestro-skills/skills/set-reminder.md +93 -0
- package/plugins/maestro-skills/skills/slack-followup.md +64 -0
- package/plugins/maestro-skills/skills/team-activity.md +86 -0
- package/plugins/maestro-skills/skills/weekly-memo.md +70 -0
- package/policies/action-classification.yaml +114 -0
- package/policies/ai-disclosure.yaml +294 -0
- package/policies/communication-style.md +139 -0
- package/policies/information-barriers.yaml +118 -0
- package/policies/prompt-injection-defence.yaml +138 -0
- package/public/assets/icon-dark.png +0 -0
- package/public/assets/icon-dark.svg +9 -0
- package/public/assets/icon-light.svg +9 -0
- package/public/assets/logo-dark.svg +15 -0
- package/public/assets/logo-light.svg +15 -0
- package/scaffold/.mcp.json +7 -0
- package/scaffold/CLAUDE.md +368 -0
- package/scaffold/config/agent.json +55 -0
- package/scaffold/config/agent.ts +76 -0
- package/scaffold/config/agent.ts.example +89 -0
- package/scaffold/config/alerts.yaml +23 -0
- package/scaffold/config/allowlist.yaml.example +25 -0
- package/scaffold/config/caller-id-map.yaml +46 -0
- package/scaffold/config/collective.yaml +49 -0
- package/scaffold/config/company.json +20 -0
- package/scaffold/config/known-agents.json +6 -0
- package/scaffold/config/learning.yaml +55 -0
- package/scaffold/config/model-routing.yaml.example +104 -0
- package/scaffold/config/org.yaml +25 -0
- package/scaffold/config/orgmail.yaml.example +19 -0
- package/scaffold/config/recovery.yaml +72 -0
- package/scaffold/config/secrets.yaml +27 -0
- package/scaffold/config/slack.yaml.example +35 -0
- package/scaffold/config/telegram.yaml.example +38 -0
- package/scaffold/config/voice.yaml.example +89 -0
- package/scaffold/config/whatsapp.yaml.example +39 -0
- package/schedules/README.md +49 -0
- package/schedules/triggers/backlog-executor.md +102 -0
- package/schedules/triggers/brand-steward.md +72 -0
- package/schedules/triggers/daily-evening-wrap.md +159 -0
- package/schedules/triggers/daily-midday-sweep.md +58 -0
- package/schedules/triggers/daily-morning-brief.md +55 -0
- package/schedules/triggers/directory-hygiene.md +81 -0
- package/schedules/triggers/dynamic-jobs.md +40 -0
- package/schedules/triggers/inbox-processor.md +115 -0
- package/schedules/triggers/meeting-action-capture.md +60 -0
- package/schedules/triggers/meeting-prep.md +69 -0
- package/schedules/triggers/messaging-inbound.md +50 -0
- package/schedules/triggers/org-pulse.md +24 -0
- package/schedules/triggers/quarterly-self-assessment.md +54 -0
- package/schedules/triggers/weekly-engineering-health.md +37 -0
- package/schedules/triggers/weekly-execution.md +65 -0
- package/schedules/triggers/weekly-hiring.md +53 -0
- package/schedules/triggers/weekly-priorities.md +38 -0
- package/schedules/triggers/weekly-strategic-memo.md +124 -0
- package/scripts/archive-email.sh +55 -0
- package/scripts/cadence/cadence-status.mjs +36 -0
- package/scripts/cadence/enqueue-cadence-tick.mjs +174 -0
- package/scripts/cadence/enqueue-cadence-tick.test.mjs +187 -0
- package/scripts/cadence/launchd-cadence-wrapper.sh +85 -0
- package/scripts/cadence/launchd-cloud-relay-wrapper.sh +95 -0
- package/scripts/cadence/launchd-socket-mode-wrapper.sh +95 -0
- package/scripts/ci/check-docs-accuracy.mjs +493 -0
- package/scripts/ci/check-docs-accuracy.test.mjs +409 -0
- package/scripts/ci/check-exports-exist.mjs +140 -0
- package/scripts/ci/check-files-exist.mjs +107 -0
- package/scripts/ci/check-no-build-artifacts.mjs +111 -0
- package/scripts/ci/check-no-build-artifacts.test.mjs +71 -0
- package/scripts/ci/check-no-confidential.mjs +198 -0
- package/scripts/ci/check-no-conflict-markers.mjs +169 -0
- package/scripts/ci/check-no-residual-identity.mjs +163 -0
- package/scripts/ci/check-no-residual-identity.test.mjs +89 -0
- package/scripts/ci/check-tarball-fidelity.mjs +205 -0
- package/scripts/ci/check-unresolved-tokens.mjs +83 -0
- package/scripts/ci/check.mjs +109 -0
- package/scripts/ci/check.test.mjs +194 -0
- package/scripts/ci/run-coverage.mjs +82 -0
- package/scripts/ci/run-tests.mjs +71 -0
- package/scripts/cloud-relay/README.md +59 -0
- package/scripts/cloud-relay/index.mjs +233 -0
- package/scripts/cloud-relay/package.json +15 -0
- package/scripts/cloud-relay/railway.json +13 -0
- package/scripts/cloud-relay/voice/README.md +94 -0
- package/scripts/cloud-relay/voice/package-lock.json +39 -0
- package/scripts/cloud-relay/voice/package.json +16 -0
- package/scripts/cloud-relay/voice/railway.json +13 -0
- package/scripts/cloud-relay/voice/server.mjs +532 -0
- package/scripts/collective/hook-runner.mjs +211 -0
- package/scripts/collective/hook-runner.test.mjs +90 -0
- package/scripts/collective/org-pulse.mjs +72 -0
- package/scripts/collective/org-sync.mjs +61 -0
- package/scripts/collective/recall.mjs +45 -0
- package/scripts/collective/who.mjs +30 -0
- package/scripts/comms-monitor.sh +288 -0
- package/scripts/configure-whatsapp-sandbox.sh +201 -0
- package/scripts/continuous-monitor.sh +91 -0
- package/scripts/cost/fleet-digest.mjs +407 -0
- package/scripts/cost/fleet-digest.test.mjs +207 -0
- package/scripts/cost/track-claude-usage.mjs +169 -0
- package/scripts/daemon/agent-daemon.mjs +989 -0
- package/scripts/daemon/agent-daemon.test.mjs +525 -0
- package/scripts/daemon/cadence-consumer-governance.test.mjs +220 -0
- package/scripts/daemon/cadence-consumer.mjs +1080 -0
- package/scripts/daemon/cadence-consumer.test.mjs +770 -0
- package/scripts/daemon/cadence-handlers.mjs +1121 -0
- package/scripts/daemon/cadence-handlers.test.mjs +617 -0
- package/scripts/daemon/classifier.mjs +704 -0
- package/scripts/daemon/classifier.test.mjs +238 -0
- package/scripts/daemon/classify-kind.mjs +54 -0
- package/scripts/daemon/classify-kind.test.mjs +40 -0
- package/scripts/daemon/context-compiler.mjs +605 -0
- package/scripts/daemon/context-compiler.test.mjs +300 -0
- package/scripts/daemon/dispatcher-cooldown.test.mjs +122 -0
- package/scripts/daemon/dispatcher-governance.test.mjs +886 -0
- package/scripts/daemon/dispatcher.mjs +1516 -0
- package/scripts/daemon/health.mjs +72 -0
- package/scripts/daemon/inbox-deferral.mjs +210 -0
- package/scripts/daemon/inbox-deferral.test.mjs +242 -0
- package/scripts/daemon/integration.test.mjs +149 -0
- package/scripts/daemon/launchd-wrapper-generic.sh +96 -0
- package/scripts/daemon/launchd-wrapper-slack-events.sh +37 -0
- package/scripts/daemon/launchd-wrapper.sh +91 -0
- package/scripts/daemon/lib/session-router.mjs +274 -0
- package/scripts/daemon/lib/session-router.test.mjs +295 -0
- package/scripts/daemon/maestro-daemon.mjs +275 -0
- package/scripts/daemon/prompt-builder.mjs +685 -0
- package/scripts/daemon/prompt-builder.test.mjs +213 -0
- package/scripts/daemon/responder.mjs +854 -0
- package/scripts/daemon/session-lock.mjs +721 -0
- package/scripts/daemon/session-lock.test.mjs +252 -0
- package/scripts/daemon/session-outcomes.mjs +640 -0
- package/scripts/daemon/session-outcomes.test.mjs +533 -0
- package/scripts/daemon/typing-registry.mjs +90 -0
- package/scripts/daemon/typing-registry.test.mjs +77 -0
- package/scripts/daemon/voice-webhook-server.mjs +804 -0
- package/scripts/decisions/capture-decision.mjs +116 -0
- package/scripts/disclosure_assessment.py +873 -0
- package/scripts/disclosure_boundaries.py +562 -0
- package/scripts/email-signature-principal.html +52 -0
- package/scripts/email-signature.html +60 -0
- package/scripts/email_quote_thread.py +167 -0
- package/scripts/email_thread_dedup.py +362 -0
- package/scripts/emergency-stop.sh +81 -0
- package/scripts/healthcheck.sh +116 -0
- package/scripts/hooks/block-mcp-cohort-send.sh +15 -0
- package/scripts/hooks/block-mcp-slack-send.sh +7 -0
- package/scripts/hooks/post-action-log.sh +126 -0
- package/scripts/hooks/pre-send-audit.sh +174 -0
- package/scripts/hooks/pre-send-audit.test.mjs +215 -0
- package/scripts/hooks/session-end-log.sh +27 -0
- package/scripts/hooks/session-start-banner.sh +115 -0
- package/scripts/huddle/audio-bridge.mjs +664 -0
- package/scripts/huddle/boot-slack-cdp.sh +102 -0
- package/scripts/huddle/huddle-controller.mjs +942 -0
- package/scripts/huddle/huddle-server.mjs +1229 -0
- package/scripts/huddle/launch-slack.sh +232 -0
- package/scripts/huddle/openai-realtime-bridge.mjs +462 -0
- package/scripts/huddle/package-lock.json +62 -0
- package/scripts/huddle/package.json +22 -0
- package/scripts/huddle/setup-audio.sh +239 -0
- package/scripts/huddle/start-call.mjs +318 -0
- package/scripts/huddle/test-pipeline.mjs +263 -0
- package/scripts/learning/consolidate-skills.mjs +72 -0
- package/scripts/learning/session-search.mjs +125 -0
- package/scripts/llm_email_dedup.py +442 -0
- package/scripts/local-triggers/generate-plists.sh +432 -0
- package/scripts/local-triggers/generate-plists.test.mjs +413 -0
- package/scripts/local-triggers/install-all.sh +49 -0
- package/scripts/local-triggers/plists/.gitkeep +0 -0
- package/scripts/local-triggers/run-trigger.sh +63 -0
- package/scripts/local-triggers/templates/rag-reindex.plist.template +47 -0
- package/scripts/local-triggers/templates/voice-relay-poller.plist.template +54 -0
- package/scripts/local-triggers/templates/voice-tunnel.plist.template +55 -0
- package/scripts/local-triggers/templates/voice-webhook.plist.template +51 -0
- package/scripts/maintenance/backup-to-cloud.sh +124 -0
- package/scripts/maintenance/health-check.sh +377 -0
- package/scripts/media-generation/README.md +105 -0
- package/scripts/media-generation/gemini-image-client.mjs +173 -0
- package/scripts/media-generation/generate-assets.mjs +289 -0
- package/scripts/media-generation/veo-video-client.mjs +219 -0
- package/scripts/org/send-orgmail.mjs +227 -0
- package/scripts/outbound-dedup-cleanup.sh +43 -0
- package/scripts/outbound-dedup.sh +477 -0
- package/scripts/outbound_dedup.py +115 -0
- package/scripts/parse-voice-transcript.mjs +481 -0
- package/scripts/pdf-generation/README.md +63 -0
- package/scripts/pdf-generation/build-document.mjs +247 -0
- package/scripts/pdf-generation/templates/board-pack.latex +136 -0
- package/scripts/pdf-generation/templates/corporate-letter.latex +126 -0
- package/scripts/pdf-generation/templates/memo.latex +114 -0
- package/scripts/poll-slack-events.sh +35 -0
- package/scripts/poller/calendar-poller.mjs +12 -0
- package/scripts/poller/gmail-poller.mjs +192 -0
- package/scripts/poller/imap-client.mjs +289 -0
- package/scripts/poller/inbox-scan-poller.mjs +156 -0
- package/scripts/poller/inbox-scan-poller.test.mjs +231 -0
- package/scripts/poller/index.mjs +73 -0
- package/scripts/poller/intra-session-check.mjs +285 -0
- package/scripts/poller/lib/cloud-relay-dedup.mjs +88 -0
- package/scripts/poller/lib/cloud-relay-dedup.test.mjs +133 -0
- package/scripts/poller/lib/slash-command-handlers.mjs +177 -0
- package/scripts/poller/secondary-gmail-poller.mjs +132 -0
- package/scripts/poller/slack-cloud-relay-client.mjs +368 -0
- package/scripts/poller/slack-poller.mjs +854 -0
- package/scripts/poller/slack-socket-mode.mjs +917 -0
- package/scripts/poller/slack-socket-mode.test.mjs +753 -0
- package/scripts/poller/trigger.mjs +75 -0
- package/scripts/poller/utils.mjs +371 -0
- package/scripts/poller/voice-cloud-relay-client.mjs +179 -0
- package/scripts/poller/voice-poller.mjs +236 -0
- package/scripts/poller-launchd/install.sh +66 -0
- package/scripts/poller-launchd/poller.plist.template +40 -0
- package/scripts/poller-launchd/whatsapp-handler.plist.template +39 -0
- package/scripts/post-interaction-indexer.py +1598 -0
- package/scripts/pre-draft-context.py +994 -0
- package/scripts/pre_draft_lookup.py +258 -0
- package/scripts/rag/build-index.mjs +47 -0
- package/scripts/rag/ingest.mjs +111 -0
- package/scripts/rag/search.mjs +119 -0
- package/scripts/rag-indexer.py +629 -0
- package/scripts/restore-from-backup.sh +248 -0
- package/scripts/restore-from-backup.test.mjs +178 -0
- package/scripts/resume-operations.sh +80 -0
- package/scripts/search-secondary-inbox.py +181 -0
- package/scripts/secondary-inbox-poller.py +437 -0
- package/scripts/self-optimization/compute-metrics.py +398 -0
- package/scripts/send-email-as-principal.py +369 -0
- package/scripts/send-email-threaded.py +392 -0
- package/scripts/send-email-with-attachment.py +377 -0
- package/scripts/send-email.sh +131 -0
- package/scripts/send-sms.sh +175 -0
- package/scripts/send-whatsapp.sh +292 -0
- package/scripts/session-start.sh +106 -0
- package/scripts/setup/boot-claude-session.sh +94 -0
- package/scripts/setup/configure-macos.sh +674 -0
- package/scripts/setup/configure-twilio-sip-trunk.mjs +207 -0
- package/scripts/setup/configure-voice-tunnel.mjs +182 -0
- package/scripts/setup/generate-agent-env.mjs +92 -0
- package/scripts/setup/generate-agent-package-json.mjs +222 -0
- package/scripts/setup/generate-agent-package-json.test.mjs +143 -0
- package/scripts/setup/generate-autonomy.mjs +60 -0
- package/scripts/setup/generate-backlog.mjs +101 -0
- package/scripts/setup/generate-cadences.mjs +92 -0
- package/scripts/setup/generate-capability.mjs +162 -0
- package/scripts/setup/generate-charter.mjs +76 -0
- package/scripts/setup/generate-comms.mjs +59 -0
- package/scripts/setup/generate-company.mjs +92 -0
- package/scripts/setup/init-agent.sh +547 -0
- package/scripts/setup/init-agent.test.mjs +151 -0
- package/scripts/setup/init-archetype.mjs +74 -0
- package/scripts/setup/init-backup.mjs +54 -0
- package/scripts/setup/init-cadence-bus.mjs +60 -0
- package/scripts/setup/init-channel-bus.mjs +46 -0
- package/scripts/setup/init-cost-tracking.mjs +45 -0
- package/scripts/setup/init-decision-capture.mjs +66 -0
- package/scripts/setup/init-known-agents.mjs +57 -0
- package/scripts/setup/init-learning.mjs +70 -0
- package/scripts/setup/init-memory-executive.mjs +45 -0
- package/scripts/setup/init-model-router.mjs +124 -0
- package/scripts/setup/init-rag.mjs +174 -0
- package/scripts/setup/init-session-router.mjs +38 -0
- package/scripts/setup/init-slack-socket-mode.mjs +260 -0
- package/scripts/setup/init-telegram.mjs +165 -0
- package/scripts/setup/init-voice-realtime.mjs +204 -0
- package/scripts/setup/init-whatsapp-baileys.mjs +77 -0
- package/scripts/setup/install-dev-tools.sh +150 -0
- package/scripts/setup/lib/install-plist.mjs +95 -0
- package/scripts/setup/migrate-agent-to-sot.mjs +192 -0
- package/scripts/setup/render-environment-yaml.mjs +133 -0
- package/scripts/slack-events-ctl.sh +177 -0
- package/scripts/slack-events-server.mjs +1045 -0
- package/scripts/slack-react.mjs +89 -0
- package/scripts/slack-responded.sh +232 -0
- package/scripts/slack-send.sh +287 -0
- package/scripts/slack-typing.mjs +196 -0
- package/scripts/slack-upload-v2.py +95 -0
- package/scripts/sms-handler.mjs +450 -0
- package/scripts/spawn-session.sh +120 -0
- package/scripts/sync-protocol.mjs +217 -0
- package/scripts/system-verify.sh +184 -0
- package/scripts/test-email-thread-dedup.py +239 -0
- package/scripts/test-information-barriers.py +484 -0
- package/scripts/test-llm-email-dedup.py +251 -0
- package/scripts/test-pre-draft-integration.py +203 -0
- package/scripts/test-rag-phase2.sh +442 -0
- package/scripts/test-rag-search.sh +251 -0
- package/scripts/test-voice-parser.mjs +316 -0
- package/scripts/user-context-search.py +659 -0
- package/scripts/validate_outbound.py +1504 -0
- package/scripts/watchdog/ai.maestro.memory-watchdog.plist +41 -0
- package/scripts/watchdog/force-reboot.sh +157 -0
- package/scripts/watchdog/memory-watchdog.sh +473 -0
- package/scripts/whatsapp-handler.mjs +538 -0
- package/teams/desktop-operations.yaml +34 -0
- package/teams/executive-office.yaml +27 -0
- package/teams/legal-and-regulatory.yaml +24 -0
- package/teams/platform-and-engineering.yaml +23 -0
- package/teams/strategy-and-growth.yaml +29 -0
- package/workflows/continuous/backlog-executor.yaml +141 -0
- package/workflows/continuous/inbound-monitor.yaml +168 -0
- package/workflows/daily/applicant-triage.yaml +197 -0
- package/workflows/daily/comms-triage.yaml +80 -0
- package/workflows/daily/evening-wrap.yaml +105 -0
- package/workflows/daily/morning-brief.yaml +164 -0
- package/workflows/daily/slack-followup-sweep.yaml +87 -0
- package/workflows/event-driven/README.md +50 -0
- package/workflows/event-driven/agent-failure-investigation.yaml +137 -0
- package/workflows/event-driven/pr-review.yaml +107 -0
- package/workflows/monthly/board-readiness.yaml +76 -0
- package/workflows/quarterly/strategic-scenario-analysis.yaml +85 -0
- package/workflows/session-protocol.md +171 -0
- package/workflows/weekly/engineering-health.yaml +154 -0
- package/workflows/weekly/hiring-review.yaml +169 -0
- package/workflows/weekly/rollup-pipeline-review.yaml +76 -0
- package/workflows/weekly/strategic-memo.yaml +79 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Mac mini bring-up — an always-on Cohort agent, end to end
|
|
2
|
+
|
|
3
|
+
The one-page operator runbook: from a boxed Apple-silicon Mac mini to a fully
|
|
4
|
+
enrolled AI colleague on `os.cohortapp.com` — messaging, board work, and a real
|
|
5
|
+
workspace email address — verified by `cohort doctor`. OS-level hardening and
|
|
6
|
+
fleet mechanics live in the deeper runbook: [Mac Mini Bootstrap](../runbooks/mac-mini-bootstrap.md)
|
|
7
|
+
(this page links it rather than duplicating it).
|
|
8
|
+
|
|
9
|
+
## 1. Hardware / prereqs
|
|
10
|
+
|
|
11
|
+
- Apple-silicon Mac mini (M-series), macOS 15+.
|
|
12
|
+
- A dedicated admin macOS account for the agent (keep your own account separate).
|
|
13
|
+
- Always-on power settings:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
sudo pmset -a sleep 0 displaysleep 0 autorestart 1
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 2. Bootstrap
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
xcode-select --install
|
|
23
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
24
|
+
brew install node@20 git python@3.12
|
|
25
|
+
npm i -g @anthropic-ai/claude-code && claude login # Max subscription — the daemon
|
|
26
|
+
# strips API keys so sub-sessions
|
|
27
|
+
# ride keychain OAuth
|
|
28
|
+
npm i -g @cohortapp/agent-sdk
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 3. Create the agent repo
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cohort create <agent-name>
|
|
35
|
+
cd <agent-name>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
`create` copies the framework (`lib/`, `scripts/`, `.claude/`, `scaffold` configs —
|
|
39
|
+
including `.mcp.json`, which exposes the `cohort-mcp` org tool surface to
|
|
40
|
+
interactive Claude sessions, and the PreToolUse hooks that keep its outbound
|
|
41
|
+
writes on the CLI lane).
|
|
42
|
+
|
|
43
|
+
## 4. Enroll against `https://os.cohortapp.com`
|
|
44
|
+
|
|
45
|
+
Two lanes — pick one:
|
|
46
|
+
|
|
47
|
+
- **Admin-minted key**: in Cohort → Settings → API keys mint an agent key and
|
|
48
|
+
pair it to the member, then:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
export COHORT_API_KEY=nlk_… COHORT_ORG_ID=<org-slug> COHORT_AGENT_ID=<member-slug>
|
|
52
|
+
cohort setup
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Pull-enrollment populates `config/agent.json` from the member profile and
|
|
56
|
+
writes `config/org.yaml` (`org.cohort.{enabled,base,orgId,token}`).
|
|
57
|
+
|
|
58
|
+
- **Pre-auth pairing**: `cohort pair <code>` → an org admin approves the
|
|
59
|
+
handshake in Cohort (`pairing.request`/`pairing.approve`).
|
|
60
|
+
|
|
61
|
+
## 5. Wizard
|
|
62
|
+
|
|
63
|
+
`cohort setup` walks the sections in order — the org trio is:
|
|
64
|
+
|
|
65
|
+
| Order | Section | What it does |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| 75 | `org` | endpoint + token (the enrollment SoT) |
|
|
68
|
+
| 76 | `messaging` | messaging.read/write + calling.write scopes, home channels |
|
|
69
|
+
| 77 | `orgmail` | **workspace mailbox** — writes `config/orgmail.yaml` |
|
|
70
|
+
|
|
71
|
+
For 77 to go live, an admin must have verified a domain and assigned this
|
|
72
|
+
agent a mailbox in Cohort → Settings → Email first (the wizard's verify step
|
|
73
|
+
probes `email.inbox` and WARNS until then — it never blocks setup).
|
|
74
|
+
|
|
75
|
+
## 6. Always-on (launchd)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
scripts/setup/init-agent.sh # deps → state dirs → generate-plists.sh → launchctl load
|
|
79
|
+
launchctl list | grep ai.maestro
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Expect the daemon plus the cadence triggers; the daemon plist is KeepAlive
|
|
83
|
+
`{SuccessfulExit:false, Crashed:true}` so it restarts on crash but respects a
|
|
84
|
+
clean stop.
|
|
85
|
+
|
|
86
|
+
## 7. Verify — `cohort doctor` is the gate
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
cohort doctor
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
All green includes the **Cohort connectivity** block: enrollment resolved →
|
|
93
|
+
directory reachable (latency) → protocol version aligned (the server's
|
|
94
|
+
`x-org-protocol` header; a drift warning means run `cohort upgrade`) → **key
|
|
95
|
+
paired to a workforce member** (the `messaging.channels` gate) → **workspace
|
|
96
|
+
mailbox reachable** (when `config/orgmail.yaml` exists).
|
|
97
|
+
|
|
98
|
+
Then two live probes:
|
|
99
|
+
|
|
100
|
+
1. **DM the agent in Cohort** — expect a reply (inbound rides the messaging
|
|
101
|
+
plane; watch `state/inbox/` fill and `logs/` narrate).
|
|
102
|
+
2. **Email the agent's workspace address** — watch `state/inbox/orgmail/`
|
|
103
|
+
populate within ≤45s (the poll tick), and expect a correctly-threaded reply
|
|
104
|
+
dispatched by the hq outbox within ≤2 min (post-commit kick ≈1.5s, loop
|
|
105
|
+
tick ≤60s). First-contact recipients park as approvals in /decisions — by
|
|
106
|
+
design.
|
|
107
|
+
|
|
108
|
+
## 8. Operations
|
|
109
|
+
|
|
110
|
+
- **Kill switch**: touch `.emergency-stop` in the repo root (human-only). The
|
|
111
|
+
daemon exits clean, so launchd stops the restart treadmill. Resume with
|
|
112
|
+
`scripts/resume-operations.sh`.
|
|
113
|
+
- **Email-only kill switch**: delete/rename `config/orgmail.yaml` and restart —
|
|
114
|
+
the gate-file loop skips the platform; server-side an admin can flip the
|
|
115
|
+
mailbox to Disabled in Settings → Email.
|
|
116
|
+
- **Upgrade**: `cohort upgrade` (framework files), `npm i -g @cohortapp/agent-sdk@latest`
|
|
117
|
+
(the SDK itself). A doctor "protocol drift" warning is the upgrade cue.
|
|
118
|
+
- **Health**: `scripts/healthcheck.sh`; logs under `logs/` (`logs/audit/` carries
|
|
119
|
+
the per-action JSONL rows from BOTH the native executor and the MCP plane).
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
# Media Generation Setup Guide
|
|
2
|
+
|
|
3
|
+
How to generate branded illustrations, diagrams, and video assets using Google Gemini and Veo APIs. Covers API setup, prompt specification authoring, image generation, video generation, brand alignment, and troubleshooting.
|
|
4
|
+
|
|
5
|
+
**Prerequisites**: Complete the [Mac Mini Bootstrap](../runbooks/mac-mini-bootstrap.md). Node.js 20+ must be installed.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Architecture Overview
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌─────────────────────────────────────────────────────────────────┐
|
|
13
|
+
│ PROMPT SPECS (TypeScript/ESM files) │
|
|
14
|
+
│ │
|
|
15
|
+
│ scripts/media-generation/prompts/ │
|
|
16
|
+
│ ├── illustrations/ *.ts / *.mjs │
|
|
17
|
+
│ ├── diagrams/ *.ts / *.mjs │
|
|
18
|
+
│ └── videos/ *.ts / *.mjs │
|
|
19
|
+
│ │
|
|
20
|
+
│ Each spec exports: { id, slug, title, purpose, style, │
|
|
21
|
+
│ colorPalette, mood, elements, aspectRatio, ... } │
|
|
22
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
23
|
+
│ GENERATION │
|
|
24
|
+
│ │
|
|
25
|
+
│ generate-assets.mjs │
|
|
26
|
+
│ ├── --illustration <slug> → gemini-image-client.mjs │
|
|
27
|
+
│ │ └── @google/genai SDK → Gemini 3 Pro / Imagen │
|
|
28
|
+
│ │ └── public/generated/illustrations/<slug>.png │
|
|
29
|
+
│ │ │
|
|
30
|
+
│ ├── --video <slug> → veo-video-client.mjs │
|
|
31
|
+
│ │ └── @google/genai SDK → Veo 3.1 │
|
|
32
|
+
│ │ └── public/generated/videos/<slug>.mp4 │
|
|
33
|
+
│ │ │
|
|
34
|
+
│ ├── --all-missing → batch generate all missing illustrations │
|
|
35
|
+
│ └── --all-missing-videos → batch generate all missing videos │
|
|
36
|
+
│ │
|
|
37
|
+
│ Rate limit: 15s between requests │
|
|
38
|
+
│ Generation log: scripts/media-generation/generation-log.json │
|
|
39
|
+
├─────────────────────────────────────────────────────────────────┤
|
|
40
|
+
│ OUTPUT │
|
|
41
|
+
│ │
|
|
42
|
+
│ public/generated/ │
|
|
43
|
+
│ ├── illustrations/ *.png │
|
|
44
|
+
│ ├── diagrams/ *.png │
|
|
45
|
+
│ └── videos/ *.mp4 │
|
|
46
|
+
└─────────────────────────────────────────────────────────────────┘
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 1. API Setup
|
|
52
|
+
|
|
53
|
+
### 1.1 Get a Gemini API Key
|
|
54
|
+
|
|
55
|
+
1. Go to https://aistudio.google.com/apikey
|
|
56
|
+
2. Create a new API key (or use an existing one)
|
|
57
|
+
3. The same key works for both image (Gemini/Imagen) and video (Veo) generation
|
|
58
|
+
|
|
59
|
+
### 1.2 Configure Environment
|
|
60
|
+
|
|
61
|
+
Add to `.env`:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
GEMINI_API_KEY=your-api-key-here
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 1.3 Install Dependencies
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cd ~/agent-repo && npm install
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Required packages (in `package.json`):
|
|
74
|
+
- `@google/genai` — Google AI SDK for Gemini and Veo
|
|
75
|
+
- `dotenv` — Environment variable loading
|
|
76
|
+
|
|
77
|
+
### 1.4 Verify Setup
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# Quick test — list available prompt specs
|
|
81
|
+
node scripts/media-generation/generate-assets.mjs --list
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 2. Image Generation (Gemini / Imagen)
|
|
87
|
+
|
|
88
|
+
### 2.1 Generate a Single Illustration
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
node scripts/media-generation/generate-assets.mjs --illustration <slug>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The `<slug>` must match a prompt spec file in `scripts/media-generation/prompts/illustrations/`.
|
|
95
|
+
|
|
96
|
+
### 2.2 Generate All Missing
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Generate illustrations for all specs that don't have output files yet
|
|
100
|
+
node scripts/media-generation/generate-assets.mjs --all-missing
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 2.3 Models
|
|
104
|
+
|
|
105
|
+
| Model | Quality | Speed | Use Case |
|
|
106
|
+
|---|---|---|---|
|
|
107
|
+
| `gemini-3-pro-image-preview` | Best | Slower | Default — board packs, investor materials |
|
|
108
|
+
| `imagen-*` variants | Good | Fast | High-volume generation, social media |
|
|
109
|
+
|
|
110
|
+
Override via prompt spec or environment:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
GEMINI_MODEL=imagen-3.0-generate-002 node scripts/media-generation/generate-assets.mjs --illustration <slug>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 2.4 Aspect Ratios
|
|
117
|
+
|
|
118
|
+
Supported: `1:1`, `3:4`, `4:3`, `9:16`, `16:9`
|
|
119
|
+
|
|
120
|
+
Set per prompt spec in the `aspectRatio` field.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 3. Video Generation (Veo 3.1)
|
|
125
|
+
|
|
126
|
+
### 3.1 Generate a Video
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
node scripts/media-generation/generate-assets.mjs --video <slug>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 3.2 Generate All Missing Videos
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
node scripts/media-generation/generate-assets.mjs --all-missing-videos
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 3.3 Configuration
|
|
139
|
+
|
|
140
|
+
| Setting | Default | Options |
|
|
141
|
+
|---|---|---|
|
|
142
|
+
| Model | `veo-3.1-generate-preview` | — |
|
|
143
|
+
| Duration | 8 seconds | 4, 6, 8 |
|
|
144
|
+
| Resolution | 720p | 720p, 1080p, 4k |
|
|
145
|
+
| Modes | text-to-video | text-to-video, image-to-video |
|
|
146
|
+
|
|
147
|
+
### 3.4 Polling
|
|
148
|
+
|
|
149
|
+
Video generation is asynchronous. The client:
|
|
150
|
+
1. Submits the generation request
|
|
151
|
+
2. Polls every 10 seconds for completion
|
|
152
|
+
3. Times out after 10 minutes
|
|
153
|
+
4. Downloads the video file on completion
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## 4. Prompt Specifications
|
|
158
|
+
|
|
159
|
+
### 4.1 Structure
|
|
160
|
+
|
|
161
|
+
Prompts are TypeScript (`.ts`) or ESM (`.mjs`) files in `scripts/media-generation/prompts/`:
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
prompts/
|
|
165
|
+
illustrations/ # Board pack covers, section illustrations
|
|
166
|
+
diagrams/ # Architecture diagrams, flow charts
|
|
167
|
+
videos/ # Animated intros, presentation backgrounds
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 4.2 Writing a Prompt Spec
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// scripts/media-generation/prompts/illustrations/board-pack-cover-q2.ts
|
|
174
|
+
export default {
|
|
175
|
+
id: "board-pack-cover-q2-2026",
|
|
176
|
+
slug: "board-pack-cover-q2-2026",
|
|
177
|
+
title: "Q2 2026 Board Pack Cover Illustration",
|
|
178
|
+
purpose: "Cover page visual for quarterly board materials",
|
|
179
|
+
imageCategory: "editorial-hand-drawn",
|
|
180
|
+
colorPalette: ["#1C1917", "#FAFAF9", "#78716C", "#D6D3D1"],
|
|
181
|
+
mood: ["institutional", "sophisticated", "premium"],
|
|
182
|
+
elements: [
|
|
183
|
+
"abstract representation of global financial network",
|
|
184
|
+
"interconnected nodes suggesting multi-jurisdiction structure",
|
|
185
|
+
"subtle reference to algorithmic trading"
|
|
186
|
+
],
|
|
187
|
+
style: "Monochromatic NYT-style hand-drawn editorial illustration. " +
|
|
188
|
+
"Pen-and-ink technique with cross-hatching and stippling. " +
|
|
189
|
+
"No color, no gradients, no digital effects.",
|
|
190
|
+
aspectRatio: "3:4",
|
|
191
|
+
};
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### 4.3 Key Fields
|
|
195
|
+
|
|
196
|
+
| Field | Required | Description |
|
|
197
|
+
|---|---|---|
|
|
198
|
+
| `id` | Yes | Unique identifier |
|
|
199
|
+
| `slug` | Yes | Filename-safe identifier (used for output filename) |
|
|
200
|
+
| `title` | Yes | Human-readable title |
|
|
201
|
+
| `purpose` | Yes | What this asset is used for |
|
|
202
|
+
| `style` | Yes | Detailed style description for the AI model |
|
|
203
|
+
| `colorPalette` | No | Hex colour values (brand-aligned) |
|
|
204
|
+
| `mood` | No | Tone descriptors |
|
|
205
|
+
| `elements` | No | Visual elements to include |
|
|
206
|
+
| `aspectRatio` | No | Output aspect ratio (default: `16:9`) |
|
|
207
|
+
| `imageCategory` | No | Category tag for organisation |
|
|
208
|
+
|
|
209
|
+
### 4.4 TypeScript vs ESM
|
|
210
|
+
|
|
211
|
+
- `.ts` files require `tsx` (installed via devDependencies) — the generator shells out to `npx tsx` to evaluate them
|
|
212
|
+
- `.mjs` files are imported directly — slightly faster, no build step
|
|
213
|
+
- Both work identically; use `.ts` for consistency with the rest of the project
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 5. Brand Alignment
|
|
218
|
+
|
|
219
|
+
All generated assets must follow `config/brand-assets.yaml`:
|
|
220
|
+
|
|
221
|
+
### 5.1 Illustration Style
|
|
222
|
+
|
|
223
|
+
- **Monochromatic editorial hand-drawn** (NYT-style)
|
|
224
|
+
- Pen-and-ink technique: cross-hatching, stippling
|
|
225
|
+
- No colour, no gradients, no digital effects
|
|
226
|
+
- Restrained and institutional mood
|
|
227
|
+
|
|
228
|
+
### 5.2 Colour Palette
|
|
229
|
+
|
|
230
|
+
| Colour | Hex | Usage |
|
|
231
|
+
|---|---|---|
|
|
232
|
+
| Near-black | `#1C1917` | Primary line work |
|
|
233
|
+
| Off-white | `#FAFAF9` | Background/negative space |
|
|
234
|
+
| Warm gray | `#78716C` | Secondary elements |
|
|
235
|
+
| Light gray | `#D6D3D1` | Tertiary/halftone areas |
|
|
236
|
+
| Medium gray | `#A8A29E` | Mid-tones |
|
|
237
|
+
|
|
238
|
+
### 5.3 What to Avoid
|
|
239
|
+
|
|
240
|
+
- Cartoon or comic styles
|
|
241
|
+
- Isometric SaaS/tech aesthetics
|
|
242
|
+
- Stock photography look
|
|
243
|
+
- Bright colours or saturated palettes
|
|
244
|
+
- Clip art or flat design icons
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 6. Output & Logging
|
|
249
|
+
|
|
250
|
+
### 6.1 Output Directories
|
|
251
|
+
|
|
252
|
+
| Type | Path |
|
|
253
|
+
|---|---|
|
|
254
|
+
| Illustrations | `public/generated/illustrations/<slug>.png` |
|
|
255
|
+
| Diagrams | `public/generated/diagrams/<slug>.png` |
|
|
256
|
+
| Videos | `public/generated/videos/<slug>.mp4` |
|
|
257
|
+
|
|
258
|
+
### 6.2 Generation Log
|
|
259
|
+
|
|
260
|
+
Every generation is recorded in `scripts/media-generation/generation-log.json`:
|
|
261
|
+
|
|
262
|
+
```json
|
|
263
|
+
[
|
|
264
|
+
{
|
|
265
|
+
"slug": "board-pack-cover-q2-2026",
|
|
266
|
+
"type": "illustration",
|
|
267
|
+
"model": "gemini-3-pro-image-preview",
|
|
268
|
+
"generatedAt": "2026-04-09T14:30:00.000Z",
|
|
269
|
+
"outputPath": "public/generated/illustrations/board-pack-cover-q2-2026.png"
|
|
270
|
+
}
|
|
271
|
+
]
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 6.3 Rate Limiting
|
|
275
|
+
|
|
276
|
+
A 15-second delay is enforced between consecutive API requests to avoid rate limits. For batch generation (`--all-missing`), this means ~4 images per minute.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 7. Testing
|
|
281
|
+
|
|
282
|
+
| # | Test | How to Verify |
|
|
283
|
+
|---|---|---|
|
|
284
|
+
| 1 | API key valid | `node -e "require('dotenv').config(); console.log(process.env.GEMINI_API_KEY?.slice(0,8))"` |
|
|
285
|
+
| 2 | List specs | `node scripts/media-generation/generate-assets.mjs --list` |
|
|
286
|
+
| 3 | Generate image | Generate one illustration and verify output in `public/generated/` |
|
|
287
|
+
| 4 | Generate video | Generate one video (takes several minutes) |
|
|
288
|
+
| 5 | Brand alignment | Verify output matches monochromatic editorial style |
|
|
289
|
+
| 6 | Batch generation | `--all-missing` — should skip already-generated assets |
|
|
290
|
+
| 7 | Generation log | Check `generation-log.json` for entries |
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 8. Troubleshooting
|
|
295
|
+
|
|
296
|
+
### "GEMINI_API_KEY not set"
|
|
297
|
+
|
|
298
|
+
1. Check `.env` file exists and contains the key
|
|
299
|
+
2. Verify key format (should be a long alphanumeric string)
|
|
300
|
+
3. Get a key from https://aistudio.google.com/apikey
|
|
301
|
+
|
|
302
|
+
### Rate limit errors
|
|
303
|
+
|
|
304
|
+
1. The 15-second delay should prevent most rate limits
|
|
305
|
+
2. If hit, wait 60 seconds and retry
|
|
306
|
+
3. For heavy batch generation, consider running overnight
|
|
307
|
+
4. Check your API quota at https://aistudio.google.com/
|
|
308
|
+
|
|
309
|
+
### "Prompt spec not found"
|
|
310
|
+
|
|
311
|
+
1. Check the slug matches a file in `scripts/media-generation/prompts/illustrations/` (or `diagrams/`, `videos/`)
|
|
312
|
+
2. File must end in `.ts` or `.mjs`
|
|
313
|
+
3. List available specs: `node scripts/media-generation/generate-assets.mjs --list`
|
|
314
|
+
|
|
315
|
+
### Image quality issues
|
|
316
|
+
|
|
317
|
+
1. Review the `style` field in the prompt spec — be more specific about the desired aesthetic
|
|
318
|
+
2. Add negative prompts ("no cartoon", "no digital effects")
|
|
319
|
+
3. Try a different model (Imagen may produce different results than Gemini)
|
|
320
|
+
4. Adjust aspect ratio to match the intended use
|
|
321
|
+
|
|
322
|
+
### Video generation timeout
|
|
323
|
+
|
|
324
|
+
1. Default timeout is 10 minutes — video generation can be slow
|
|
325
|
+
2. Check the Veo API status if consistently timing out
|
|
326
|
+
3. Try shorter duration (4s instead of 8s) for faster generation
|
|
327
|
+
4. Lower resolution (720p) generates faster than 1080p/4k
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Key Files
|
|
332
|
+
|
|
333
|
+
| File | Purpose |
|
|
334
|
+
|---|---|
|
|
335
|
+
| `scripts/media-generation/generate-assets.mjs` | Main generation orchestrator |
|
|
336
|
+
| `scripts/media-generation/gemini-image-client.mjs` | Google Gemini/Imagen image API client |
|
|
337
|
+
| `scripts/media-generation/veo-video-client.mjs` | Veo 3.1 video API client |
|
|
338
|
+
| `scripts/media-generation/prompts/` | Prompt spec directory (illustrations, diagrams, videos) |
|
|
339
|
+
| `scripts/media-generation/generation-log.json` | Generation history log |
|
|
340
|
+
| `public/generated/` | Output directory for all generated assets |
|
|
341
|
+
| `config/brand-assets.yaml` | Brand style guide (colours, typography, illustration style) |
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Related Documents
|
|
346
|
+
|
|
347
|
+
- [PDF Generation Setup](pdf-generation-setup.md) — Using generated assets in branded PDFs
|
|
348
|
+
- [Agent Persona Setup](agent-persona-setup.md) — Brand configuration
|
|
349
|
+
- [Mac Mini Bootstrap](../runbooks/mac-mini-bootstrap.md) — Node.js and dependency installation
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Model routing — Anthropic / Moonshot / Qwen via one config
|
|
2
|
+
|
|
3
|
+
Maestro's daemon historically routed every spawned `claude --print`
|
|
4
|
+
through the Claude CLI's keychain-resident OAuth token (Max
|
|
5
|
+
subscription). That's still the default. **The model router is
|
|
6
|
+
opt-in** — drop a `config/model-routing.yaml` into an agent and the
|
|
7
|
+
daemon will start routing each session to the cheapest backend that
|
|
8
|
+
satisfies the request's declared capability needs.
|
|
9
|
+
|
|
10
|
+
## Why
|
|
11
|
+
|
|
12
|
+
Two big shifts in 2026:
|
|
13
|
+
|
|
14
|
+
1. **Moonshot AI** ships a native `/anthropic` Messages endpoint, so
|
|
15
|
+
Kimi K2.6 is a literal drop-in for Claude Code — no router, no
|
|
16
|
+
wire-format translation, no tool-use degradation. K2.6 lands on
|
|
17
|
+
80.2% SWE-bench Verified (within ~12 points of Sonnet 5) at
|
|
18
|
+
roughly 30% of Sonnet's per-token cost. The Anthropic endpoint
|
|
19
|
+
also supports cache-hit pricing (~$0.16/M cache reads).
|
|
20
|
+
2. **Qwen3-Coder-Next** (80B / 3B-active MoE) hits ~70% SWE-bench
|
|
21
|
+
Verified and is available everywhere — DashScope direct, OpenRouter,
|
|
22
|
+
DeepInfra, local vLLM/Ollama. At $0.22/M input via OpenRouter it's
|
|
23
|
+
the cheapest credible coding model.
|
|
24
|
+
|
|
25
|
+
For a daemon that runs 100+ sessions/day across inbox, backlog, and
|
|
26
|
+
cadence ticks, routing routine work to Moonshot/Qwen and only escalating
|
|
27
|
+
to Anthropic when an agent actually needs `extended-thinking` or
|
|
28
|
+
`prompt-cache-1h` cuts spend by ~70% with no loss on the work that
|
|
29
|
+
matters.
|
|
30
|
+
|
|
31
|
+
## Quick start
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# In the agent repo:
|
|
35
|
+
npx @cohortapp/agent-sdk init # idempotent — places model-routing.yaml.disabled
|
|
36
|
+
|
|
37
|
+
# Add credentials to .env:
|
|
38
|
+
echo "MOONSHOT_API_KEY=msk-..." >> .env
|
|
39
|
+
echo "OPENROUTER_API_KEY=sk-or-..." >> .env
|
|
40
|
+
|
|
41
|
+
# Activate by renaming:
|
|
42
|
+
mv config/model-routing.yaml.disabled config/model-routing.yaml
|
|
43
|
+
|
|
44
|
+
# Restart the daemon — every new spawn now respects the routing policy.
|
|
45
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.<agent>-daemon.plist
|
|
46
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.<agent>-daemon.plist
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Config reference
|
|
50
|
+
|
|
51
|
+
`config/model-routing.yaml` has three sections:
|
|
52
|
+
|
|
53
|
+
### `backends:`
|
|
54
|
+
Each backend declares the wire format, base URL, auth env var,
|
|
55
|
+
capabilities, pricing, and concrete model names per tier.
|
|
56
|
+
|
|
57
|
+
| Field | Meaning |
|
|
58
|
+
|-------|---------|
|
|
59
|
+
| `transport` | `anthropic-cli` (no env injection — current default) \| `anthropic-native` (point at any Messages endpoint) \| `openai-compat` (OpenAI-compatible like OpenRouter, DashScope) |
|
|
60
|
+
| `base_url` | HTTPS endpoint base |
|
|
61
|
+
| `auth_env` | Env var holding the auth token (omit for keychain OAuth) |
|
|
62
|
+
| `capabilities` | Tagged-set: `thinking`, `vision`, `tool_use`, `parallel_tools`, `long_context_262k`/`_1m`, `prompt_cache_1h`/`_hit`, `degraded_tool_use` |
|
|
63
|
+
| `pricing` | `input_per_m`, `output_per_m`, optional `cache_hit_per_m` |
|
|
64
|
+
| `models` | `classifier` / `fast` / `default` / `premium` slots |
|
|
65
|
+
|
|
66
|
+
### `routing_policy:`
|
|
67
|
+
List of rules, top-down. First match wins. A `default: true` rule is
|
|
68
|
+
the terminal fallback.
|
|
69
|
+
|
|
70
|
+
Supported match keys:
|
|
71
|
+
- `agent_role`, `agent_role_in: [...]`
|
|
72
|
+
- `needs_thinking`, `needs_vision`, `needs_tool_use`,
|
|
73
|
+
`needs_parallel_tools`, `needs_long_context`
|
|
74
|
+
- `tier: classifier | fast | default | premium`
|
|
75
|
+
- `model_hint: haiku | sonnet | opus`
|
|
76
|
+
- `token_estimate_gte: 60000` / `token_estimate_lt: …`
|
|
77
|
+
- `source: inbox | backlog | cadence | voice`
|
|
78
|
+
- `priority: critical | high | normal`
|
|
79
|
+
|
|
80
|
+
Each rule can also declare a `fallback: [backend_name, …]` list: if
|
|
81
|
+
the primary backend doesn't satisfy the request's capability needs,
|
|
82
|
+
the resolver tries each fallback in order before failing through to
|
|
83
|
+
the global Anthropic safety net.
|
|
84
|
+
|
|
85
|
+
### Global flags
|
|
86
|
+
- `fallback_to_anthropic` (default `true`) — final safety net when no
|
|
87
|
+
backend satisfies a request. Set `false` to make the router strict.
|
|
88
|
+
- `strip_attribution_header` (default `true`) — sets
|
|
89
|
+
`CLAUDE_CODE_ATTRIBUTION_HEADER=0` for non-Anthropic backends so a
|
|
90
|
+
third-party gateway's prompt-cache key isn't poisoned.
|
|
91
|
+
- `disable_experimental_betas` (default `true`) — sets
|
|
92
|
+
`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` for non-Anthropic backends
|
|
93
|
+
so `/advisor`, etc. don't silently degrade.
|
|
94
|
+
|
|
95
|
+
## Recommended policy template
|
|
96
|
+
|
|
97
|
+
```yaml
|
|
98
|
+
routing_policy:
|
|
99
|
+
# Safety — never cheap-route security-critical work.
|
|
100
|
+
- match: { agent_role_in: [ceo_pre_pass, audit, decision_writer, regulatory] }
|
|
101
|
+
backend: anthropic
|
|
102
|
+
# Extended-thinking → Anthropic.
|
|
103
|
+
- match: { needs_thinking: true }
|
|
104
|
+
backend: anthropic
|
|
105
|
+
fallback: [moonshot]
|
|
106
|
+
# Reliable tool use → Moonshot first (native Anthropic shape).
|
|
107
|
+
- match: { needs_tool_use: true }
|
|
108
|
+
backend: moonshot
|
|
109
|
+
fallback: [anthropic]
|
|
110
|
+
# Long-context (>60k) → Moonshot 262k window.
|
|
111
|
+
- match: { token_estimate_gte: 60000 }
|
|
112
|
+
backend: moonshot
|
|
113
|
+
fallback: [anthropic]
|
|
114
|
+
# Classifier / background → cheapest.
|
|
115
|
+
- match: { tier: classifier }
|
|
116
|
+
backend: openrouter_qwen
|
|
117
|
+
fallback: [moonshot, anthropic]
|
|
118
|
+
- match: { source: backlog }
|
|
119
|
+
backend: openrouter_qwen
|
|
120
|
+
fallback: [moonshot, anthropic]
|
|
121
|
+
- default: true
|
|
122
|
+
backend: moonshot
|
|
123
|
+
fallback: [anthropic]
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Observability
|
|
127
|
+
|
|
128
|
+
Every spawn that picks a non-`anthropic-cli` backend writes a
|
|
129
|
+
`routed` event to `logs/daemon/<date>-sessions.jsonl`:
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"event": "routed",
|
|
134
|
+
"sessionId": "s-...",
|
|
135
|
+
"backend": "moonshot",
|
|
136
|
+
"transport": "anthropic-native",
|
|
137
|
+
"model": "kimi-k2.6",
|
|
138
|
+
"tried": [...],
|
|
139
|
+
"fallback_reason": null
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Use these to compute cost-per-agent, success-rate-per-model, and
|
|
144
|
+
failover counters. A future `scripts/cost/track-claude-usage.mjs`
|
|
145
|
+
patch will surface backend breakdowns in the daily
|
|
146
|
+
`state/dashboards/cost-summary.yaml`.
|
|
147
|
+
|
|
148
|
+
## Risks + guardrails
|
|
149
|
+
|
|
150
|
+
| Risk | Symptom | Mitigation |
|
|
151
|
+
|------|---------|------------|
|
|
152
|
+
| Empty `tool_use.input` from OpenRouter+Qwen | Agent loops do nothing, claude logs "no input" | Tag backend with `degraded_tool_use`; router routes `needs_tool_use: true` away. |
|
|
153
|
+
| Lost prompt caching | Cost regression after switching | Only Moonshot supports cache-hit pricing on non-Anthropic backends. Watch `state/cost-tracking/` for >2× spend on previously-cached prompts. |
|
|
154
|
+
| Hallucinated tool names | Agent calls non-existent tools | maestro's existing `tool_not_found` counter catches this; auto-escalate after N consecutive misses by piping the agent through a fallback Anthropic rule. |
|
|
155
|
+
| `/advisor` (Anthropic-only) silently degrading | Subtle quality drop | `disable_experimental_betas: true` is the default; leave it on. |
|
|
156
|
+
| LiteLLM compromised versions | Credential theft (1.82.7/1.82.8) | Pin router/proxy versions in `package.json`; never auto-upgrade router binaries. |
|
|
157
|
+
|
|
158
|
+
## See also
|
|
159
|
+
- `lib/model-router.mjs` — source
|
|
160
|
+
- `lib/model-router.test.mjs` — behaviour reference
|
|
161
|
+
- `scripts/setup/init-model-router.mjs` — wizard
|
|
162
|
+
- `scaffold/config/model-routing.yaml.example` — template
|