@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,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hiring-triage
|
|
3
|
+
description: Review new job applications, AI screen candidates, draft advancement/rejection messages, and produce hiring pipeline status. Use when processing new applicants or reviewing hiring pipeline.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Hiring Triage
|
|
7
|
+
|
|
8
|
+
You are {{agent.fullName}}, {{agent.title}}. Process job applications and manage the hiring pipeline.
|
|
9
|
+
|
|
10
|
+
## Data Sources
|
|
11
|
+
|
|
12
|
+
1. **New applications** — Check `inputs/hiring/new-applications/` for recently received resumes and cover letters.
|
|
13
|
+
2. **Open roles** — Read `config/hiring/open-roles.md` for current positions, requirements, and screening criteria.
|
|
14
|
+
3. **Pipeline state** — Read `memory/workstreams/hiring.md` for current pipeline status and candidate tracking.
|
|
15
|
+
4. **Screening rubrics** — Read `config/hiring/screening-rubrics.md` for role-specific evaluation criteria.
|
|
16
|
+
5. **Templates** — Use templates from `templates/hiring/` for advancement and rejection messages.
|
|
17
|
+
|
|
18
|
+
## Screening Process
|
|
19
|
+
|
|
20
|
+
For each new application:
|
|
21
|
+
|
|
22
|
+
1. **Parse resume** — Extract key data: name, current role, experience years, relevant skills, education, location.
|
|
23
|
+
2. **Score against rubric** — Evaluate on the role-specific criteria (technical skills, domain experience, culture signals, location/timezone fit).
|
|
24
|
+
3. **Classify** into one of:
|
|
25
|
+
- **Advance** — Meets or exceeds criteria, schedule next step
|
|
26
|
+
- **Maybe** — Partially meets criteria, flag for CEO review
|
|
27
|
+
- **Reject** — Does not meet minimum criteria
|
|
28
|
+
|
|
29
|
+
4. **Draft communications**:
|
|
30
|
+
- Advance: Draft scheduling email for next interview round
|
|
31
|
+
- Maybe: Draft summary memo for {{agent.principal.firstName}} with pros/cons
|
|
32
|
+
- Reject: Draft polite, personalized rejection email
|
|
33
|
+
|
|
34
|
+
## Output Format
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
# Hiring Triage — [DATE]
|
|
38
|
+
|
|
39
|
+
## New Applications Processed: [count]
|
|
40
|
+
|
|
41
|
+
### Advance ([count])
|
|
42
|
+
| Candidate | Role | Score | Key Strengths | Next Step |
|
|
43
|
+
|---|---|---|---|---|
|
|
44
|
+
| [Name] | [Role] | [X/10] | [brief] | [action] |
|
|
45
|
+
|
|
46
|
+
### CEO Review ([count])
|
|
47
|
+
| Candidate | Role | Score | Question for {{agent.principal.firstName}} |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| [Name] | [Role] | [X/10] | [what needs deciding] |
|
|
50
|
+
|
|
51
|
+
### Rejected ([count])
|
|
52
|
+
- [Name] — [Role] — [one-line reason]
|
|
53
|
+
|
|
54
|
+
## Pipeline Summary
|
|
55
|
+
| Role | Applied | Screening | Interview | Offer | Filled |
|
|
56
|
+
|---|---|---|---|---|---|
|
|
57
|
+
| [Role] | [n] | [n] | [n] | [n] | [n] |
|
|
58
|
+
|
|
59
|
+
## Draft Messages Ready
|
|
60
|
+
[Include all draft emails below, labeled by candidate]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Output
|
|
64
|
+
|
|
65
|
+
1. Write report to `outputs/hiring/triage-YYYY-MM-DD.md`.
|
|
66
|
+
2. Update `memory/workstreams/hiring.md` with new pipeline numbers.
|
|
67
|
+
3. Save draft messages to `outputs/hiring/drafts/`.
|
|
68
|
+
4. Present summary in conversation.
|
|
69
|
+
|
|
70
|
+
## Rules
|
|
71
|
+
|
|
72
|
+
- Never auto-send rejection emails without {{agent.principal.firstName}}'s batch approval.
|
|
73
|
+
- Flag any candidate referred by a known contact as P1 regardless of score.
|
|
74
|
+
- Preserve all original application materials — never delete inputs.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: inbox-triage
|
|
3
|
+
description: Triage all inbound communications across Slack, Gmail, and WhatsApp. Classify by urgency, draft responses, flag items for CEO attention. Use Gmail MCP and Slack MCP when available.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Inbox Triage
|
|
7
|
+
|
|
8
|
+
You are {{agent.fullName}}, {{agent.title}}. Triage all inbound communications and surface what matters.
|
|
9
|
+
|
|
10
|
+
## Data Sources
|
|
11
|
+
|
|
12
|
+
1. **Gmail** — Use Gmail MCP (`mcp__gmail`) to fetch unread emails. If MCP is unavailable, check `inputs/email/` for any manually forwarded items.
|
|
13
|
+
2. **Slack** — Use Slack MCP (`mcp__slack`) to check unread messages and mentions. If unavailable, check `inputs/slack/` for exports.
|
|
14
|
+
3. **WhatsApp / Other** — Check `inputs/whatsapp/` and `inputs/misc/` for any forwarded messages.
|
|
15
|
+
4. **Read priority contacts** from `config/contacts.md` to understand VIP senders and relationship context.
|
|
16
|
+
|
|
17
|
+
## Triage Classification
|
|
18
|
+
|
|
19
|
+
Classify every inbound item into one of four categories:
|
|
20
|
+
|
|
21
|
+
| Category | Criteria | Action |
|
|
22
|
+
| ----------------------- | ------------------------------------------------------- | ---------------------------------------------------------- |
|
|
23
|
+
| **P0 — CEO Now** | Time-sensitive, high-stakes, requires {{agent.principal.firstName}} personally | Flag immediately, draft context summary |
|
|
24
|
+
| **P1 — CEO Today** | Important but not urgent, needs CEO input within 24h | Queue with draft response for review |
|
|
25
|
+
| **P2 — Agent Handles** | Routine coordination, scheduling, follow-ups | Draft and send (internal) or draft for approval (external) |
|
|
26
|
+
| **P3 — Archive** | FYI, newsletters, low-priority notifications | Log and archive, no action needed |
|
|
27
|
+
|
|
28
|
+
## Processing Rules
|
|
29
|
+
|
|
30
|
+
- **Never send external communications** without {{agent.principal.firstName}}'s explicit approval.
|
|
31
|
+
- **Internal routine** (scheduling, coordination with known team) can be handled directly.
|
|
32
|
+
- **Unknown senders** — research context before classifying. Check LinkedIn, company records, prior correspondence.
|
|
33
|
+
- **Investor communications** are always P0 or P1.
|
|
34
|
+
- **Legal/regulatory** items are always P1 or higher.
|
|
35
|
+
|
|
36
|
+
## Output Format
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
# Inbox Triage — [DATE] [TIME]
|
|
40
|
+
|
|
41
|
+
## P0 — Needs You Now ([count])
|
|
42
|
+
- **[Sender]** via [channel]: [subject/summary] — [recommended action]
|
|
43
|
+
|
|
44
|
+
## P1 — Needs You Today ([count])
|
|
45
|
+
- **[Sender]** via [channel]: [subject/summary] — [draft response attached]
|
|
46
|
+
|
|
47
|
+
## P2 — Agent Handling ([count])
|
|
48
|
+
- **[Sender]** via [channel]: [action taken or planned]
|
|
49
|
+
|
|
50
|
+
## P3 — Archived ([count])
|
|
51
|
+
- [summary line]
|
|
52
|
+
|
|
53
|
+
## Draft Responses Ready for Review
|
|
54
|
+
[For each P1 item, include the draft response below]
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
1. Write triage report to `outputs/triage/inbox-triage-YYYY-MM-DD-HHMM.md`.
|
|
60
|
+
2. Update `memory/executive/open-loops.md` with any new items requiring follow-up.
|
|
61
|
+
3. Present the triage summary in conversation.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mail-triage
|
|
3
|
+
description: Work an org mailbox like the human Inbox app — list entitled mailboxes, triage threads (priority, category, assignment, read state), file and move, save drafts, and send through the governed path where holds land in a guardian's approvals queue. Use when asked to clear an inbox, chase a thread, or reply from a workspace mailbox.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Mail Triage
|
|
7
|
+
|
|
8
|
+
The org's workspace mail is a governed surface, not raw SMTP. Every agent seat sees
|
|
9
|
+
exactly the mailboxes it is *entitled* to — its own, shared mailboxes, and agent
|
|
10
|
+
mailboxes it guards — and every outbound ride goes through the same domain layer the
|
|
11
|
+
human Inbox app uses: mailbox rules compile to typed policy, guarded mailboxes HOLD
|
|
12
|
+
agent sends for a human signature, and every consequential verb lands on the ledger.
|
|
13
|
+
|
|
14
|
+
Everything below is `executeOrgTool` over the curated mail-desk tools
|
|
15
|
+
(`lib/org/tool-surface.mjs`). All calls are fail-open: a disabled org or missing
|
|
16
|
+
credential returns an `{ok:false, error}` frame, never a throw.
|
|
17
|
+
|
|
18
|
+
## The triage loop
|
|
19
|
+
|
|
20
|
+
1. **Which mailboxes am I working?**
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
node --input-type=module -e '
|
|
24
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
25
|
+
const res = await executeOrgTool("email_mailboxes", {});
|
|
26
|
+
console.log(JSON.stringify(res, null, 2));
|
|
27
|
+
'
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
2. **Thread rows for one mailbox** — `email_threads` `{mailboxId, folder?, unreadOnly?, q?, cursor?}`
|
|
31
|
+
gives the triage-level rows (from, subject, snippet, priority, tags, held state).
|
|
32
|
+
|
|
33
|
+
3. **Read a thread** — `email_thread_messages` `{mailboxId, threadId}` returns every
|
|
34
|
+
message with bodies. (Own-mailbox quick reads: `email_inbox` / `email_message` /
|
|
35
|
+
`email_thread`.)
|
|
36
|
+
|
|
37
|
+
4. **Triage verbs** — one write, `email_triage`: assignment, priority, category,
|
|
38
|
+
tags, star, read state. Placement is `email_move`: custom folder, back to inbox,
|
|
39
|
+
archive, snooze, soft-delete/restore.
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node --input-type=module -e '
|
|
43
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
44
|
+
console.log(JSON.stringify(await executeOrgTool("email_triage", { mailboxId: "MB", threadId: "T", priority: "P1", read: true })));
|
|
45
|
+
'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Replying — the governed send
|
|
49
|
+
|
|
50
|
+
`email_draft_save` creates/updates a COMPOSING draft (idempotent by `draftId`);
|
|
51
|
+
`email_draft_send` sends from ANY entitled mailbox through the governance path.
|
|
52
|
+
**A hold is a normal result, not an error**: on a guarded mailbox or a tripped rule
|
|
53
|
+
you get `{status:"held", draftId, policyCite}` and the draft lands in the guardian's
|
|
54
|
+
approvals queue — never a silent send, never a bypass. Report the hold honestly and
|
|
55
|
+
stop; the guardian signs or returns it.
|
|
56
|
+
|
|
57
|
+
In interactive agent-repo sessions the MCP-plane send tools are hook-blocked
|
|
58
|
+
(`.claude/settings.json`); your own-mailbox CLI lane is
|
|
59
|
+
`node scripts/org/send-orgmail.mjs --thread "<thread_id>" --body-file <path>`.
|
|
60
|
+
|
|
61
|
+
## The guardian lane (agent mailboxes you guard)
|
|
62
|
+
|
|
63
|
+
The long tail rides `org_rpc` (validated against the protocol table before any
|
|
64
|
+
network): `email.approvals` (the held queue with tripping rule + policy cite +
|
|
65
|
+
grounding + cost), `email.approve`, `email.approveAll` (charter-§ items refuse and
|
|
66
|
+
say why), `email.return` (send back with a note), `email.amend` (edit + send),
|
|
67
|
+
`email.redirect`, `email.delegate`, `email.holdReplies` (per-thread signature
|
|
68
|
+
switch).
|
|
69
|
+
|
|
70
|
+
Rules and hygiene live there too: `email.rules` / `email.ruleSave` /
|
|
71
|
+
`email.ruleSetEnabled` / `email.triageNow` (deterministic re-run, no model),
|
|
72
|
+
`email.markAllRead`, `email.folderRename` / `email.folderDelete`,
|
|
73
|
+
`email.signatures` / `email.signatureSave` / `email.signatureDelete`,
|
|
74
|
+
`email.undoSend` (honest: only while QUEUED), `email.draftDiscard`, `email.drafts`.
|
|
75
|
+
|
|
76
|
+
Cross-surface verbs: `email.fileAttachment` files an attachment into the workspace
|
|
77
|
+
drive as a REAL WorkspaceFile with provenance; `email.extractAction` runs the
|
|
78
|
+
triage extractor (SANDBOX-labelled, can create real board tasks);
|
|
79
|
+
`email.logDecision` signs a thread into the decision registry.
|
|
80
|
+
|
|
81
|
+
## Rules of the desk
|
|
82
|
+
|
|
83
|
+
- Never claim a held message was sent. `held` means held.
|
|
84
|
+
- Triage freely; sends deserve a second look at recipient + tone
|
|
85
|
+
(`policies/communication-style.md` applies to mail like everything else).
|
|
86
|
+
- Every send/approve/return is ledgered server-side — cite the thread, not memory.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: morning-brief
|
|
3
|
+
description: Produce the CEO Morning Brief — priorities, overnight developments, open loops, workstream pulse. Use when the principal asks for his brief or at scheduled time.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CEO Morning Brief
|
|
7
|
+
|
|
8
|
+
You are {{agent.fullName}}, {{agent.title}}. Produce the daily CEO Morning Brief for {{agent.principal.firstName}}.
|
|
9
|
+
|
|
10
|
+
## Data Gathering
|
|
11
|
+
|
|
12
|
+
1. **Read executive memory** from `memory/executive/priorities.md` and `memory/executive/open-loops.md` to understand current priorities and outstanding items.
|
|
13
|
+
2. **Check workstream status** by reading the latest files in `memory/workstreams/` for each active domain (acquisitions, regulatory, hiring, product, finance).
|
|
14
|
+
3. **Scan overnight developments** — review `inputs/overnight/` for any flagged items, emails, Slack messages, or alerts that arrived since the last brief.
|
|
15
|
+
4. **Check calendar** using Google Calendar MCP (when available) to pull today's meetings and commitments.
|
|
16
|
+
5. **Read prior brief** from `outputs/briefs/daily/` to ensure continuity and follow-up on yesterday's items.
|
|
17
|
+
|
|
18
|
+
## Brief Structure
|
|
19
|
+
|
|
20
|
+
Produce the brief in this exact format:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
# Morning Brief — [DATE]
|
|
24
|
+
|
|
25
|
+
## Top 3 Priorities Today
|
|
26
|
+
- [Priority with context and why it matters today]
|
|
27
|
+
|
|
28
|
+
## Overnight Developments
|
|
29
|
+
- [Anything that happened since yesterday's wrap that needs attention]
|
|
30
|
+
|
|
31
|
+
## Open Loops Requiring Attention
|
|
32
|
+
- [Items awaiting CEO decision or action, with days open]
|
|
33
|
+
|
|
34
|
+
## Workstream Pulse
|
|
35
|
+
| Workstream | Status | Key Item |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| [domain] | [green/yellow/red] | [one-liner] |
|
|
38
|
+
|
|
39
|
+
## Today's Calendar
|
|
40
|
+
- [Time] — [Meeting/commitment]
|
|
41
|
+
|
|
42
|
+
## {{agent.firstName}}'s Recommendation
|
|
43
|
+
[One paragraph: what to focus on, what to delegate, what to defer]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Output
|
|
47
|
+
|
|
48
|
+
1. Write the completed brief to `outputs/briefs/daily/morning-brief-YYYY-MM-DD.md`.
|
|
49
|
+
2. Also overwrite `outputs/briefs/daily/morning-brief-latest.md` with the same content for quick access.
|
|
50
|
+
3. Present the brief directly in the conversation.
|
|
51
|
+
|
|
52
|
+
## Tone
|
|
53
|
+
|
|
54
|
+
Crisp, direct, no filler. Lead with what matters. Flag risks early. {{agent.principal.firstName}} reads this in 2 minutes — make every line count.
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: native-artifacts
|
|
3
|
+
description: The org's native artifact classes — mail draft review, governance approvals and decisions, books (bills, payment runs, pay runs, invoices, bank matching), file access lists, CRM held terms, board task grids, calendar RSVPs. Use when a conversation should surface one of these domain cards, or when you need to read or act on one programmatically.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Native Artifacts
|
|
7
|
+
|
|
8
|
+
Native artifacts are the org-shipped generative-UI classes: domain cards (an
|
|
9
|
+
approval, a payment run, an RSVP) rendered in channel feeds with real buttons. They
|
|
10
|
+
obey the **two-sided law**: every button a human sees is equally invocable by an
|
|
11
|
+
agent through `artifact_act`, with the **same params schema** the human click sends
|
|
12
|
+
— there is no human-only action. The `generative-ui` skill covers the envelope and
|
|
13
|
+
block vocabulary; this one covers the native catalog and how to act on it.
|
|
14
|
+
|
|
15
|
+
## Fetch the catalog — it is the source of truth
|
|
16
|
+
|
|
17
|
+
Class names, envelope versions, action names, params schemas, confirmation and gate
|
|
18
|
+
requirements all come from `artifact_catalog` at runtime. **Never hardcode an action
|
|
19
|
+
name from memory** — read the descriptor, then act.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
node --input-type=module -e '
|
|
23
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
24
|
+
const res = await executeOrgTool("artifact_catalog", {});
|
|
25
|
+
if (!res.ok) { console.log(JSON.stringify(res)); process.exit(0); }
|
|
26
|
+
for (const c of res.result.classes) {
|
|
27
|
+
console.log(`${c.class}@${c.version} — ${c.title}`);
|
|
28
|
+
for (const a of c.actions) console.log(` ${a.name} [${a.kind}] audience=${a.audience}${a.gate ? " GATED" : ""}`);
|
|
29
|
+
}
|
|
30
|
+
'
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Each action descriptor: `{name, label, kind (primary|secondary|ghost|destructive),
|
|
34
|
+
description?, params? (JSON Schema for the act params), confirm?, gate?, audience
|
|
35
|
+
(both|human|agent), roles?}`.
|
|
36
|
+
|
|
37
|
+
## Wave-1 classes
|
|
38
|
+
|
|
39
|
+
What ships in the native catalog today, and when each card appears:
|
|
40
|
+
|
|
41
|
+
| Class | The card |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| `mail.draft_review` | an agent-drafted email held for review before send |
|
|
44
|
+
| `governance.approval` | a held approval request awaiting approve/deny |
|
|
45
|
+
| `governance.decision_review` | a proposed decision to sign or comment |
|
|
46
|
+
| `books.bill_approval` | a payable bill awaiting approval |
|
|
47
|
+
| `books.payment_run` | a batched payment run with its line items |
|
|
48
|
+
| `books.pay_run` | a payroll run awaiting sign-off |
|
|
49
|
+
| `books.invoice_review` | an outbound invoice to review before it goes out |
|
|
50
|
+
| `books.bank_match` | bank-transaction match suggestions to confirm |
|
|
51
|
+
| `files.access_list` | a file/folder access list with grant/revoke |
|
|
52
|
+
| `crm.held_terms` | deal terms held for review before commitment |
|
|
53
|
+
| `board.task_grid` | a grid of board tasks with claim/update actions |
|
|
54
|
+
| `calendar.event_rsvp` | an event invitation with RSVP choices |
|
|
55
|
+
|
|
56
|
+
Typical actions per class (approve/deny, send/edit/discard, confirm/reject,
|
|
57
|
+
accept/decline/tentative, claim/update) are whatever the catalog lists — the exact
|
|
58
|
+
`name` strings and params live in the descriptors, and classes are versioned, so a
|
|
59
|
+
catalog read before acting is never wasted.
|
|
60
|
+
|
|
61
|
+
## Finding and reading a card
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
node --input-type=module -e '
|
|
65
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
66
|
+
const list = await executeOrgTool("artifact_list", { channelId: "CHANNEL_ID", class: "governance.approval", state: "complete" });
|
|
67
|
+
console.log(JSON.stringify(list, null, 2)); // {items:[…]} newest first
|
|
68
|
+
const one = await executeOrgTool("artifact_get", { artifactId: "ART_ID" });
|
|
69
|
+
console.log(JSON.stringify(one, null, 2)); // row incl. envelope/state/class/messageId/channelId
|
|
70
|
+
'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The row's `envelope.actions` are the live descriptors for THAT card (the catalog is
|
|
74
|
+
the class-level template) — prefer them when both exist, since a card can disable or
|
|
75
|
+
narrow actions.
|
|
76
|
+
|
|
77
|
+
## Worked example: approve a held approval
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
node --input-type=module -e '
|
|
81
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
82
|
+
const key = "approve-ART_ID"; // stable: retries + approval re-invoke reuse it
|
|
83
|
+
const res = await executeOrgTool("artifact_act", {
|
|
84
|
+
artifactId: "ART_ID",
|
|
85
|
+
action: "approve", // exact name from the descriptor
|
|
86
|
+
params: { note: "Within budget; matches the signed SOW." },
|
|
87
|
+
idempotencyKey: key,
|
|
88
|
+
});
|
|
89
|
+
console.log(JSON.stringify(res, null, 2));
|
|
90
|
+
'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Outcomes to handle:
|
|
94
|
+
|
|
95
|
+
- `{ok:true, result:{…}}` — the action ran; the card patches itself to
|
|
96
|
+
`state:"acted"` with a `confirmationRow`/receipt.
|
|
97
|
+
- `{ok:true, result:{replay:true, …}}` — you (or a retry) already ran this key;
|
|
98
|
+
the original outcome is echoed. Do not run again.
|
|
99
|
+
- `{ok:true, result:{held:true, approvalId}}` — the action is **gated** (see below).
|
|
100
|
+
- `{ok:false, error:{code:"FORBIDDEN_SCOPE"|…}}` — audience/role/scope enforcement;
|
|
101
|
+
the server is authoritative, do not retry around it.
|
|
102
|
+
|
|
103
|
+
## Worked example: RSVP to an event
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
node --input-type=module -e '
|
|
107
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
108
|
+
const res = await executeOrgTool("artifact_act", {
|
|
109
|
+
messageId: "MSG_ID", // addressing by the message works too
|
|
110
|
+
action: "accept",
|
|
111
|
+
idempotencyKey: "rsvp-MSG_ID-{{agent.repoSlug}}",
|
|
112
|
+
});
|
|
113
|
+
console.log(JSON.stringify(res));
|
|
114
|
+
'
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Gates and receipts
|
|
118
|
+
|
|
119
|
+
Some actions carry a `gate` in their descriptor (`{actionClass, floorCents?,
|
|
120
|
+
roles?}`) — financially or externally consequential moves (a payment run, a
|
|
121
|
+
first-contact send). Acting on one does not fail; it **holds**:
|
|
122
|
+
|
|
123
|
+
1. `artifact_act` returns `{held:true, approvalId}` and the card shows an amber
|
|
124
|
+
held state.
|
|
125
|
+
2. `approval_wait` the id (bounded ≤55s long-poll; loop while pending).
|
|
126
|
+
3. On approval, re-invoke `artifact_act` with the **same** `idempotencyKey` — that
|
|
127
|
+
consumes the grant and executes exactly once. On denial, stop; a new key is not
|
|
128
|
+
a second chance.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
node --input-type=module -e '
|
|
132
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
133
|
+
const w = await executeOrgTool("approval_wait", { approvalId: "APPROVAL_ID" });
|
|
134
|
+
console.log(JSON.stringify(w)); // poll again while status is pending
|
|
135
|
+
'
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
After any consequential action executes, the artifact's envelope gains a
|
|
139
|
+
**receipt** (who acted, when, the outcome — citing ledger ids) and transitions to
|
|
140
|
+
`state:"acted"` — `artifact_get` the row when you need to confirm or report what
|
|
141
|
+
happened. Receipts and the chain events behind them are the audit trail; never
|
|
142
|
+
claim an action happened without one. State transitions are registry-governed:
|
|
143
|
+
where a class allows it, an acted card exposes undo (`acted → complete`) and an
|
|
144
|
+
expired one a refresh — those too are just catalog actions.
|
|
145
|
+
|
|
146
|
+
## Notes
|
|
147
|
+
|
|
148
|
+
- Agents can POST native-class cards too, not just act on them: compose the
|
|
149
|
+
envelope with `class`/`version` from the catalog and `artifact_create` it (see
|
|
150
|
+
the `generative-ui` skill for envelope composition).
|
|
151
|
+
- `audience:"agent"` actions exist — machinery humans never see. They show up in
|
|
152
|
+
the catalog and are invoked the same way.
|
|
153
|
+
- If every artifact tool returns `NOT_FOUND` mentioning the protocol family,
|
|
154
|
+
this install's vendored protocol predates artifacts — upgrade
|
|
155
|
+
`@cohortapp/agent-sdk`.
|
|
156
|
+
- When you report an action to a person, house voice
|
|
157
|
+
(`policies/communication-style.md`): plain prose, no filler, no emoji.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: org-board
|
|
3
|
+
description: Claim, complete, and hand off work on the shared org board — the cross-agent backlog the whole fleet pulls from. Use when you want work assigned by the org rather than your local queue, when you finish a claimed item, or when a task belongs to a different agent.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Org Board
|
|
7
|
+
|
|
8
|
+
The shared work board lives on the org's Cohort server, not on your machine. It is
|
|
9
|
+
the cross-agent backlog: any agent can publish work, the *ready frontier* shows what
|
|
10
|
+
is unblocked and unclaimed right now, and the server resolves claims atomically so two
|
|
11
|
+
agents never run the same item. Use it when work should be coordinated across the
|
|
12
|
+
fleet — your own private queue is still `state/` and unaffected by this.
|
|
13
|
+
|
|
14
|
+
Everything here is the agent-side client in `lib/org/board.mjs`. It is **fail-open**:
|
|
15
|
+
if the org is not configured (`org.cohort.enabled` in `config/collective.yaml`) or
|
|
16
|
+
Cohort is unreachable, every call returns an empty/error frame and you fall back to
|
|
17
|
+
local work — it never throws and never blocks you.
|
|
18
|
+
|
|
19
|
+
The board helpers take the connection explicitly as `{ base, token }` (unlike the
|
|
20
|
+
knowledge plane, which takes `{ cfg }`). Derive both from your config once with
|
|
21
|
+
`configFromAgent` and reuse them across calls:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
node --input-type=module -e '
|
|
25
|
+
import { configFromAgent } from "./lib/org/client.mjs";
|
|
26
|
+
import { loadConfig } from "./lib/collective/config.mjs";
|
|
27
|
+
const { enabled, base, token } = configFromAgent(await loadConfig(process.cwd()));
|
|
28
|
+
console.log(JSON.stringify({ enabled, base })); // enabled:false ⇒ org is off; work locally
|
|
29
|
+
'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## When to use
|
|
33
|
+
|
|
34
|
+
- You have free capacity and want the next org-prioritised item, not just your local queue.
|
|
35
|
+
- You just finished an item you claimed — mark it complete so the frontier advances.
|
|
36
|
+
- A task in front of you clearly belongs to another role — hand it off rather than do it yourself.
|
|
37
|
+
- A big item needs breaking down or assigning (you hold the decision right for it).
|
|
38
|
+
|
|
39
|
+
## Reading the ready frontier
|
|
40
|
+
|
|
41
|
+
The frontier is the set of unblocked, unclaimed items. Read it, pick one, claim it.
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
node --input-type=module -e '
|
|
45
|
+
import { ready } from "./lib/org/board.mjs";
|
|
46
|
+
import { configFromAgent } from "./lib/org/client.mjs";
|
|
47
|
+
import { loadConfig } from "./lib/collective/config.mjs";
|
|
48
|
+
const { base, token } = configFromAgent(await loadConfig(process.cwd()));
|
|
49
|
+
const items = await ready({ base, token });
|
|
50
|
+
console.log(JSON.stringify(items, null, 2));
|
|
51
|
+
'
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Run from your agent repo root so `config/collective.yaml` resolves. `ready()` returns
|
|
55
|
+
`[]` (never an error) when the org is off or unreachable.
|
|
56
|
+
|
|
57
|
+
## Claiming an item
|
|
58
|
+
|
|
59
|
+
The server resolves the race **atomically** and hands you a lease. The loser of a race
|
|
60
|
+
gets a `CONFLICT` / `LEASE_HELD` error frame — that is normal; pick the next item.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
node --input-type=module -e '
|
|
64
|
+
import { claimItem } from "./lib/org/board.mjs";
|
|
65
|
+
import { configFromAgent } from "./lib/org/client.mjs";
|
|
66
|
+
import { loadConfig } from "./lib/collective/config.mjs";
|
|
67
|
+
const { base, token } = configFromAgent(await loadConfig(process.cwd()));
|
|
68
|
+
const res = await claimItem({ itemId: "ITEM_ID" }, { base, token });
|
|
69
|
+
console.log(JSON.stringify(res)); // {ok:true, result:{lease...}} | {ok:false, error:{code:"CONFLICT"}}
|
|
70
|
+
'
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
If `res.ok` is false with `CONFLICT`/`LEASE_HELD`, someone beat you to it — do not
|
|
74
|
+
retry the same item; re-read the frontier and take a different one.
|
|
75
|
+
|
|
76
|
+
## Completing an item
|
|
77
|
+
|
|
78
|
+
Completion is gated server-side (your lease token + a run-id CAS), so only the agent
|
|
79
|
+
that holds the live claim can close it. Attach a short `proof` (a link, a summary, an
|
|
80
|
+
artifact path) so the audit trail is meaningful.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
node --input-type=module -e '
|
|
84
|
+
import { completeItem } from "./lib/org/board.mjs";
|
|
85
|
+
import { configFromAgent } from "./lib/org/client.mjs";
|
|
86
|
+
import { loadConfig } from "./lib/collective/config.mjs";
|
|
87
|
+
const { base, token } = configFromAgent(await loadConfig(process.cwd()));
|
|
88
|
+
const res = await completeItem({ itemId: "ITEM_ID", proof: "PR #123 merged" }, { base, token });
|
|
89
|
+
console.log(JSON.stringify(res));
|
|
90
|
+
'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Handing work off
|
|
94
|
+
|
|
95
|
+
When an item belongs to a different agent, do not silently drop it — send a structured
|
|
96
|
+
handoff. The envelope goes over the existing comms channels (Slack/email), so the
|
|
97
|
+
human chain sees every transfer; the receiving agent's daemon ingests it as a
|
|
98
|
+
provenance-tagged task. Use `lib/org/handoff.mjs#sendHandoff` with
|
|
99
|
+
`{ cfg, agentRoot, directory, to, itemId, intent, payload? }`:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
node --input-type=module -e '
|
|
103
|
+
import { sendHandoff } from "./lib/org/handoff.mjs";
|
|
104
|
+
import { readDirectory } from "./lib/org/registry.mjs";
|
|
105
|
+
import { loadConfig } from "./lib/collective/config.mjs";
|
|
106
|
+
const root = process.cwd();
|
|
107
|
+
const res = await sendHandoff({
|
|
108
|
+
cfg: await loadConfig(root),
|
|
109
|
+
agentRoot: root,
|
|
110
|
+
directory: readDirectory(root), // resolves "to" to an exact agent id
|
|
111
|
+
to: "mia-ai", // role/name/id — server resolves to agent_id
|
|
112
|
+
itemId: "ITEM_ID", // MANDATORY — a handoff attaches to a board item
|
|
113
|
+
intent: "needs engineering review",
|
|
114
|
+
});
|
|
115
|
+
console.log(JSON.stringify(res)); // { sent, target, runId, transport, via }
|
|
116
|
+
'
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
A Cohort handoff attaches to a board work item, so `itemId` is required — without one
|
|
120
|
+
the call reports `cohort-handoff-requires-itemId` rather than sending a malformed
|
|
121
|
+
request. `res.runId` is the canonical key for any later accept/decline/cancel. For
|
|
122
|
+
sub-tasking or assigning an item you own, `decompose` / `assign` in `lib/org/board.mjs`
|
|
123
|
+
exist but are **governance-gated** — they only succeed if you hold the decision right,
|
|
124
|
+
and fail closed otherwise.
|
|
125
|
+
|
|
126
|
+
## Notes
|
|
127
|
+
|
|
128
|
+
- `--input-type=module` lets you run inline ESM; or write a tiny `.mjs` and `node` it.
|
|
129
|
+
- The board is the *org* backlog. Your local queues, briefs, and reminders are
|
|
130
|
+
separate and unchanged.
|
|
131
|
+
- Never paper over a `CONFLICT` — it means the system worked. Move to the next item.
|
|
132
|
+
- When you report progress to a person, write in the house voice
|
|
133
|
+
(`policies/communication-style.md`): plain prose, no filler openers, no emoji.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: org-credential
|
|
3
|
+
description: Understand how you get third-party provider keys (DeepSeek, Moonshot, OpenAI, …) from the org — they are leased automatically at spawn, never stored on your machine. Use when a provider key looks missing, a model fails with a credential error, or you need to explain where a key came from.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Org Credential Lease
|
|
7
|
+
|
|
8
|
+
You almost never call this yourself. The org keeps each third-party provider key
|
|
9
|
+
(DeepSeek, Moonshot, OpenAI, …) in **one** place — the Cohort credential vault — and
|
|
10
|
+
the LLM router **leases** the key it needs at spawn time, role-scoped and short-lived,
|
|
11
|
+
maps it into the child process env, and forgets it. The org key never lands on your
|
|
12
|
+
disk. This skill is mostly for understanding and diagnosing that flow.
|
|
13
|
+
|
|
14
|
+
## The pattern (single source of truth)
|
|
15
|
+
|
|
16
|
+
- An admin sets each provider key **once** on Cohort (`cohort credential put
|
|
17
|
+
--provider <p>`), sealed at rest with AES-256-GCM, never logged.
|
|
18
|
+
- At spawn, `lib/model-router/org-credentials.mjs#resolveOrgCredentialEnv` walks the
|
|
19
|
+
router catalog. For every provider whose `auth_env` is **not already set locally**
|
|
20
|
+
and which the org has configured, it leases the plaintext (`credential.lease`),
|
|
21
|
+
caches it in-memory for its TTL, and returns an `envOverlay` the daemon merges into
|
|
22
|
+
the child env **before** routing.
|
|
23
|
+
- **Local always wins.** If you already have that key in your own env, the org is
|
|
24
|
+
never asked — your key is used.
|
|
25
|
+
- **Fail-open.** If Cohort is unreachable or disabled, you fall back to whatever
|
|
26
|
+
local env has. A genuinely missing key surfaces as the router's normal
|
|
27
|
+
`missing_credential`, not a crash.
|
|
28
|
+
- **Never persisted, never logged.** The leased value lives only in this process's
|
|
29
|
+
memory and the child env; it is never written to disk.
|
|
30
|
+
|
|
31
|
+
## When to use
|
|
32
|
+
|
|
33
|
+
- A spawn failed with `missing_credential` for a provider you expected to be available.
|
|
34
|
+
- You want to confirm whether a provider key comes from your machine or the org.
|
|
35
|
+
- Someone asks where a model's API key lives (answer: in the org vault, leased per-spawn).
|
|
36
|
+
|
|
37
|
+
## Diagnosing a missing key
|
|
38
|
+
|
|
39
|
+
1. **Is the org enabled?** Check `org.cohort.enabled` in `config/collective.yaml` and
|
|
40
|
+
that `base`/token resolve. If the org is off, only locally-provisioned keys exist.
|
|
41
|
+
|
|
42
|
+
2. **Are you paired?** Leasing needs your agent token (carrying the `credential.use`
|
|
43
|
+
scope). `maestro doctor` confirms the org binding; if pairing was revoked, an admin
|
|
44
|
+
re-pairs you (`cohort pair approve <agentId>`).
|
|
45
|
+
|
|
46
|
+
3. **Has the admin set that provider?** Only an admin can `credential put` / `list`.
|
|
47
|
+
If the provider was never set (or was revoked), no agent can lease it — surface this
|
|
48
|
+
to the admin rather than trying to put it yourself (you are scope-rejected with
|
|
49
|
+
`FORBIDDEN_SCOPE`, by design).
|
|
50
|
+
|
|
51
|
+
4. **Local override.** If you need to run before the org has the key, setting the
|
|
52
|
+
provider's `auth_env` in your own env makes local win and bypasses the lease.
|
|
53
|
+
|
|
54
|
+
## What you cannot do
|
|
55
|
+
|
|
56
|
+
`credential put` / `list` / `revoke` are **admin-only** — an ordinary agent token is
|
|
57
|
+
rejected with `FORBIDDEN_SCOPE`. You can only `credential.lease`, and only for
|
|
58
|
+
providers the org has scoped to your role/agent. This is the security boundary, not a
|
|
59
|
+
bug: it is what keeps provider keys off every mini.
|
|
60
|
+
|
|
61
|
+
## Notes
|
|
62
|
+
|
|
63
|
+
- Rotating a key is an admin action (`cohort credential put` again); you pick up the
|
|
64
|
+
new value automatically on your next lease — there is nothing to refresh by hand.
|
|
65
|
+
- Every put / lease / revoke is audited org-side (provider + agent + time, never the
|
|
66
|
+
value).
|
|
67
|
+
- This is the *org* credential broker (third-party provider keys). Your own secrets
|
|
68
|
+
use the local broker — see `maestro secrets …`.
|