@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,46 @@
|
|
|
1
|
+
# Caller ID to user mapping for voice/SMS authorization
|
|
2
|
+
#
|
|
3
|
+
# Used by: sms-handler.mjs, parse-voice-transcript.mjs, user-context-search.py
|
|
4
|
+
# Maps phone numbers, Slack IDs, and emails to user identities with access levels.
|
|
5
|
+
#
|
|
6
|
+
# Access levels:
|
|
7
|
+
# ceo — Full access to all paths (memory, knowledge, state, outputs, docs, logs, all interactions)
|
|
8
|
+
# leadership — Company knowledge + docs + research/briefs + own interaction logs
|
|
9
|
+
# partner — Public knowledge + research + own interaction logs
|
|
10
|
+
# default — Unknown callers — public company knowledge only (knowledge/sources/)
|
|
11
|
+
#
|
|
12
|
+
# Hot-reloaded every 60 seconds by sms-handler.mjs — no restart needed after edits.
|
|
13
|
+
#
|
|
14
|
+
# Setup: See docs/guides/voice-sms-setup.md for full configuration instructions.
|
|
15
|
+
|
|
16
|
+
users:
|
|
17
|
+
# ── Principal (the person this agent reports to) ──────────────────────────
|
|
18
|
+
# Replace with your principal's details. This entry should have access_level: ceo.
|
|
19
|
+
principal:
|
|
20
|
+
name: "Principal Full Name"
|
|
21
|
+
phone: ["+1XXXXXXXXXX"]
|
|
22
|
+
whatsapp: ["+1XXXXXXXXXX"]
|
|
23
|
+
slack_id: "UXXXXXXXXXX"
|
|
24
|
+
email: "principal@company.com"
|
|
25
|
+
access_level: ceo
|
|
26
|
+
|
|
27
|
+
# ── Leadership / Team ─────────────────────────────────────────────────────
|
|
28
|
+
# Add team members who should be recognized by the SMS handler and voice parser.
|
|
29
|
+
# Each entry needs at minimum: name, slack_id, email, and access_level.
|
|
30
|
+
# Phone numbers are only needed if the person will contact the agent via SMS/voice.
|
|
31
|
+
|
|
32
|
+
# example-leader:
|
|
33
|
+
# name: "Example Leader"
|
|
34
|
+
# phone: []
|
|
35
|
+
# slack_id: "UXXXXXXXXXX"
|
|
36
|
+
# email: "leader@company.com"
|
|
37
|
+
# access_level: leadership
|
|
38
|
+
|
|
39
|
+
# ── Partners / External ───────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
# example-partner:
|
|
42
|
+
# name: "External Partner"
|
|
43
|
+
# phone: []
|
|
44
|
+
# slack_id: ""
|
|
45
|
+
# email: "partner@external.com"
|
|
46
|
+
# access_level: partner
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# config/collective.yaml — Collective Memory & Org Mesh
|
|
2
|
+
#
|
|
3
|
+
# Controls cross-session global memory, concurrent-session presence, and the
|
|
4
|
+
# org mesh. See docs/architecture/collective-memory-and-org-mesh.md.
|
|
5
|
+
#
|
|
6
|
+
# Every value below is the built-in default (lib/collective/config.mjs DEFAULTS);
|
|
7
|
+
# this file only needs the keys you want to override. Delete it entirely and the
|
|
8
|
+
# defaults apply. Set `enabled: false` to turn the whole layer off.
|
|
9
|
+
|
|
10
|
+
enabled: true
|
|
11
|
+
|
|
12
|
+
# --- Capture (write path) -------------------------------------------------
|
|
13
|
+
# Cheap model used to distil a finished session into memory cards. "haiku" maps
|
|
14
|
+
# to the current Haiku via lib/claude-bin; never the agent's main model.
|
|
15
|
+
captureModel: haiku
|
|
16
|
+
# Which Claude Code hook events trigger a capture pass.
|
|
17
|
+
captureOn: [Stop, PreCompact]
|
|
18
|
+
# Skip distillation for trivial sessions (fewer than this many user turns).
|
|
19
|
+
minTurnsToCapture: 2
|
|
20
|
+
# Hard cap on cards distilled from a single session (anti-bloat + cost guard).
|
|
21
|
+
maxCardsPerSession: 12
|
|
22
|
+
# Repos/paths whose sessions must NOT contribute to memory (substring or glob,
|
|
23
|
+
# matched against the session cwd). Client work, secrets, anything ring-fenced.
|
|
24
|
+
# Information-barrier domains are always excluded regardless of this list.
|
|
25
|
+
repoDenylist: []
|
|
26
|
+
|
|
27
|
+
# --- Recall (read path) ---------------------------------------------------
|
|
28
|
+
# Hard token budget for the SessionStart digest. THE anti-bloat control.
|
|
29
|
+
digestBudgetTokens: 1500
|
|
30
|
+
# Recency half-life (days) for the recall decay term.
|
|
31
|
+
recencyHalfLifeDays: 30
|
|
32
|
+
|
|
33
|
+
# --- Presence -------------------------------------------------------------
|
|
34
|
+
presence:
|
|
35
|
+
heartbeatSec: 60 # how often a live session refreshes its heartbeat
|
|
36
|
+
staleSec: 300 # entries with no heartbeat past this are reaped
|
|
37
|
+
|
|
38
|
+
# --- Org mesh -------------------------------------------------------------
|
|
39
|
+
org:
|
|
40
|
+
# Where the human org chart comes from: file (local) | google | slack.
|
|
41
|
+
directorySource: file
|
|
42
|
+
# Channel (Slack id / address) the daily org-pulse + handoff mirror post to.
|
|
43
|
+
pulseChannel: ""
|
|
44
|
+
# Optional live cross-machine registry. Off by default (file-backed works
|
|
45
|
+
# without it). Flip enabled:true + fill apiUrl/orgId to publish to cohort.
|
|
46
|
+
cohort:
|
|
47
|
+
enabled: false
|
|
48
|
+
apiUrl: "" # e.g. https://api.cohortapp.com
|
|
49
|
+
orgId: ""
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_doc": "Company identity & context — the single source of truth for WHO the agent works for. Populated by /init-maestro (CLI interview + docs/company-context/ + GitHub-repo analysis). Framework files reference these via {{company.*}} tokens (resolved at load time); generators (charter, backlog, comms) fold the richer fields into company-specific output. See README.md § Company context.",
|
|
3
|
+
"name": "UNCONFIGURED",
|
|
4
|
+
"legalName": "",
|
|
5
|
+
"website": "",
|
|
6
|
+
"domain": "",
|
|
7
|
+
"tagline": "",
|
|
8
|
+
"description": "",
|
|
9
|
+
"industry": "",
|
|
10
|
+
"stage": "",
|
|
11
|
+
"headcount": "",
|
|
12
|
+
"locations": [],
|
|
13
|
+
"jurisdictions": [],
|
|
14
|
+
"products": [],
|
|
15
|
+
"competitors": [],
|
|
16
|
+
"strategicPriorities": [],
|
|
17
|
+
"keyPeople": [],
|
|
18
|
+
"contextDocs": [],
|
|
19
|
+
"repos": []
|
|
20
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://cohortapp.com/schemas/agent-sdk/known-agents.v1.json",
|
|
3
|
+
"schema_version": "1",
|
|
4
|
+
"_comment": "Registry of all AI agents in your organisation. Read by scripts/daemon/classifier.mjs to prevent cross-agent message interception — when a message @-mentions a specific agent's name or Slack ID, only that agent's daemon should respond. Each agent repo holds its own copy of this file. Populate it with your peer agents at init (the /init-maestro wizard can seed it from company context) and edit when peers are added/removed. Each entry has the shape { name, fullName, slackId, role, repo } — e.g. { \"name\": \"Alex\", \"fullName\": \"Alex Chen\", \"slackId\": \"U0XXXXXXX\", \"role\": \"Chief of Staff\", \"repo\": \"alex-ai\" }.",
|
|
5
|
+
"agents": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# config/learning.yaml — Self-Learning Loop (WS3)
|
|
2
|
+
#
|
|
3
|
+
# Controls the autonomous skill-authoring loop: after each finished session the
|
|
4
|
+
# agent reviews what it did and may create or patch a Claude Code skill, then
|
|
5
|
+
# prunes stale skills over time. See docs (Hermes integration design §6).
|
|
6
|
+
#
|
|
7
|
+
# Every value below is the built-in default (lib/learning/config.mjs DEFAULTS);
|
|
8
|
+
# this file only needs the keys you want to override. Delete it entirely and the
|
|
9
|
+
# defaults apply. Set `enabled: false` to turn the whole loop off.
|
|
10
|
+
#
|
|
11
|
+
# Fail-open + silent on non-agent machines, exactly like config/collective.yaml.
|
|
12
|
+
|
|
13
|
+
enabled: true
|
|
14
|
+
|
|
15
|
+
# --- Reflect (Pass B — self-improvement review) ---------------------------
|
|
16
|
+
# Skip the skill-review pass for trivial sessions (fewer than this many user
|
|
17
|
+
# turns). Pass A (memory cards) still runs at the collective layer's own gate.
|
|
18
|
+
minTurns: 4
|
|
19
|
+
# Model used for the self-improvement review. Never the agent's main model;
|
|
20
|
+
# "sonnet" maps to the current Sonnet via lib/claude-bin.
|
|
21
|
+
reviewModel: sonnet
|
|
22
|
+
|
|
23
|
+
# --- Nudge counters -------------------------------------------------------
|
|
24
|
+
# When the agent has done a lot of work without capturing a skill, a NUDGE line
|
|
25
|
+
# is added to the review prompt — it raises the prior toward capturing, but never
|
|
26
|
+
# forces a skill (avoids junk). These are the thresholds that trip the nudge.
|
|
27
|
+
nudgeToolUses: 40 # tool-uses since the last skill write
|
|
28
|
+
nudgeSessions: 8 # reflect runs since the last skill write
|
|
29
|
+
|
|
30
|
+
# --- Lifecycle / curator --------------------------------------------------
|
|
31
|
+
# An agent-authored skill goes active → stale → archived as it sits unused.
|
|
32
|
+
# `last_activity` refreshes whenever the skill's id appears in a transcript.
|
|
33
|
+
# Archiving MOVES the .md to skills/_archive/ (never deletes); pinned skills are
|
|
34
|
+
# exempt from every transition.
|
|
35
|
+
staleDays: 30
|
|
36
|
+
archiveDays: 90
|
|
37
|
+
|
|
38
|
+
# --- Curator: umbrella consolidation (phase 2) ----------------------------
|
|
39
|
+
# Periodically the skill-curator merges narrowly-overlapping agent-authored
|
|
40
|
+
# skills into ONE class-level umbrella skill, via a single bounded LLM call run
|
|
41
|
+
# as a DETACHED worker (never a nested sub-session). Conservative by design:
|
|
42
|
+
# only genuinely-overlapping siblings merge; unrelated skills are left alone.
|
|
43
|
+
# Absorbed skills are archived (moved to _archive/, dropped from plugin.json,
|
|
44
|
+
# marked absorbed_into the umbrella) — never deleted.
|
|
45
|
+
consolidation:
|
|
46
|
+
enabled: true # turn the consolidation pass on/off
|
|
47
|
+
minSkills: 5 # don't spawn the LLM below this many agent-authored active skills
|
|
48
|
+
intervalDays: 14 # minimum days between consolidation passes
|
|
49
|
+
model: sonnet # reviewer model for the clustering call
|
|
50
|
+
|
|
51
|
+
# --- Denylist -------------------------------------------------------------
|
|
52
|
+
# Repos/paths whose sessions must NOT feed the learning loop (substring or glob,
|
|
53
|
+
# matched against the session cwd). This EXTENDS the collective repoDenylist —
|
|
54
|
+
# anything ring-fenced from collective memory is ring-fenced here too.
|
|
55
|
+
repoDenylist: []
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# config/model-routing.yaml — Maestro model router, policy v2 (optional, OFF by default)
|
|
2
|
+
#
|
|
3
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
# THIS IS AN EXAMPLE. The router is INERT until you copy this file to
|
|
5
|
+
# `config/model-routing.yaml` AND keep `schema_version: 2`. Without an active
|
|
6
|
+
# config the daemon falls back to its historical default: every `claude --print`
|
|
7
|
+
# spawn uses the keychain-resident Max-subscription OAuth token (Anthropic-only).
|
|
8
|
+
#
|
|
9
|
+
# Kill switch (single step, per machine):
|
|
10
|
+
# - rename config/model-routing.yaml → .disabled, OR
|
|
11
|
+
# - export MAESTRO_ROUTER_FORCE_ANTHROPIC=1
|
|
12
|
+
# Both revert to Anthropic-only immediately; the env var even wins over a corrupt
|
|
13
|
+
# config (it is honoured inside resolveChain before any rule runs).
|
|
14
|
+
#
|
|
15
|
+
# Models are NOT defined here — the bundled catalog
|
|
16
|
+
# (lib/model-router/catalog/*.yaml in @cohortapp/agent-sdk) is the source of truth
|
|
17
|
+
# for every model's identity, status, context window, $/MTok cost, compat flags,
|
|
18
|
+
# tool-reliability grade, and harness affordances. This file is POLICY only:
|
|
19
|
+
# aliases, data-class rules, the ordered chain rules, and the budget ladder.
|
|
20
|
+
#
|
|
21
|
+
# Validate before activating: maestro router validate
|
|
22
|
+
# Explain any decision: maestro router why <item-or-request-json>
|
|
23
|
+
#
|
|
24
|
+
# Full reference: docs/audit/2026-06-10-enterprise/synthesis/SPEC-llm-router.md
|
|
25
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
|
|
27
|
+
schema_version: 2
|
|
28
|
+
|
|
29
|
+
# ── Aliases ────────────────────────────────────────────────────────────────
|
|
30
|
+
# Friendly names → bundled catalog refs ("provider/model-id"). Cheap third-party
|
|
31
|
+
# rows are listed but are UNREACHABLE until their key exists on this machine
|
|
32
|
+
# (key-absence-as-enforcement) and, for sessions, until probe-ledger grade A.
|
|
33
|
+
aliases:
|
|
34
|
+
frontier: anthropic/claude-opus-4-8
|
|
35
|
+
default: anthropic/claude-sonnet-4-6
|
|
36
|
+
fast: anthropic/claude-haiku-4-5
|
|
37
|
+
cheap: deepseek/deepseek-v4-flash # direct-api only until DEEPSEEK_API_KEY exists
|
|
38
|
+
cheap-session: moonshot/kimi-k2.6 # session-host only after grade A + Phase-5 gates
|
|
39
|
+
|
|
40
|
+
# ── Defaults ─────────────────────────────────────────────────────────────────
|
|
41
|
+
defaults:
|
|
42
|
+
needs_tool_use_for_sessions: true # session work defaults to needs_tool_use:true (W5);
|
|
43
|
+
# rules opt OUT explicitly. Grade-B/C rows are then
|
|
44
|
+
# structurally unreachable for tool-using sessions.
|
|
45
|
+
data_class: sensitive # DENY-BY-DEFAULT: unlabeled work never leaves Anthropic.
|
|
46
|
+
cache_ttl: 1h # cadence-paced traffic amortizes the 2× write over >5-min gaps.
|
|
47
|
+
|
|
48
|
+
# ── Backends (data/residency policy + credential binding only) ───────────────
|
|
49
|
+
# allowed_data_classes is the COMPLIANCE gate (not a price gate). A request whose
|
|
50
|
+
# data_class is not in this list is denied for that backend (recorded in tried[]).
|
|
51
|
+
backends:
|
|
52
|
+
anthropic: { allowed_data_classes: [public, internal, sensitive] }
|
|
53
|
+
deepseek: { allowed_data_classes: [public] }
|
|
54
|
+
moonshot: { allowed_data_classes: [public] }
|
|
55
|
+
|
|
56
|
+
# ── Routing policy (ordered, first-match, STRICT-validated) ──────────────────
|
|
57
|
+
# Each rule resolves to a candidate CHAIN of aliases/refs; resolveChain gates
|
|
58
|
+
# them in order (status ▸ harness ▸ capability/grade ▸ context ▸ data_class
|
|
59
|
+
# ▸ credential ▸ breaker ▸ budget ladder) and picks the first survivor. The
|
|
60
|
+
# special chain member "rules" is the caller's deterministic fallback as a
|
|
61
|
+
# terminal candidate. Matching is on STRUCTURED METADATA ONLY — message content
|
|
62
|
+
# never reaches the rule engine, so prompt-injection cannot steer routing.
|
|
63
|
+
routing_policy:
|
|
64
|
+
# Sensitive roles are pinned to the frontier→default Anthropic chain.
|
|
65
|
+
- match: { agent_role_in: [ceo_pre_pass, audit, decision_writer, regulatory] }
|
|
66
|
+
chain: [frontier, default]
|
|
67
|
+
pin: true # exempt from the budget degradation ladder below band 100
|
|
68
|
+
|
|
69
|
+
# Inbox classification: cheap, tool-less, direct; deterministic rules terminal.
|
|
70
|
+
- match: { task_class: classify.inbox }
|
|
71
|
+
harness: direct
|
|
72
|
+
chain: [fast, cheap, rules]
|
|
73
|
+
needs_tool_use: false
|
|
74
|
+
|
|
75
|
+
# Lookups (gmail/calendar/etc): cheap, tool-less, direct.
|
|
76
|
+
- match: { task_class: lookup.* }
|
|
77
|
+
harness: direct
|
|
78
|
+
chain: [fast, cheap]
|
|
79
|
+
needs_tool_use: false
|
|
80
|
+
|
|
81
|
+
# Public backlog work — eligible for the cheap session host ONCE gated (Phase 5).
|
|
82
|
+
- match: { source: backlog, data_class: public, priority: normal }
|
|
83
|
+
chain: [cheap-session, default]
|
|
84
|
+
|
|
85
|
+
# Big prompts go to 1M-ctx rows; NEVER fail over into a smaller context window.
|
|
86
|
+
- match: { token_estimate_gte: 250000 }
|
|
87
|
+
chain: [default, frontier]
|
|
88
|
+
|
|
89
|
+
# Everything else: the default workhorse, fast as the failover tail.
|
|
90
|
+
- default: true
|
|
91
|
+
chain: [default, fast]
|
|
92
|
+
|
|
93
|
+
# ── Budget degradation ladder (a ladder, not a cliff) ────────────────────────
|
|
94
|
+
# Bands come from budget-guard dailyStatus(). pin + priority:critical are exempt
|
|
95
|
+
# below band 100.
|
|
96
|
+
budget_ladder:
|
|
97
|
+
"75": { downgrade_tiers: 1 } # non-pinned chains downgrade one tier
|
|
98
|
+
"90": { force_alias: cheap_or_fast } # cheap/fast lane only
|
|
99
|
+
"100": { essential_only: true } # inbox DMs on the cheapest qualifying row; rest DEFER
|
|
100
|
+
|
|
101
|
+
# ── Safety net + spawn hygiene ───────────────────────────────────────────────
|
|
102
|
+
fallback_to_anthropic: true # nothing survives the gates → the Anthropic safety net
|
|
103
|
+
strip_attribution_header: true # don't poison a third-party prompt cache with tooling metadata
|
|
104
|
+
disable_experimental_betas: true # Anthropic-only betas off when routed off-Anthropic
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# config/org.yaml — Org enrollment (Cohort shared knowledge plane).
|
|
2
|
+
#
|
|
3
|
+
# Disabled by default. An agent runs fully standalone with this file inert;
|
|
4
|
+
# nothing here phones home until you fill in a base URL + a credential.
|
|
5
|
+
#
|
|
6
|
+
# This is the canonical shape lib/org/client.mjs reads
|
|
7
|
+
# (org.cohort.{enabled,base,orgId,token,trustedSignersPem?}). `enabled` flips
|
|
8
|
+
# true only once `base` AND a credential (`token`) are present — the server,
|
|
9
|
+
# not this file, enforces ACL; the file only points the agent at the endpoint.
|
|
10
|
+
#
|
|
11
|
+
# To enroll, the easy path is the wizard: maestro setup --only org
|
|
12
|
+
# (it captures the URL + an admin-issued bearer token or a pairing code and
|
|
13
|
+
# rewrites this file). The fields below document the manual route.
|
|
14
|
+
org:
|
|
15
|
+
cohort:
|
|
16
|
+
enabled: false # set true once base + token are configured
|
|
17
|
+
base: "" # server origin for the /v1 binding, e.g. https://cohort.internal
|
|
18
|
+
orgId: "" # org slug (optional; used by the legacy directory shape)
|
|
19
|
+
token: "" # admin-issued bearer token; or leave blank and set
|
|
20
|
+
# COHORT_API_TOKEN / COHORT_TOKEN in .env (kept out of git)
|
|
21
|
+
# trustedSignersPem: # optional: pin snapshot signer PEMs the org publishes
|
|
22
|
+
# - |
|
|
23
|
+
# -----BEGIN PUBLIC KEY-----
|
|
24
|
+
# ...
|
|
25
|
+
# -----END PUBLIC KEY-----
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# config/orgmail.yaml — workspace email channel (Cohort-hosted mailbox).
|
|
2
|
+
#
|
|
3
|
+
# GATE FILE: the daemon starts the orgmail channel when THIS file exists
|
|
4
|
+
# (copy this example to config/orgmail.yaml). Delete/rename it to disable —
|
|
5
|
+
# that is the field kill switch, no code change needed.
|
|
6
|
+
#
|
|
7
|
+
# Credentials come from config/org.yaml (org.cohort.{base,orgId,token} — the
|
|
8
|
+
# org enrollment). An org admin must have verified a domain and assigned this
|
|
9
|
+
# agent a mailbox in Cohort → Settings → Email first.
|
|
10
|
+
#
|
|
11
|
+
# Inbound rides org RPC polling (no IMAP, no app passwords):
|
|
12
|
+
# email.inbox (unread) → email.message (bodies) → state/inbox/orgmail/ →
|
|
13
|
+
# classifier → session → reply via scripts/org/send-orgmail.mjs.
|
|
14
|
+
# mark_read advances the SERVER-side cursor after a clean handoff; there is no
|
|
15
|
+
# local cursor file. Poll override: MAESTRO_ORGMAIL_POLL_MS env var.
|
|
16
|
+
orgmail:
|
|
17
|
+
enabled: true
|
|
18
|
+
poll_seconds: 45
|
|
19
|
+
mark_read: true
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# config/recovery.yaml — Reboot/outage recovery + resource governance (WS4)
|
|
2
|
+
#
|
|
3
|
+
# Tunes how the agent DEGRADES GRACEFULLY under load and RECOVERS from a
|
|
4
|
+
# reboot/power-outage, instead of bricking. Every value below is the built-in
|
|
5
|
+
# default (read from the matching GOV_* / WATCHDOG_* / DAILY_* env var if set);
|
|
6
|
+
# this file documents them and lets the operator override per-agent. Delete it
|
|
7
|
+
# and the defaults apply.
|
|
8
|
+
#
|
|
9
|
+
# Cardinal rule: the ONLY thing that permanently stops this agent is a HUMAN
|
|
10
|
+
# writing .emergency-stop. The watchdog NEVER writes it — it throttles, trims,
|
|
11
|
+
# restarts the daemon, and (last resort) reboots the box, always ending in
|
|
12
|
+
# "the agent is running again."
|
|
13
|
+
|
|
14
|
+
# --- Resource governor (lib/resource-governor.mjs) ------------------------
|
|
15
|
+
# One admission gate before every Claude sub-session spawn. ADMIT / QUEUE
|
|
16
|
+
# (keep in the in-memory queue, re-derivable from state/queues) / DEFER (leave
|
|
17
|
+
# on disk; the sweep retries — never burns retry budget).
|
|
18
|
+
governor:
|
|
19
|
+
per_session_mb: 750 # GOV_PER_SESSION_MB — RAM budget heuristic per session
|
|
20
|
+
ram_fraction: 0.60 # GOV_RAM_FRACTION — share of total RAM for claude sessions
|
|
21
|
+
freemem_floor: 0.15 # GOV_FREEMEM_FLOOR — DEFER below this fraction of free RAM
|
|
22
|
+
load_factor: 1.5 # GOV_LOAD_FACTOR — DEFER when 1m loadavg > cpus * this
|
|
23
|
+
hard_max: 10 # GOV_HARD_MAX — absolute ceiling on concurrent sessions
|
|
24
|
+
# dynamicMax = clamp(floor(totalmem*ram_fraction / per_session_mb), 1, min(hard_max, cpus))
|
|
25
|
+
# effectiveMax = min(dynamicMax, throttle.ceiling) (throttle written by the watchdog)
|
|
26
|
+
|
|
27
|
+
# --- Memory watchdog (scripts/watchdog/memory-watchdog.sh) ----------------
|
|
28
|
+
# Self-healing tiers. SOFT throttles (writes state/throttle.json, no kills);
|
|
29
|
+
# HARD trims youngest/biggest subagents (spares the oldest "main"); CRITICAL
|
|
30
|
+
# restarts the daemon; repeated CRITICAL failures escalate to a graceful reboot.
|
|
31
|
+
watchdog:
|
|
32
|
+
sys_soft_percent: 70 # WATCHDOG_SYS_SOFT_PERCENT
|
|
33
|
+
sys_hard_percent: 80 # WATCHDOG_SYS_HARD_PERCENT
|
|
34
|
+
critical_percent: 90 # WATCHDOG_CRITICAL_PERCENT
|
|
35
|
+
claude_soft_percent: 60 # WATCHDOG_SOFT_PERCENT (claude RSS as % of RAM)
|
|
36
|
+
claude_hard_percent: 75 # WATCHDOG_HARD_PERCENT
|
|
37
|
+
min_age_seconds: 60 # WATCHDOG_MIN_AGE — never kill a session younger than this
|
|
38
|
+
throttle_ttl_seconds: 300 # WATCHDOG_THROTTLE_TTL — soft-throttle auto-expiry
|
|
39
|
+
critical_sustain_runs: 2 # WATCHDOG_CRITICAL_SUSTAIN — consecutive CRITICAL runs before restart
|
|
40
|
+
restart_fail_limit: 3 # WATCHDOG_RESTART_FAIL_LIMIT — restarts/window before graceful reboot
|
|
41
|
+
restart_fail_window_seconds: 900 # WATCHDOG_RESTART_FAIL_WINDOW
|
|
42
|
+
|
|
43
|
+
# --- Rate breaker (lib/rate-guard.mjs) ------------------------------------
|
|
44
|
+
# Shared cross-session 429 / overload circuit breaker with decorrelated-jitter
|
|
45
|
+
# backoff. One file (state/rate-limits/<provider>.json) so all spawn sources
|
|
46
|
+
# back off together.
|
|
47
|
+
rate:
|
|
48
|
+
provider: anthropic # MAESTRO_RATE_PROVIDER
|
|
49
|
+
base_backoff_ms: 1000 # RATE_BASE_BACKOFF_MS
|
|
50
|
+
max_backoff_ms: 900000 # RATE_MAX_BACKOFF_MS (15 min)
|
|
51
|
+
backoff_factor: 3 # RATE_BACKOFF_FACTOR
|
|
52
|
+
|
|
53
|
+
# --- Daily budget cap (lib/budget-guard.mjs) ------------------------------
|
|
54
|
+
# Sums today's cost ledger. One escalating notice at 50/75/90%; at 100% the
|
|
55
|
+
# governor goes essential-only (backlog + cadence deferred; inbox replies
|
|
56
|
+
# continue). Resets at UTC midnight.
|
|
57
|
+
budget:
|
|
58
|
+
daily_spend_cap_usd: 25 # DAILY_SPEND_CAP_USD
|
|
59
|
+
daily_iteration_cap: 0 # DAILY_ITERATION_CAP — 0 = no session-count cap
|
|
60
|
+
|
|
61
|
+
# --- In-flight resume (dispatcher) ----------------------------------------
|
|
62
|
+
# A marker under state/sessions/resume-pending/ lets a reboot resume mid-flight
|
|
63
|
+
# work via `claude --print --resume`. 3 strikes → the item is marked blocked.
|
|
64
|
+
resume:
|
|
65
|
+
freshness_ms: 21600000 # MAESTRO_RESUME_FRESHNESS_MS (6h) — older markers block instead of resume
|
|
66
|
+
|
|
67
|
+
# --- Power recovery -------------------------------------------------------
|
|
68
|
+
# Set on the Mac mini so it boots automatically after a power loss:
|
|
69
|
+
# sudo pmset -a autorestart 1
|
|
70
|
+
# Combined with auto-login + RunAtLoad daemon plists, the agent self-recovers
|
|
71
|
+
# from a full power outage with no human in the loop. `maestro doctor` checks it.
|
|
72
|
+
pmset_autorestart_required: true
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# config/secrets.yaml — secret lifecycle for this agent.
|
|
2
|
+
#
|
|
3
|
+
# Consumed by `maestro secrets <list|sync|rotate>` and lib/secrets/* at runtime.
|
|
4
|
+
# Reads fail OPEN (a provider that errors is skipped, the chain continues);
|
|
5
|
+
# the broker sync fails CLOSED per secret (a name the broker can't serve is not
|
|
6
|
+
# written locally). Values are NEVER logged — logs/audit/secrets.jsonl is
|
|
7
|
+
# names-only. The default below keeps every secret on this box; point `broker`
|
|
8
|
+
# at the org credential broker to pull org-managed secrets on top.
|
|
9
|
+
#
|
|
10
|
+
# provider — the LOCAL store the agent reads from / rotates into:
|
|
11
|
+
# file (default) AES-256-GCM-sealed store under state/secrets/.secrets.json,
|
|
12
|
+
# keyed by a 32-byte master key created on first use. Durable + writable.
|
|
13
|
+
# env process.env, READ-ONLY (rotate fails closed — the environment is ambient).
|
|
14
|
+
# keychain macOS Keychain via `security` (best-effort; inert off-darwin).
|
|
15
|
+
provider: file
|
|
16
|
+
|
|
17
|
+
# broker — OPTIONAL. Point this at the org credential broker to layer org-managed
|
|
18
|
+
# secrets above the local store. With a broker configured, read precedence is
|
|
19
|
+
# broker > file > env, and `maestro secrets sync` pulls org secrets into the
|
|
20
|
+
# local store. Omit the whole block to stay fully local (the default).
|
|
21
|
+
#
|
|
22
|
+
# broker:
|
|
23
|
+
# enabled: true # default-on whenever this block exists
|
|
24
|
+
# base_url: "https://cohort.internal/secrets" # the broker endpoint
|
|
25
|
+
# token_env: COHORT_API_TOKEN # name of the .env var holding the bearer token
|
|
26
|
+
# identity: "" # agent id the broker scopes secrets to
|
|
27
|
+
# # (defaults to MAESTRO_AGENT_ID, else the agent slug)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# config/slack.yaml — Slack channel configuration (optional)
|
|
2
|
+
#
|
|
3
|
+
# Present → the daemon's channel bus drives Slack ingestion through the unified
|
|
4
|
+
# adapter (lib/channels/slack/adapter.mjs), which wraps the real Socket Mode
|
|
5
|
+
# client and closes the reaction / thread-context / cc-channel gaps. The legacy
|
|
6
|
+
# launchd socket-mode plist continues to work independently; this file enables
|
|
7
|
+
# the bus-driven path + the opt-in features below.
|
|
8
|
+
#
|
|
9
|
+
# Slack app setup (api.slack.com/apps → your agent's app):
|
|
10
|
+
# Socket Mode: ON (App-Level Token xapp-… with connections:write).
|
|
11
|
+
# Event Subscriptions → Bot events:
|
|
12
|
+
# message.channels, message.groups, message.im, message.mpim, app_mention
|
|
13
|
+
# reaction_added, reaction_removed (for reactions, below)
|
|
14
|
+
# OAuth scopes (Bot Token Scopes):
|
|
15
|
+
# channels:history, groups:history, im:history, mpim:history,
|
|
16
|
+
# reactions:read, chat:write
|
|
17
|
+
# Reinstall the app after changing scopes/subscriptions.
|
|
18
|
+
|
|
19
|
+
# ── Ingest mode ──────────────────────────────────────────────────────────────
|
|
20
|
+
# "socket" — persistent WebSocket (recommended; realtime, no public endpoint).
|
|
21
|
+
# "relay" — Railway cloud-relay webhook fan-out.
|
|
22
|
+
# "poll" — 60s REST polling (fallback only).
|
|
23
|
+
ingest_mode: socket
|
|
24
|
+
|
|
25
|
+
# ── Reactions ────────────────────────────────────────────────────────────────
|
|
26
|
+
# Keep reaction_added / reaction_removed events. They arrive as kind:"reaction"
|
|
27
|
+
# (the target message text is resolved via conversations.history) and classify
|
|
28
|
+
# as FYI — the agent observes acknowledgements without replying to them.
|
|
29
|
+
reactions: true
|
|
30
|
+
|
|
31
|
+
# ── CC channels (observe-not-reply) ─────────────────────────────────────────
|
|
32
|
+
# Channel ids the agent should *watch*. Non-@mention messages in these channels
|
|
33
|
+
# arrive as kind:"channel_cc" and are archived (not replied to) by the
|
|
34
|
+
# directed-gate. The agent still replies to @mentions + thread replies.
|
|
35
|
+
cc_channels: [] # e.g. ["C0ABCDE12", "C0FGHIJ34"]
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# config/telegram.yaml — Telegram channel configuration (optional)
|
|
2
|
+
#
|
|
3
|
+
# When this file is present, the daemon registers a Telegram channel via grammY
|
|
4
|
+
# in long-polling mode (no public webhook — works behind NAT, runs inside the
|
|
5
|
+
# daemon). grammY is a dynamic import like baileys: the maestro package installs
|
|
6
|
+
# without it. Opt in with `npm i grammy` in your agent repo.
|
|
7
|
+
#
|
|
8
|
+
# Set up the bot:
|
|
9
|
+
# 1. Talk to @BotFather on Telegram → /newbot → choose a name + username.
|
|
10
|
+
# 2. Copy the HTTP API token it gives you (digits:ABC…).
|
|
11
|
+
# 3. Run: node scripts/setup/init-telegram.mjs (writes TELEGRAM_BOT_TOKEN to
|
|
12
|
+
# .env, validates via getMe, and activates this gate file)
|
|
13
|
+
# 4. In BotFather → /setprivacy → Disable, if you want the bot to read all
|
|
14
|
+
# group messages (otherwise it only sees @mentions + replies + commands).
|
|
15
|
+
|
|
16
|
+
# ── Token ────────────────────────────────────────────────────────────────────
|
|
17
|
+
# The token is read from the TELEGRAM_BOT_TOKEN env var (.env). This field is a
|
|
18
|
+
# reference reminder only — do NOT paste the token here (config is committable).
|
|
19
|
+
token_env: TELEGRAM_BOT_TOKEN
|
|
20
|
+
|
|
21
|
+
# ── DM pairing (default-deny) ───────────────────────────────────────────────
|
|
22
|
+
# Unknown DM senders are dropped (with a one-time pairing prompt) until paired.
|
|
23
|
+
# Seed allowlisted Telegram user ids here, or pair at runtime:
|
|
24
|
+
# • the human DMs the bot: pair <code>
|
|
25
|
+
# • the code comes from `maestro pair telegram` (or the prompt the bot sends).
|
|
26
|
+
# Paired ids are appended to config/allowlist.yaml under `telegram:`.
|
|
27
|
+
allowlist_seed: [] # e.g. ["987654321"]
|
|
28
|
+
|
|
29
|
+
# ── CC groups (observe-not-reply) ───────────────────────────────────────────
|
|
30
|
+
# Group chat ids the agent should *watch* — non-@mention messages in these
|
|
31
|
+
# groups arrive as kind:"channel_cc" and are archived (not replied to) by the
|
|
32
|
+
# directed-gate. The agent still replies when @mentioned or directly replied to.
|
|
33
|
+
cc_groups: [] # e.g. ["-1001234567890"]
|
|
34
|
+
|
|
35
|
+
# ── Voice notes ─────────────────────────────────────────────────────────────
|
|
36
|
+
# Inbound voice notes are downloaded and transcribed (the transcript becomes the
|
|
37
|
+
# message body + a voice_note attachment). Requires OPENAI_API_KEY for STT.
|
|
38
|
+
transcription: true
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# config/voice.yaml — Maestro voice channel configuration (optional)
|
|
2
|
+
#
|
|
3
|
+
# Activates the OpenAI Realtime voice channel for this agent. When this
|
|
4
|
+
# file is present and the operator has set OPENAI_API_KEY, the daemon
|
|
5
|
+
# will start a voice-handler worker that:
|
|
6
|
+
# - Accepts inbound Twilio SIP calls (native SIP connector)
|
|
7
|
+
# - OR accepts WebSocket connections from a browser widget
|
|
8
|
+
# - Bridges audio to OpenAI's gpt-realtime-2 model
|
|
9
|
+
# - Honors the same action-classification policy as Slack/Gmail
|
|
10
|
+
# - Logs the full transcript to logs/voice/sessions/
|
|
11
|
+
#
|
|
12
|
+
# Without this file, voice mode is OFF.
|
|
13
|
+
|
|
14
|
+
# ── Provider ───────────────────────────────────────────────────────────────
|
|
15
|
+
provider: openai-realtime # openai-realtime | gemini-live (planned)
|
|
16
|
+
model: gpt-realtime-2 # or gpt-realtime-translate, gpt-realtime-whisper
|
|
17
|
+
voice: cedar # cedar | marin | alloy | ash | ballad | coral | echo | sage | shimmer | verse
|
|
18
|
+
|
|
19
|
+
# ── Audio + VAD ────────────────────────────────────────────────────────────
|
|
20
|
+
input_audio_format: pcm16 # pcm16 | g711_ulaw (for Twilio bridge) | g711_alaw
|
|
21
|
+
output_audio_format: pcm16
|
|
22
|
+
input_audio_transcription:
|
|
23
|
+
model: gpt-realtime-whisper # streaming partial-transcript model
|
|
24
|
+
|
|
25
|
+
turn_detection:
|
|
26
|
+
type: server_vad # server_vad | semantic_vad | null (push-to-talk)
|
|
27
|
+
threshold: 0.5
|
|
28
|
+
prefix_padding_ms: 300
|
|
29
|
+
silence_duration_ms: 500
|
|
30
|
+
|
|
31
|
+
# ── Session rotation (mitigates long-call latency drift) ───────────────────
|
|
32
|
+
rotation:
|
|
33
|
+
max_turns: 12
|
|
34
|
+
max_duration_ms: 240000 # 4 minutes
|
|
35
|
+
max_p95_latency_ms: 2000
|
|
36
|
+
|
|
37
|
+
# ── Inbound channels ───────────────────────────────────────────────────────
|
|
38
|
+
inbound:
|
|
39
|
+
# Native SIP via Twilio Elastic SIP Trunking → OpenAI. Preferred.
|
|
40
|
+
twilio_sip:
|
|
41
|
+
enabled: false
|
|
42
|
+
elastic_sip_trunk: "" # Twilio trunk SID
|
|
43
|
+
openai_sip_uri: "sip:YOUR_PROJECT_ID@sip.api.openai.com;transport=tls"
|
|
44
|
+
inbound_webhook_path: /voice/sip/incoming # mounted by your HTTP server
|
|
45
|
+
caller_id_allowlist: [] # E.164 numbers permitted to reach this agent
|
|
46
|
+
|
|
47
|
+
# Legacy Twilio Media Streams bridge (TwiML <Connect><Stream>).
|
|
48
|
+
twilio_media_streams:
|
|
49
|
+
enabled: false
|
|
50
|
+
stream_path: /voice/stream
|
|
51
|
+
voice_webhook_path: /voice/incoming
|
|
52
|
+
twiml_status_callback_path: /voice/status
|
|
53
|
+
|
|
54
|
+
# Direct browser WebSocket (e.g. a control-panel widget).
|
|
55
|
+
browser_ws:
|
|
56
|
+
enabled: false
|
|
57
|
+
path: /voice/browser
|
|
58
|
+
ephemeral_token_path: /voice/token # mints client_secret for the browser
|
|
59
|
+
|
|
60
|
+
# ── Tool bridge ────────────────────────────────────────────────────────────
|
|
61
|
+
tools:
|
|
62
|
+
# Which maestro actions are exposed as voice tools.
|
|
63
|
+
access_level: voice # uses lib/tool-definitions.js access tier
|
|
64
|
+
include: [] # if non-empty, restrict to these names
|
|
65
|
+
exclude: # explicitly hide these from voice surfaces
|
|
66
|
+
- wire_transfer
|
|
67
|
+
- delete_repository
|
|
68
|
+
# Voice-specific guardrails:
|
|
69
|
+
high_risk_requires_verbal_confirm: true
|
|
70
|
+
audit_log_path: logs/voice/tool-calls.jsonl
|
|
71
|
+
|
|
72
|
+
# ── Audit + persistence ────────────────────────────────────────────────────
|
|
73
|
+
audit:
|
|
74
|
+
transcript_dir: logs/voice/sessions
|
|
75
|
+
audio_capture: false # set true to also save WAV files (large)
|
|
76
|
+
redact_pii_patterns:
|
|
77
|
+
- '\b\d{3}-\d{2}-\d{4}\b' # SSN
|
|
78
|
+
- '\b\d{16}\b' # 16-digit card
|
|
79
|
+
|
|
80
|
+
# ── Voice identity ─────────────────────────────────────────────────────────
|
|
81
|
+
identity:
|
|
82
|
+
# Override the agent's default identity for the voice surface (optional).
|
|
83
|
+
# name and role default to config/agent.json firstName + title.
|
|
84
|
+
custom_instructions: ""
|
|
85
|
+
voice_mode_appendix: |
|
|
86
|
+
Speak briefly and naturally — typically 1-2 sentences before
|
|
87
|
+
pausing for the user. When invoking high-risk actions, read back
|
|
88
|
+
the key parameters out loud and obtain explicit confirmation in
|
|
89
|
+
the SAME turn before proceeding.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# config/whatsapp.yaml — WhatsApp channel configuration (optional)
|
|
2
|
+
#
|
|
3
|
+
# When this file is present, the daemon registers a WhatsApp channel
|
|
4
|
+
# using the chosen transport.
|
|
5
|
+
|
|
6
|
+
# ── Transport ──────────────────────────────────────────────────────────────
|
|
7
|
+
# "twilio" — WhatsApp Business API via Twilio (production-grade, paid)
|
|
8
|
+
# "baileys" — Personal-account WhatsApp Web (free, full media support,
|
|
9
|
+
# violates WhatsApp ToS for business use — use only for
|
|
10
|
+
# sole-proprietor / personal-account agents)
|
|
11
|
+
transport: twilio
|
|
12
|
+
|
|
13
|
+
# ── Twilio (when transport: twilio) ────────────────────────────────────────
|
|
14
|
+
twilio:
|
|
15
|
+
# The sender phone in E.164 format (e.g. "+14155238886" for the sandbox).
|
|
16
|
+
from_number: ""
|
|
17
|
+
# Templated messages need pre-approved templates; the framework only
|
|
18
|
+
# supports free-form replies inside the 24-hour customer-service window.
|
|
19
|
+
|
|
20
|
+
# ── Baileys (when transport: baileys) ──────────────────────────────────────
|
|
21
|
+
baileys:
|
|
22
|
+
# Where Baileys persists auth state. Lose this and you re-scan the QR.
|
|
23
|
+
auth_dir: state/whatsapp/auth
|
|
24
|
+
# Voice note transcription. Wire to a Whisper helper or
|
|
25
|
+
# gpt-realtime-whisper-backed function. Stub provider name resolves
|
|
26
|
+
# at daemon startup.
|
|
27
|
+
transcribe_voice_notes_via: whisper-1 # or "gpt-realtime-whisper" | "none"
|
|
28
|
+
|
|
29
|
+
# ── Common ─────────────────────────────────────────────────────────────────
|
|
30
|
+
peer_allowlist: [] # E.164 phone numbers permitted to converse with the agent
|
|
31
|
+
group_chat_allowlist: [] # Baileys group JIDs the agent is allowed to listen in
|
|
32
|
+
|
|
33
|
+
# Where outbound voice notes are cached before being sent (for retry / audit).
|
|
34
|
+
outbound_audio_cache: state/whatsapp/outbound
|
|
35
|
+
|
|
36
|
+
# When inbound voice notes arrive, also save the original audio file
|
|
37
|
+
# alongside the transcript so transcription errors can be diagnosed later.
|
|
38
|
+
keep_audio_files: true
|
|
39
|
+
audio_dir: state/whatsapp/audio
|