@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.
Files changed (731) hide show
  1. package/.claude/commands/init-agent.md +104 -0
  2. package/.claude/commands/init-maestro.md +1187 -0
  3. package/.claude/settings.json +161 -0
  4. package/.env.example +216 -0
  5. package/README.md +632 -0
  6. package/agents/browser-operator/agent.md +52 -0
  7. package/agents/calendar-ops/agent.md +50 -0
  8. package/agents/communications/agent.md +96 -0
  9. package/agents/decision-log/agent.md +65 -0
  10. package/agents/desktop-operator/agent.md +59 -0
  11. package/agents/gmail-operator/agent.md +62 -0
  12. package/agents/inbound-dispatcher/agent.md +66 -0
  13. package/agents/inbox-processor/agent.md +39 -0
  14. package/agents/pmo-execution/agent.md +60 -0
  15. package/agents/session-spawner/agent.md +64 -0
  16. package/agents/slack-operator/agent.md +60 -0
  17. package/agents/whatsapp-operator/agent.md +60 -0
  18. package/agents/workflow-automation/agent.md +61 -0
  19. package/archetypes/altitudes/c-suite.yaml +58 -0
  20. package/archetypes/altitudes/founder.yaml +68 -0
  21. package/archetypes/altitudes/senior-manager.yaml +63 -0
  22. package/archetypes/altitudes/svp.yaml +60 -0
  23. package/archetypes/altitudes/vp.yaml +50 -0
  24. package/archetypes/archetype.schema.json +77 -0
  25. package/archetypes/base.yaml +47 -0
  26. package/archetypes/capabilities/commercial-leader.yaml +159 -0
  27. package/archetypes/capabilities/compliance-officer.yaml +159 -0
  28. package/archetypes/capabilities/executive-operator.yaml +169 -0
  29. package/archetypes/capabilities/finance-leader.yaml +162 -0
  30. package/archetypes/capabilities/operations-leader.yaml +154 -0
  31. package/archetypes/capabilities/product-leader.yaml +148 -0
  32. package/archetypes/capabilities/technical-leader.yaml +146 -0
  33. package/archetypes/functions/commercial-leader.yaml +62 -0
  34. package/archetypes/functions/compliance-officer.yaml +64 -0
  35. package/archetypes/functions/executive-operator.yaml +70 -0
  36. package/archetypes/functions/finance-leader.yaml +70 -0
  37. package/archetypes/functions/operations-leader.yaml +62 -0
  38. package/archetypes/functions/product-leader.yaml +61 -0
  39. package/archetypes/functions/technical-leader.yaml +57 -0
  40. package/bin/cohort-mcp.mjs +81 -0
  41. package/bin/maestro.mjs +3516 -0
  42. package/bin/maestro.test.mjs +1015 -0
  43. package/desktop-control/README.md +56 -0
  44. package/desktop-control/app-profiles/gmail.yaml +120 -0
  45. package/desktop-control/app-profiles/slack.yaml +315 -0
  46. package/desktop-control/app-profiles/whatsapp.yaml +107 -0
  47. package/docs/architecture/agent-topology.md +2239 -0
  48. package/docs/architecture/archetype-agent-factory.md +110 -0
  49. package/docs/architecture/collective-memory-and-org-mesh.md +115 -0
  50. package/docs/architecture/continuous-monitoring.md +221 -0
  51. package/docs/architecture/mcp-capability-map.md +585 -0
  52. package/docs/architecture/system-architecture.md +1272 -0
  53. package/docs/company-context/README.md +40 -0
  54. package/docs/guides/agent-persona-setup.md +600 -0
  55. package/docs/guides/agents-observe-setup.md +64 -0
  56. package/docs/guides/billing-console-keys.md +88 -0
  57. package/docs/guides/ccxray-diagnostics.md +65 -0
  58. package/docs/guides/channel-bus.md +127 -0
  59. package/docs/guides/claude-mem-setup.md +79 -0
  60. package/docs/guides/claude-pace-setup.md +56 -0
  61. package/docs/guides/claudraband-sessions.md +98 -0
  62. package/docs/guides/clawteam-swarm.md +116 -0
  63. package/docs/guides/code-review-graph-setup.md +86 -0
  64. package/docs/guides/email-setup.md +431 -0
  65. package/docs/guides/mac-mini.md +119 -0
  66. package/docs/guides/media-generation-setup.md +349 -0
  67. package/docs/guides/model-routing.md +162 -0
  68. package/docs/guides/observability-otel.md +265 -0
  69. package/docs/guides/org-onboarding.md +132 -0
  70. package/docs/guides/outbound-governance-setup.md +437 -0
  71. package/docs/guides/pdf-generation-setup.md +315 -0
  72. package/docs/guides/poller-daemon-setup.md +563 -0
  73. package/docs/guides/rag-context-setup.md +459 -0
  74. package/docs/guides/self-optimization-pattern.md +82 -0
  75. package/docs/guides/setup-wizard.md +178 -0
  76. package/docs/guides/slack-setup.md +350 -0
  77. package/docs/guides/telegram-setup.md +227 -0
  78. package/docs/guides/twilio-subaccounts-setup.md +223 -0
  79. package/docs/guides/verification.md +128 -0
  80. package/docs/guides/voice-mode.md +188 -0
  81. package/docs/guides/voice-sms-setup.md +698 -0
  82. package/docs/guides/webhook-relay-setup.md +349 -0
  83. package/docs/guides/whatsapp-setup.md +288 -0
  84. package/docs/prompts/board-pack-cover-template.md +36 -0
  85. package/docs/prompts/decision-recommendation-template.md +88 -0
  86. package/docs/prompts/followup-message-template.md +141 -0
  87. package/docs/prompts/investor-letter-template.md +52 -0
  88. package/docs/prompts/morning-brief-template.md +82 -0
  89. package/docs/prompts/presentation-template.md +58 -0
  90. package/docs/prompts/weekly-strategic-memo-template.md +104 -0
  91. package/docs/research/hallucinated-tool-output-investigation.md +151 -0
  92. package/docs/runbooks/backup-restore.md +205 -0
  93. package/docs/runbooks/cohort-cutover.md +129 -0
  94. package/docs/runbooks/fleet-operations.md +200 -0
  95. package/docs/runbooks/incident-response.md +226 -0
  96. package/docs/runbooks/mac-mini-bootstrap.md +431 -0
  97. package/docs/runbooks/perpetual-operations.md +509 -0
  98. package/docs/runbooks/recovery-and-failover.md +260 -0
  99. package/framework-features.json +267 -0
  100. package/ingest/README.md +87 -0
  101. package/lib/action-executor.js +689 -0
  102. package/lib/action-executor.test.mjs +871 -0
  103. package/lib/agent-root.mjs +37 -0
  104. package/lib/archetype.mjs +236 -0
  105. package/lib/archetype.test.mjs +132 -0
  106. package/lib/autonomy.mjs +114 -0
  107. package/lib/autonomy.test.mjs +66 -0
  108. package/lib/backlog.mjs +358 -0
  109. package/lib/backlog.test.mjs +266 -0
  110. package/lib/budget-guard.mjs +279 -0
  111. package/lib/budget-guard.test.mjs +291 -0
  112. package/lib/cadence-bus-schedule.test.mjs +194 -0
  113. package/lib/cadence-bus.mjs +1120 -0
  114. package/lib/cadence-bus.test.mjs +720 -0
  115. package/lib/cadences.mjs +205 -0
  116. package/lib/cadences.test.mjs +125 -0
  117. package/lib/capability.mjs +154 -0
  118. package/lib/capability.test.mjs +78 -0
  119. package/lib/channels/base-adapter.mjs +719 -0
  120. package/lib/channels/base-adapter.test.mjs +590 -0
  121. package/lib/channels/channel.mjs +128 -0
  122. package/lib/channels/channels.test.mjs +371 -0
  123. package/lib/channels/contract.mjs +215 -0
  124. package/lib/channels/contract.test.mjs +137 -0
  125. package/lib/channels/conversation-resolver.mjs +95 -0
  126. package/lib/channels/gmail/adapter.mjs +87 -0
  127. package/lib/channels/inbox-item.mjs +255 -0
  128. package/lib/channels/inbox-item.test.mjs +335 -0
  129. package/lib/channels/index.mjs +94 -0
  130. package/lib/channels/orgmail/adapter.mjs +353 -0
  131. package/lib/channels/orgmail/adapter.test.mjs +311 -0
  132. package/lib/channels/pairing.mjs +363 -0
  133. package/lib/channels/pairing.test.mjs +270 -0
  134. package/lib/channels/registry.mjs +164 -0
  135. package/lib/channels/slack/adapter.mjs +317 -0
  136. package/lib/channels/slack-adapter.test.mjs +212 -0
  137. package/lib/channels/sms/adapter.mjs +43 -0
  138. package/lib/channels/telegram/adapter.mjs +432 -0
  139. package/lib/channels/telegram-adapter.test.mjs +306 -0
  140. package/lib/channels/voice/adapter.mjs +301 -0
  141. package/lib/channels/voice/adapter.test.mjs +278 -0
  142. package/lib/channels/whatsapp/adapter-baileys.mjs +587 -0
  143. package/lib/channels/whatsapp/adapter-baileys.test.mjs +359 -0
  144. package/lib/channels/whatsapp/adapter-twilio.mjs +65 -0
  145. package/lib/channels/whatsapp/baileys-typing.test.mjs +154 -0
  146. package/lib/charter.mjs +256 -0
  147. package/lib/charter.test.mjs +89 -0
  148. package/lib/claude-bin.mjs +134 -0
  149. package/lib/claude-bin.test.mjs +75 -0
  150. package/lib/collective/capture.mjs +185 -0
  151. package/lib/collective/capture.test.mjs +121 -0
  152. package/lib/collective/cards.mjs +201 -0
  153. package/lib/collective/cards.test.mjs +114 -0
  154. package/lib/collective/config.mjs +186 -0
  155. package/lib/collective/config.test.mjs +123 -0
  156. package/lib/collective/global-config.mjs +113 -0
  157. package/lib/collective/global-config.test.mjs +75 -0
  158. package/lib/collective/presence.mjs +201 -0
  159. package/lib/collective/presence.test.mjs +95 -0
  160. package/lib/collective/recall.mjs +215 -0
  161. package/lib/collective/recall.test.mjs +116 -0
  162. package/lib/comms/send-gate.mjs +554 -0
  163. package/lib/comms/send-gate.test.mjs +577 -0
  164. package/lib/comms.mjs +67 -0
  165. package/lib/comms.test.mjs +41 -0
  166. package/lib/diagnostics/alerts.mjs +424 -0
  167. package/lib/diagnostics/alerts.test.mjs +318 -0
  168. package/lib/diagnostics/backup-freshness.mjs +188 -0
  169. package/lib/diagnostics/backup-freshness.test.mjs +185 -0
  170. package/lib/diagnostics/counters.mjs +269 -0
  171. package/lib/diagnostics/counters.test.mjs +206 -0
  172. package/lib/diagnostics/events.mjs +188 -0
  173. package/lib/diagnostics/events.test.mjs +290 -0
  174. package/lib/diagnostics/otel.mjs +237 -0
  175. package/lib/diagnostics/otel.test.mjs +196 -0
  176. package/lib/diagnostics/trace.mjs +216 -0
  177. package/lib/diagnostics/trace.test.mjs +251 -0
  178. package/lib/env-compat.mjs +74 -0
  179. package/lib/env-compat.test.mjs +104 -0
  180. package/lib/feature-init.mjs +331 -0
  181. package/lib/fs-atomic.mjs +112 -0
  182. package/lib/fs-atomic.test.mjs +72 -0
  183. package/lib/fs-ownership.mjs +111 -0
  184. package/lib/fs-ownership.test.mjs +158 -0
  185. package/lib/hooks/bus.mjs +347 -0
  186. package/lib/hooks/bus.test.mjs +387 -0
  187. package/lib/index.js +16 -0
  188. package/lib/learning/config.mjs +106 -0
  189. package/lib/learning/config.test.mjs +75 -0
  190. package/lib/learning/counters.mjs +156 -0
  191. package/lib/learning/counters.test.mjs +69 -0
  192. package/lib/learning/curator-consolidate.test.mjs +238 -0
  193. package/lib/learning/curator.mjs +453 -0
  194. package/lib/learning/curator.test.mjs +106 -0
  195. package/lib/learning/log.mjs +40 -0
  196. package/lib/learning/reflect.mjs +534 -0
  197. package/lib/learning/reflect.test.mjs +0 -0
  198. package/lib/learning/session-index.mjs +352 -0
  199. package/lib/learning/session-index.test.mjs +125 -0
  200. package/lib/learning/skill-writer.mjs +474 -0
  201. package/lib/learning/skill-writer.test.mjs +210 -0
  202. package/lib/mcp/server.mjs +328 -0
  203. package/lib/mcp/server.test.mjs +400 -0
  204. package/lib/model-router/auth-profiles.mjs +758 -0
  205. package/lib/model-router/auth-profiles.test.mjs +580 -0
  206. package/lib/model-router/catalog/anthropic.yaml +153 -0
  207. package/lib/model-router/catalog/deepseek.yaml +86 -0
  208. package/lib/model-router/catalog/moonshot.yaml +81 -0
  209. package/lib/model-router/catalog/qwen.yaml +114 -0
  210. package/lib/model-router/catalog.mjs +925 -0
  211. package/lib/model-router/catalog.test.mjs +385 -0
  212. package/lib/model-router/economics.mjs +564 -0
  213. package/lib/model-router/economics.test.mjs +344 -0
  214. package/lib/model-router/failover.mjs +298 -0
  215. package/lib/model-router/failover.test.mjs +439 -0
  216. package/lib/model-router/health.mjs +453 -0
  217. package/lib/model-router/health.test.mjs +338 -0
  218. package/lib/model-router/integration-coverage.test.mjs +829 -0
  219. package/lib/model-router/integration.test.mjs +564 -0
  220. package/lib/model-router/ledger.mjs +402 -0
  221. package/lib/model-router/ledger.test.mjs +382 -0
  222. package/lib/model-router/llm-task.mjs +515 -0
  223. package/lib/model-router/llm-task.test.mjs +392 -0
  224. package/lib/model-router/org-credentials.mjs +260 -0
  225. package/lib/model-router/org-credentials.test.mjs +265 -0
  226. package/lib/model-router/pricing-refresh.mjs +463 -0
  227. package/lib/model-router/pricing-refresh.test.mjs +286 -0
  228. package/lib/model-router/reconcile.mjs +429 -0
  229. package/lib/model-router/reconcile.test.mjs +316 -0
  230. package/lib/model-router/repair.mjs +471 -0
  231. package/lib/model-router/repair.test.mjs +180 -0
  232. package/lib/model-router/resolve.mjs +1206 -0
  233. package/lib/model-router/spawn.mjs +497 -0
  234. package/lib/model-router/spawn.test.mjs +425 -0
  235. package/lib/model-router/taxonomy.mjs +893 -0
  236. package/lib/model-router/taxonomy.test.mjs +410 -0
  237. package/lib/model-router.mjs +677 -0
  238. package/lib/model-router.test.mjs +907 -0
  239. package/lib/org/activity.mjs +211 -0
  240. package/lib/org/activity.test.mjs +134 -0
  241. package/lib/org/approvals.mjs +448 -0
  242. package/lib/org/approvals.test.mjs +216 -0
  243. package/lib/org/awareness.mjs +222 -0
  244. package/lib/org/awareness.test.mjs +159 -0
  245. package/lib/org/board.mjs +229 -0
  246. package/lib/org/board.test.mjs +177 -0
  247. package/lib/org/bootstrap-context.mjs +169 -0
  248. package/lib/org/bootstrap-context.test.mjs +153 -0
  249. package/lib/org/client.mjs +1628 -0
  250. package/lib/org/client.test.mjs +1107 -0
  251. package/lib/org/cohort-client.mjs +67 -0
  252. package/lib/org/cohort-client.test.mjs +126 -0
  253. package/lib/org/cost-sync.mjs +227 -0
  254. package/lib/org/cost-sync.test.mjs +153 -0
  255. package/lib/org/doctor.mjs +212 -0
  256. package/lib/org/doctor.test.mjs +212 -0
  257. package/lib/org/handoff.mjs +293 -0
  258. package/lib/org/handoff.test.mjs +269 -0
  259. package/lib/org/integration-tools.mjs +182 -0
  260. package/lib/org/integration-tools.test.mjs +160 -0
  261. package/lib/org/keys.mjs +131 -0
  262. package/lib/org/keys.test.mjs +92 -0
  263. package/lib/org/knowledge.mjs +463 -0
  264. package/lib/org/knowledge.test.mjs +319 -0
  265. package/lib/org/leases.mjs +335 -0
  266. package/lib/org/leases.test.mjs +235 -0
  267. package/lib/org/mesh-integration.test.mjs +127 -0
  268. package/lib/org/mesh.mjs +459 -0
  269. package/lib/org/mesh.test.mjs +345 -0
  270. package/lib/org/messaging.mjs +503 -0
  271. package/lib/org/messaging.test.mjs +238 -0
  272. package/lib/org/policy.mjs +345 -0
  273. package/lib/org/policy.test.mjs +237 -0
  274. package/lib/org/protocol.checksum +1 -0
  275. package/lib/org/protocol.checksum.test.mjs +90 -0
  276. package/lib/org/protocol.mjs +967 -0
  277. package/lib/org/protocol.test.mjs +264 -0
  278. package/lib/org/registry.mjs +194 -0
  279. package/lib/org/registry.test.mjs +100 -0
  280. package/lib/org/tool-surface-integration.test.mjs +120 -0
  281. package/lib/org/tool-surface.mjs +2535 -0
  282. package/lib/org/tool-surface.test.mjs +589 -0
  283. package/lib/org/ui-parity.mjs +3236 -0
  284. package/lib/org/ui-parity.test.mjs +348 -0
  285. package/lib/org/verify.mjs +176 -0
  286. package/lib/org/verify.test.mjs +194 -0
  287. package/lib/rag/embed.mjs +188 -0
  288. package/lib/rag/indexer.mjs +425 -0
  289. package/lib/rag/rag.test.mjs +505 -0
  290. package/lib/rag/search.mjs +475 -0
  291. package/lib/rate-guard.mjs +246 -0
  292. package/lib/rate-guard.test.mjs +201 -0
  293. package/lib/render.mjs +112 -0
  294. package/lib/render.test.mjs +68 -0
  295. package/lib/resource-governor.mjs +297 -0
  296. package/lib/resource-governor.test.mjs +262 -0
  297. package/lib/scheduling/dynamic-jobs.mjs +675 -0
  298. package/lib/scheduling/dynamic-jobs.test.mjs +344 -0
  299. package/lib/scheduling/jitter.mjs +0 -0
  300. package/lib/scheduling/jitter.test.mjs +140 -0
  301. package/lib/secrets/broker.mjs +315 -0
  302. package/lib/secrets/broker.test.mjs +280 -0
  303. package/lib/secrets/providers.mjs +461 -0
  304. package/lib/secrets/providers.test.mjs +274 -0
  305. package/lib/security/audit-engine.mjs +684 -0
  306. package/lib/security/audit-engine.test.mjs +389 -0
  307. package/lib/security/coerce-args.mjs +552 -0
  308. package/lib/security/coerce-args.test.mjs +281 -0
  309. package/lib/security/dangerous-tools.mjs +97 -0
  310. package/lib/security/dangerous-tools.test.mjs +68 -0
  311. package/lib/security/external-content.mjs +145 -0
  312. package/lib/security/external-content.test.mjs +67 -0
  313. package/lib/security/redact.mjs +592 -0
  314. package/lib/security/redact.test.mjs +441 -0
  315. package/lib/security/secret-equal.mjs +73 -0
  316. package/lib/security/secret-equal.test.mjs +55 -0
  317. package/lib/session-permissions.mjs +101 -0
  318. package/lib/session-permissions.test.mjs +100 -0
  319. package/lib/setup/claude-probe.mjs +74 -0
  320. package/lib/setup/completeness.mjs +175 -0
  321. package/lib/setup/completeness.test.mjs +110 -0
  322. package/lib/setup/context-pack.mjs +173 -0
  323. package/lib/setup/context-pack.test.mjs +89 -0
  324. package/lib/setup/enrich.mjs +277 -0
  325. package/lib/setup/enrich.test.mjs +115 -0
  326. package/lib/setup/enroll-from-cohort.mjs +441 -0
  327. package/lib/setup/enroll-from-cohort.test.mjs +233 -0
  328. package/lib/setup/integration.test.mjs +162 -0
  329. package/lib/setup/io.mjs +360 -0
  330. package/lib/setup/io.test.mjs +77 -0
  331. package/lib/setup/run-generator.mjs +81 -0
  332. package/lib/setup/runner.mjs +244 -0
  333. package/lib/setup/runner.test.mjs +132 -0
  334. package/lib/setup/sections/comms.mjs +173 -0
  335. package/lib/setup/sections/company.mjs +120 -0
  336. package/lib/setup/sections/enrich.mjs +138 -0
  337. package/lib/setup/sections/identity.mjs +182 -0
  338. package/lib/setup/sections/identity.test.mjs +140 -0
  339. package/lib/setup/sections/learning.mjs +153 -0
  340. package/lib/setup/sections/learning.test.mjs +81 -0
  341. package/lib/setup/sections/messaging.mjs +219 -0
  342. package/lib/setup/sections/messaging.test.mjs +127 -0
  343. package/lib/setup/sections/model.mjs +102 -0
  344. package/lib/setup/sections/operating-model.mjs +78 -0
  345. package/lib/setup/sections/org.mjs +475 -0
  346. package/lib/setup/sections/org.test.mjs +313 -0
  347. package/lib/setup/sections/orgmail.mjs +173 -0
  348. package/lib/setup/sections/orgmail.test.mjs +118 -0
  349. package/lib/setup/sections/recovery.mjs +159 -0
  350. package/lib/setup/sections/recovery.test.mjs +98 -0
  351. package/lib/setup/sections/tools.mjs +132 -0
  352. package/lib/setup/sections/verify.mjs +97 -0
  353. package/lib/setup/sot.mjs +205 -0
  354. package/lib/setup/sot.test.mjs +81 -0
  355. package/lib/setup/state.mjs +151 -0
  356. package/lib/setup/state.test.mjs +92 -0
  357. package/lib/singleton.js +229 -0
  358. package/lib/singleton.test.mjs +135 -0
  359. package/lib/telemetry/alerts.mjs +216 -0
  360. package/lib/telemetry/alerts.test.mjs +109 -0
  361. package/lib/telemetry/collect.mjs +512 -0
  362. package/lib/telemetry/collect.test.mjs +202 -0
  363. package/lib/tool-definitions-integration.test.mjs +83 -0
  364. package/lib/tool-definitions.js +738 -0
  365. package/lib/tool-definitions.test.mjs +437 -0
  366. package/lib/util/fetch-timeout.mjs +136 -0
  367. package/lib/util/fetch-timeout.test.mjs +202 -0
  368. package/lib/util/reconnect.mjs +343 -0
  369. package/lib/util/reconnect.test.mjs +369 -0
  370. package/lib/util/unhandled.mjs +205 -0
  371. package/lib/util/unhandled.test.mjs +216 -0
  372. package/lib/voice/context-loader.mjs +466 -0
  373. package/lib/voice/index.mjs +100 -0
  374. package/lib/voice/openai-realtime.mjs +510 -0
  375. package/lib/voice/outbound.mjs +542 -0
  376. package/lib/voice/outbound.test.mjs +69 -0
  377. package/lib/voice/post-call-brief.mjs +428 -0
  378. package/lib/voice/provider.mjs +52 -0
  379. package/lib/voice/session-rotation.mjs +257 -0
  380. package/lib/voice/stt.mjs +161 -0
  381. package/lib/voice/stt.test.mjs +226 -0
  382. package/lib/voice/tool-bridge.mjs +370 -0
  383. package/lib/voice/tts.mjs +104 -0
  384. package/lib/voice/twilio-sip-bridge.mjs +288 -0
  385. package/lib/voice/voice.test.mjs +990 -0
  386. package/mcp/README.md +80 -0
  387. package/package.json +151 -0
  388. package/plugins/maestro-skills/plugin.json +139 -0
  389. package/plugins/maestro-skills/skills/agents-observe.md +110 -0
  390. package/plugins/maestro-skills/skills/board-deck.md +68 -0
  391. package/plugins/maestro-skills/skills/books-close.md +77 -0
  392. package/plugins/maestro-skills/skills/brand-steward.md +121 -0
  393. package/plugins/maestro-skills/skills/calendar-plan.md +57 -0
  394. package/plugins/maestro-skills/skills/call-working-sessions.md +124 -0
  395. package/plugins/maestro-skills/skills/ccxray-diagnostics.md +91 -0
  396. package/plugins/maestro-skills/skills/claude-pace.md +61 -0
  397. package/plugins/maestro-skills/skills/code-review-graph.md +99 -0
  398. package/plugins/maestro-skills/skills/crm-pipeline.md +65 -0
  399. package/plugins/maestro-skills/skills/decision-brief.md +89 -0
  400. package/plugins/maestro-skills/skills/directory-hygiene.md +125 -0
  401. package/plugins/maestro-skills/skills/draft-comms.md +84 -0
  402. package/plugins/maestro-skills/skills/evening-wrap.md +53 -0
  403. package/plugins/maestro-skills/skills/files-find.md +65 -0
  404. package/plugins/maestro-skills/skills/generative-ui.md +228 -0
  405. package/plugins/maestro-skills/skills/hiring-triage.md +74 -0
  406. package/plugins/maestro-skills/skills/inbox-triage.md +61 -0
  407. package/plugins/maestro-skills/skills/mail-triage.md +86 -0
  408. package/plugins/maestro-skills/skills/morning-brief.md +54 -0
  409. package/plugins/maestro-skills/skills/native-artifacts.md +157 -0
  410. package/plugins/maestro-skills/skills/org-board.md +133 -0
  411. package/plugins/maestro-skills/skills/org-credential.md +68 -0
  412. package/plugins/maestro-skills/skills/org-recall.md +81 -0
  413. package/plugins/maestro-skills/skills/pipeline-review.md +76 -0
  414. package/plugins/maestro-skills/skills/regulatory-status.md +81 -0
  415. package/plugins/maestro-skills/skills/router-why.md +78 -0
  416. package/plugins/maestro-skills/skills/schedule-meeting.md +91 -0
  417. package/plugins/maestro-skills/skills/session-search.md +71 -0
  418. package/plugins/maestro-skills/skills/set-reminder.md +93 -0
  419. package/plugins/maestro-skills/skills/slack-followup.md +64 -0
  420. package/plugins/maestro-skills/skills/team-activity.md +86 -0
  421. package/plugins/maestro-skills/skills/weekly-memo.md +70 -0
  422. package/policies/action-classification.yaml +114 -0
  423. package/policies/ai-disclosure.yaml +294 -0
  424. package/policies/communication-style.md +139 -0
  425. package/policies/information-barriers.yaml +118 -0
  426. package/policies/prompt-injection-defence.yaml +138 -0
  427. package/public/assets/icon-dark.png +0 -0
  428. package/public/assets/icon-dark.svg +9 -0
  429. package/public/assets/icon-light.svg +9 -0
  430. package/public/assets/logo-dark.svg +15 -0
  431. package/public/assets/logo-light.svg +15 -0
  432. package/scaffold/.mcp.json +7 -0
  433. package/scaffold/CLAUDE.md +368 -0
  434. package/scaffold/config/agent.json +55 -0
  435. package/scaffold/config/agent.ts +76 -0
  436. package/scaffold/config/agent.ts.example +89 -0
  437. package/scaffold/config/alerts.yaml +23 -0
  438. package/scaffold/config/allowlist.yaml.example +25 -0
  439. package/scaffold/config/caller-id-map.yaml +46 -0
  440. package/scaffold/config/collective.yaml +49 -0
  441. package/scaffold/config/company.json +20 -0
  442. package/scaffold/config/known-agents.json +6 -0
  443. package/scaffold/config/learning.yaml +55 -0
  444. package/scaffold/config/model-routing.yaml.example +104 -0
  445. package/scaffold/config/org.yaml +25 -0
  446. package/scaffold/config/orgmail.yaml.example +19 -0
  447. package/scaffold/config/recovery.yaml +72 -0
  448. package/scaffold/config/secrets.yaml +27 -0
  449. package/scaffold/config/slack.yaml.example +35 -0
  450. package/scaffold/config/telegram.yaml.example +38 -0
  451. package/scaffold/config/voice.yaml.example +89 -0
  452. package/scaffold/config/whatsapp.yaml.example +39 -0
  453. package/schedules/README.md +49 -0
  454. package/schedules/triggers/backlog-executor.md +102 -0
  455. package/schedules/triggers/brand-steward.md +72 -0
  456. package/schedules/triggers/daily-evening-wrap.md +159 -0
  457. package/schedules/triggers/daily-midday-sweep.md +58 -0
  458. package/schedules/triggers/daily-morning-brief.md +55 -0
  459. package/schedules/triggers/directory-hygiene.md +81 -0
  460. package/schedules/triggers/dynamic-jobs.md +40 -0
  461. package/schedules/triggers/inbox-processor.md +115 -0
  462. package/schedules/triggers/meeting-action-capture.md +60 -0
  463. package/schedules/triggers/meeting-prep.md +69 -0
  464. package/schedules/triggers/messaging-inbound.md +50 -0
  465. package/schedules/triggers/org-pulse.md +24 -0
  466. package/schedules/triggers/quarterly-self-assessment.md +54 -0
  467. package/schedules/triggers/weekly-engineering-health.md +37 -0
  468. package/schedules/triggers/weekly-execution.md +65 -0
  469. package/schedules/triggers/weekly-hiring.md +53 -0
  470. package/schedules/triggers/weekly-priorities.md +38 -0
  471. package/schedules/triggers/weekly-strategic-memo.md +124 -0
  472. package/scripts/archive-email.sh +55 -0
  473. package/scripts/cadence/cadence-status.mjs +36 -0
  474. package/scripts/cadence/enqueue-cadence-tick.mjs +174 -0
  475. package/scripts/cadence/enqueue-cadence-tick.test.mjs +187 -0
  476. package/scripts/cadence/launchd-cadence-wrapper.sh +85 -0
  477. package/scripts/cadence/launchd-cloud-relay-wrapper.sh +95 -0
  478. package/scripts/cadence/launchd-socket-mode-wrapper.sh +95 -0
  479. package/scripts/ci/check-docs-accuracy.mjs +493 -0
  480. package/scripts/ci/check-docs-accuracy.test.mjs +409 -0
  481. package/scripts/ci/check-exports-exist.mjs +140 -0
  482. package/scripts/ci/check-files-exist.mjs +107 -0
  483. package/scripts/ci/check-no-build-artifacts.mjs +111 -0
  484. package/scripts/ci/check-no-build-artifacts.test.mjs +71 -0
  485. package/scripts/ci/check-no-confidential.mjs +198 -0
  486. package/scripts/ci/check-no-conflict-markers.mjs +169 -0
  487. package/scripts/ci/check-no-residual-identity.mjs +163 -0
  488. package/scripts/ci/check-no-residual-identity.test.mjs +89 -0
  489. package/scripts/ci/check-tarball-fidelity.mjs +205 -0
  490. package/scripts/ci/check-unresolved-tokens.mjs +83 -0
  491. package/scripts/ci/check.mjs +109 -0
  492. package/scripts/ci/check.test.mjs +194 -0
  493. package/scripts/ci/run-coverage.mjs +82 -0
  494. package/scripts/ci/run-tests.mjs +71 -0
  495. package/scripts/cloud-relay/README.md +59 -0
  496. package/scripts/cloud-relay/index.mjs +233 -0
  497. package/scripts/cloud-relay/package.json +15 -0
  498. package/scripts/cloud-relay/railway.json +13 -0
  499. package/scripts/cloud-relay/voice/README.md +94 -0
  500. package/scripts/cloud-relay/voice/package-lock.json +39 -0
  501. package/scripts/cloud-relay/voice/package.json +16 -0
  502. package/scripts/cloud-relay/voice/railway.json +13 -0
  503. package/scripts/cloud-relay/voice/server.mjs +532 -0
  504. package/scripts/collective/hook-runner.mjs +211 -0
  505. package/scripts/collective/hook-runner.test.mjs +90 -0
  506. package/scripts/collective/org-pulse.mjs +72 -0
  507. package/scripts/collective/org-sync.mjs +61 -0
  508. package/scripts/collective/recall.mjs +45 -0
  509. package/scripts/collective/who.mjs +30 -0
  510. package/scripts/comms-monitor.sh +288 -0
  511. package/scripts/configure-whatsapp-sandbox.sh +201 -0
  512. package/scripts/continuous-monitor.sh +91 -0
  513. package/scripts/cost/fleet-digest.mjs +407 -0
  514. package/scripts/cost/fleet-digest.test.mjs +207 -0
  515. package/scripts/cost/track-claude-usage.mjs +169 -0
  516. package/scripts/daemon/agent-daemon.mjs +989 -0
  517. package/scripts/daemon/agent-daemon.test.mjs +525 -0
  518. package/scripts/daemon/cadence-consumer-governance.test.mjs +220 -0
  519. package/scripts/daemon/cadence-consumer.mjs +1080 -0
  520. package/scripts/daemon/cadence-consumer.test.mjs +770 -0
  521. package/scripts/daemon/cadence-handlers.mjs +1121 -0
  522. package/scripts/daemon/cadence-handlers.test.mjs +617 -0
  523. package/scripts/daemon/classifier.mjs +704 -0
  524. package/scripts/daemon/classifier.test.mjs +238 -0
  525. package/scripts/daemon/classify-kind.mjs +54 -0
  526. package/scripts/daemon/classify-kind.test.mjs +40 -0
  527. package/scripts/daemon/context-compiler.mjs +605 -0
  528. package/scripts/daemon/context-compiler.test.mjs +300 -0
  529. package/scripts/daemon/dispatcher-cooldown.test.mjs +122 -0
  530. package/scripts/daemon/dispatcher-governance.test.mjs +886 -0
  531. package/scripts/daemon/dispatcher.mjs +1516 -0
  532. package/scripts/daemon/health.mjs +72 -0
  533. package/scripts/daemon/inbox-deferral.mjs +210 -0
  534. package/scripts/daemon/inbox-deferral.test.mjs +242 -0
  535. package/scripts/daemon/integration.test.mjs +149 -0
  536. package/scripts/daemon/launchd-wrapper-generic.sh +96 -0
  537. package/scripts/daemon/launchd-wrapper-slack-events.sh +37 -0
  538. package/scripts/daemon/launchd-wrapper.sh +91 -0
  539. package/scripts/daemon/lib/session-router.mjs +274 -0
  540. package/scripts/daemon/lib/session-router.test.mjs +295 -0
  541. package/scripts/daemon/maestro-daemon.mjs +275 -0
  542. package/scripts/daemon/prompt-builder.mjs +685 -0
  543. package/scripts/daemon/prompt-builder.test.mjs +213 -0
  544. package/scripts/daemon/responder.mjs +854 -0
  545. package/scripts/daemon/session-lock.mjs +721 -0
  546. package/scripts/daemon/session-lock.test.mjs +252 -0
  547. package/scripts/daemon/session-outcomes.mjs +640 -0
  548. package/scripts/daemon/session-outcomes.test.mjs +533 -0
  549. package/scripts/daemon/typing-registry.mjs +90 -0
  550. package/scripts/daemon/typing-registry.test.mjs +77 -0
  551. package/scripts/daemon/voice-webhook-server.mjs +804 -0
  552. package/scripts/decisions/capture-decision.mjs +116 -0
  553. package/scripts/disclosure_assessment.py +873 -0
  554. package/scripts/disclosure_boundaries.py +562 -0
  555. package/scripts/email-signature-principal.html +52 -0
  556. package/scripts/email-signature.html +60 -0
  557. package/scripts/email_quote_thread.py +167 -0
  558. package/scripts/email_thread_dedup.py +362 -0
  559. package/scripts/emergency-stop.sh +81 -0
  560. package/scripts/healthcheck.sh +116 -0
  561. package/scripts/hooks/block-mcp-cohort-send.sh +15 -0
  562. package/scripts/hooks/block-mcp-slack-send.sh +7 -0
  563. package/scripts/hooks/post-action-log.sh +126 -0
  564. package/scripts/hooks/pre-send-audit.sh +174 -0
  565. package/scripts/hooks/pre-send-audit.test.mjs +215 -0
  566. package/scripts/hooks/session-end-log.sh +27 -0
  567. package/scripts/hooks/session-start-banner.sh +115 -0
  568. package/scripts/huddle/audio-bridge.mjs +664 -0
  569. package/scripts/huddle/boot-slack-cdp.sh +102 -0
  570. package/scripts/huddle/huddle-controller.mjs +942 -0
  571. package/scripts/huddle/huddle-server.mjs +1229 -0
  572. package/scripts/huddle/launch-slack.sh +232 -0
  573. package/scripts/huddle/openai-realtime-bridge.mjs +462 -0
  574. package/scripts/huddle/package-lock.json +62 -0
  575. package/scripts/huddle/package.json +22 -0
  576. package/scripts/huddle/setup-audio.sh +239 -0
  577. package/scripts/huddle/start-call.mjs +318 -0
  578. package/scripts/huddle/test-pipeline.mjs +263 -0
  579. package/scripts/learning/consolidate-skills.mjs +72 -0
  580. package/scripts/learning/session-search.mjs +125 -0
  581. package/scripts/llm_email_dedup.py +442 -0
  582. package/scripts/local-triggers/generate-plists.sh +432 -0
  583. package/scripts/local-triggers/generate-plists.test.mjs +413 -0
  584. package/scripts/local-triggers/install-all.sh +49 -0
  585. package/scripts/local-triggers/plists/.gitkeep +0 -0
  586. package/scripts/local-triggers/run-trigger.sh +63 -0
  587. package/scripts/local-triggers/templates/rag-reindex.plist.template +47 -0
  588. package/scripts/local-triggers/templates/voice-relay-poller.plist.template +54 -0
  589. package/scripts/local-triggers/templates/voice-tunnel.plist.template +55 -0
  590. package/scripts/local-triggers/templates/voice-webhook.plist.template +51 -0
  591. package/scripts/maintenance/backup-to-cloud.sh +124 -0
  592. package/scripts/maintenance/health-check.sh +377 -0
  593. package/scripts/media-generation/README.md +105 -0
  594. package/scripts/media-generation/gemini-image-client.mjs +173 -0
  595. package/scripts/media-generation/generate-assets.mjs +289 -0
  596. package/scripts/media-generation/veo-video-client.mjs +219 -0
  597. package/scripts/org/send-orgmail.mjs +227 -0
  598. package/scripts/outbound-dedup-cleanup.sh +43 -0
  599. package/scripts/outbound-dedup.sh +477 -0
  600. package/scripts/outbound_dedup.py +115 -0
  601. package/scripts/parse-voice-transcript.mjs +481 -0
  602. package/scripts/pdf-generation/README.md +63 -0
  603. package/scripts/pdf-generation/build-document.mjs +247 -0
  604. package/scripts/pdf-generation/templates/board-pack.latex +136 -0
  605. package/scripts/pdf-generation/templates/corporate-letter.latex +126 -0
  606. package/scripts/pdf-generation/templates/memo.latex +114 -0
  607. package/scripts/poll-slack-events.sh +35 -0
  608. package/scripts/poller/calendar-poller.mjs +12 -0
  609. package/scripts/poller/gmail-poller.mjs +192 -0
  610. package/scripts/poller/imap-client.mjs +289 -0
  611. package/scripts/poller/inbox-scan-poller.mjs +156 -0
  612. package/scripts/poller/inbox-scan-poller.test.mjs +231 -0
  613. package/scripts/poller/index.mjs +73 -0
  614. package/scripts/poller/intra-session-check.mjs +285 -0
  615. package/scripts/poller/lib/cloud-relay-dedup.mjs +88 -0
  616. package/scripts/poller/lib/cloud-relay-dedup.test.mjs +133 -0
  617. package/scripts/poller/lib/slash-command-handlers.mjs +177 -0
  618. package/scripts/poller/secondary-gmail-poller.mjs +132 -0
  619. package/scripts/poller/slack-cloud-relay-client.mjs +368 -0
  620. package/scripts/poller/slack-poller.mjs +854 -0
  621. package/scripts/poller/slack-socket-mode.mjs +917 -0
  622. package/scripts/poller/slack-socket-mode.test.mjs +753 -0
  623. package/scripts/poller/trigger.mjs +75 -0
  624. package/scripts/poller/utils.mjs +371 -0
  625. package/scripts/poller/voice-cloud-relay-client.mjs +179 -0
  626. package/scripts/poller/voice-poller.mjs +236 -0
  627. package/scripts/poller-launchd/install.sh +66 -0
  628. package/scripts/poller-launchd/poller.plist.template +40 -0
  629. package/scripts/poller-launchd/whatsapp-handler.plist.template +39 -0
  630. package/scripts/post-interaction-indexer.py +1598 -0
  631. package/scripts/pre-draft-context.py +994 -0
  632. package/scripts/pre_draft_lookup.py +258 -0
  633. package/scripts/rag/build-index.mjs +47 -0
  634. package/scripts/rag/ingest.mjs +111 -0
  635. package/scripts/rag/search.mjs +119 -0
  636. package/scripts/rag-indexer.py +629 -0
  637. package/scripts/restore-from-backup.sh +248 -0
  638. package/scripts/restore-from-backup.test.mjs +178 -0
  639. package/scripts/resume-operations.sh +80 -0
  640. package/scripts/search-secondary-inbox.py +181 -0
  641. package/scripts/secondary-inbox-poller.py +437 -0
  642. package/scripts/self-optimization/compute-metrics.py +398 -0
  643. package/scripts/send-email-as-principal.py +369 -0
  644. package/scripts/send-email-threaded.py +392 -0
  645. package/scripts/send-email-with-attachment.py +377 -0
  646. package/scripts/send-email.sh +131 -0
  647. package/scripts/send-sms.sh +175 -0
  648. package/scripts/send-whatsapp.sh +292 -0
  649. package/scripts/session-start.sh +106 -0
  650. package/scripts/setup/boot-claude-session.sh +94 -0
  651. package/scripts/setup/configure-macos.sh +674 -0
  652. package/scripts/setup/configure-twilio-sip-trunk.mjs +207 -0
  653. package/scripts/setup/configure-voice-tunnel.mjs +182 -0
  654. package/scripts/setup/generate-agent-env.mjs +92 -0
  655. package/scripts/setup/generate-agent-package-json.mjs +222 -0
  656. package/scripts/setup/generate-agent-package-json.test.mjs +143 -0
  657. package/scripts/setup/generate-autonomy.mjs +60 -0
  658. package/scripts/setup/generate-backlog.mjs +101 -0
  659. package/scripts/setup/generate-cadences.mjs +92 -0
  660. package/scripts/setup/generate-capability.mjs +162 -0
  661. package/scripts/setup/generate-charter.mjs +76 -0
  662. package/scripts/setup/generate-comms.mjs +59 -0
  663. package/scripts/setup/generate-company.mjs +92 -0
  664. package/scripts/setup/init-agent.sh +547 -0
  665. package/scripts/setup/init-agent.test.mjs +151 -0
  666. package/scripts/setup/init-archetype.mjs +74 -0
  667. package/scripts/setup/init-backup.mjs +54 -0
  668. package/scripts/setup/init-cadence-bus.mjs +60 -0
  669. package/scripts/setup/init-channel-bus.mjs +46 -0
  670. package/scripts/setup/init-cost-tracking.mjs +45 -0
  671. package/scripts/setup/init-decision-capture.mjs +66 -0
  672. package/scripts/setup/init-known-agents.mjs +57 -0
  673. package/scripts/setup/init-learning.mjs +70 -0
  674. package/scripts/setup/init-memory-executive.mjs +45 -0
  675. package/scripts/setup/init-model-router.mjs +124 -0
  676. package/scripts/setup/init-rag.mjs +174 -0
  677. package/scripts/setup/init-session-router.mjs +38 -0
  678. package/scripts/setup/init-slack-socket-mode.mjs +260 -0
  679. package/scripts/setup/init-telegram.mjs +165 -0
  680. package/scripts/setup/init-voice-realtime.mjs +204 -0
  681. package/scripts/setup/init-whatsapp-baileys.mjs +77 -0
  682. package/scripts/setup/install-dev-tools.sh +150 -0
  683. package/scripts/setup/lib/install-plist.mjs +95 -0
  684. package/scripts/setup/migrate-agent-to-sot.mjs +192 -0
  685. package/scripts/setup/render-environment-yaml.mjs +133 -0
  686. package/scripts/slack-events-ctl.sh +177 -0
  687. package/scripts/slack-events-server.mjs +1045 -0
  688. package/scripts/slack-react.mjs +89 -0
  689. package/scripts/slack-responded.sh +232 -0
  690. package/scripts/slack-send.sh +287 -0
  691. package/scripts/slack-typing.mjs +196 -0
  692. package/scripts/slack-upload-v2.py +95 -0
  693. package/scripts/sms-handler.mjs +450 -0
  694. package/scripts/spawn-session.sh +120 -0
  695. package/scripts/sync-protocol.mjs +217 -0
  696. package/scripts/system-verify.sh +184 -0
  697. package/scripts/test-email-thread-dedup.py +239 -0
  698. package/scripts/test-information-barriers.py +484 -0
  699. package/scripts/test-llm-email-dedup.py +251 -0
  700. package/scripts/test-pre-draft-integration.py +203 -0
  701. package/scripts/test-rag-phase2.sh +442 -0
  702. package/scripts/test-rag-search.sh +251 -0
  703. package/scripts/test-voice-parser.mjs +316 -0
  704. package/scripts/user-context-search.py +659 -0
  705. package/scripts/validate_outbound.py +1504 -0
  706. package/scripts/watchdog/ai.maestro.memory-watchdog.plist +41 -0
  707. package/scripts/watchdog/force-reboot.sh +157 -0
  708. package/scripts/watchdog/memory-watchdog.sh +473 -0
  709. package/scripts/whatsapp-handler.mjs +538 -0
  710. package/teams/desktop-operations.yaml +34 -0
  711. package/teams/executive-office.yaml +27 -0
  712. package/teams/legal-and-regulatory.yaml +24 -0
  713. package/teams/platform-and-engineering.yaml +23 -0
  714. package/teams/strategy-and-growth.yaml +29 -0
  715. package/workflows/continuous/backlog-executor.yaml +141 -0
  716. package/workflows/continuous/inbound-monitor.yaml +168 -0
  717. package/workflows/daily/applicant-triage.yaml +197 -0
  718. package/workflows/daily/comms-triage.yaml +80 -0
  719. package/workflows/daily/evening-wrap.yaml +105 -0
  720. package/workflows/daily/morning-brief.yaml +164 -0
  721. package/workflows/daily/slack-followup-sweep.yaml +87 -0
  722. package/workflows/event-driven/README.md +50 -0
  723. package/workflows/event-driven/agent-failure-investigation.yaml +137 -0
  724. package/workflows/event-driven/pr-review.yaml +107 -0
  725. package/workflows/monthly/board-readiness.yaml +76 -0
  726. package/workflows/quarterly/strategic-scenario-analysis.yaml +85 -0
  727. package/workflows/session-protocol.md +171 -0
  728. package/workflows/weekly/engineering-health.yaml +154 -0
  729. package/workflows/weekly/hiring-review.yaml +169 -0
  730. package/workflows/weekly/rollup-pipeline-review.yaml +76 -0
  731. 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