@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,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: decision-brief
|
|
3
|
+
description: Present a decision to the CEO with options, pros/cons, and a recommendation. Uses the decision recommendation template for structured decision-making.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Decision Brief
|
|
7
|
+
|
|
8
|
+
You are {{agent.fullName}}, {{agent.title}}. Present a structured decision for {{agent.principal.firstName}} to make.
|
|
9
|
+
|
|
10
|
+
## Required Inputs
|
|
11
|
+
|
|
12
|
+
When invoked, gather from the user (or infer from context):
|
|
13
|
+
|
|
14
|
+
- **Decision**: What needs to be decided?
|
|
15
|
+
- **Context**: Why is this decision needed now? What triggered it?
|
|
16
|
+
- **Constraints**: Timeline, budget, dependencies, regulatory requirements
|
|
17
|
+
- **Stakeholders**: Who is affected by this decision?
|
|
18
|
+
|
|
19
|
+
## Data Gathering
|
|
20
|
+
|
|
21
|
+
1. **Read relevant workstream files** from `memory/workstreams/` for domain context.
|
|
22
|
+
2. **Check prior decisions** in `memory/executive/decisions.md` for precedent or related choices.
|
|
23
|
+
3. **Read strategic priorities** from `memory/executive/priorities.md` to assess alignment.
|
|
24
|
+
4. **Check templates** in `templates/decision-brief.md` for the standard format.
|
|
25
|
+
5. **Gather any external data** relevant to the decision using available tools.
|
|
26
|
+
|
|
27
|
+
## Decision Brief Structure
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
# Decision Brief: [Short Title]
|
|
31
|
+
**Date**: [DATE]
|
|
32
|
+
**Decision Owner**: {{agent.principal.firstName}}
|
|
33
|
+
**Prepared by**: {{agent.fullName}}
|
|
34
|
+
**Urgency**: [Decide today / This week / Can wait]
|
|
35
|
+
|
|
36
|
+
## Context
|
|
37
|
+
[2-3 sentences: why this decision is needed now, what happens if we don't decide]
|
|
38
|
+
|
|
39
|
+
## Options
|
|
40
|
+
|
|
41
|
+
### Option A: [Name]
|
|
42
|
+
- **Description**: [What this option entails]
|
|
43
|
+
- **Pros**:
|
|
44
|
+
- [Pro 1]
|
|
45
|
+
- [Pro 2]
|
|
46
|
+
- **Cons**:
|
|
47
|
+
- [Con 1]
|
|
48
|
+
- [Con 2]
|
|
49
|
+
- **Cost/Effort**: [Estimate]
|
|
50
|
+
- **Risk Level**: [Low/Medium/High]
|
|
51
|
+
|
|
52
|
+
### Option B: [Name]
|
|
53
|
+
[Same structure]
|
|
54
|
+
|
|
55
|
+
### Option C: [Name] (if applicable)
|
|
56
|
+
[Same structure]
|
|
57
|
+
|
|
58
|
+
## Comparison Matrix
|
|
59
|
+
| Criteria | Option A | Option B | Option C |
|
|
60
|
+
|---|---|---|---|
|
|
61
|
+
| Strategic alignment | [H/M/L] | [H/M/L] | [H/M/L] |
|
|
62
|
+
| Speed to execution | [H/M/L] | [H/M/L] | [H/M/L] |
|
|
63
|
+
| Cost | [$] | [$] | [$] |
|
|
64
|
+
| Risk | [H/M/L] | [H/M/L] | [H/M/L] |
|
|
65
|
+
| Reversibility | [H/M/L] | [H/M/L] | [H/M/L] |
|
|
66
|
+
|
|
67
|
+
## {{agent.firstName}}'s Recommendation
|
|
68
|
+
**I recommend Option [X]** because [2-3 sentence rationale connecting to strategic priorities and current constraints].
|
|
69
|
+
|
|
70
|
+
**Key risk to mitigate**: [The biggest risk of this option and how to address it]
|
|
71
|
+
|
|
72
|
+
## Next Steps (if approved)
|
|
73
|
+
1. [Immediate action]
|
|
74
|
+
2. [Follow-up action]
|
|
75
|
+
3. [Communication needed]
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Output
|
|
79
|
+
|
|
80
|
+
1. Save to `outputs/decisions/decision-brief-[topic]-YYYY-MM-DD.md`.
|
|
81
|
+
2. Log the decision (once made) to `memory/executive/decisions.md` with date, choice, and rationale.
|
|
82
|
+
3. Present the brief in conversation and await {{agent.principal.firstName}}'s decision.
|
|
83
|
+
|
|
84
|
+
## Principles
|
|
85
|
+
|
|
86
|
+
- Always present at least 2 options (including "do nothing" if applicable).
|
|
87
|
+
- Be honest about tradeoffs — don't stack the deck for your recommendation.
|
|
88
|
+
- Make the recommendation clear and confident, but respect that the decision is {{agent.principal.firstName}}'s.
|
|
89
|
+
- Flag if this decision is reversible vs. one-way door.
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: directory-hygiene
|
|
3
|
+
description: Work the org Directory — search external people and organisations, read a record with its provenance, enrich channels from real traffic, and propose captures and duplicate merges into the human review queue. Use to look someone up, answer "who do we know at X", add an address you just learned, or clear the capture and duplicate queues.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Directory Hygiene
|
|
7
|
+
|
|
8
|
+
The Directory holds **external** people and organisations — clients, prospects,
|
|
9
|
+
partners, vendors, counsel, the people you actually correspond with. Colleagues
|
|
10
|
+
are not directory records; they live in the workforce, and the domain refuses to
|
|
11
|
+
archive one from here.
|
|
12
|
+
|
|
13
|
+
Two facts govern every call below. Neither is enforced client-side, so read them
|
|
14
|
+
before you act.
|
|
15
|
+
|
|
16
|
+
**Awareness.** A record set to NAMED awareness is **absent** for a seat without a
|
|
17
|
+
grant — not redacted, not refused, absent. It does not appear in search, lists,
|
|
18
|
+
`getPerson`, ask-grounding, or a vCard export. An empty result and a `NOT_FOUND`
|
|
19
|
+
are therefore legitimate answers, and you must never infer from them that a
|
|
20
|
+
person does not exist or tell someone "we have no record". Say what you can see;
|
|
21
|
+
if you have reason to think a record is restricted, `directory_request_awareness`
|
|
22
|
+
is the lane.
|
|
23
|
+
|
|
24
|
+
**You propose; humans dispose.** Agents read, enrich, and propose. Merge
|
|
25
|
+
execution, awareness changes, capture resolution and archives are human-gated in
|
|
26
|
+
the domain layer. Calling one files a review item instead of acting, or refuses
|
|
27
|
+
outright. That refusal is correct behaviour, not an error to work around.
|
|
28
|
+
|
|
29
|
+
All of it is `executeOrgTool`; frames are fail-open.
|
|
30
|
+
|
|
31
|
+
## Looking someone up
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
node --input-type=module -e '
|
|
35
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
36
|
+
const res = await executeOrgTool("directory_search", { q: "hartmann" });
|
|
37
|
+
for (const r of res.ok ? (res.result.results ?? res.result) : []) console.log(r.ref, r.displayName, r.organisation ?? "");
|
|
38
|
+
'
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
- `directory_get_person` — one record: channels with the provenance that proves
|
|
42
|
+
each one, when it was last verified, links across mail/calendar/books/CRM, the
|
|
43
|
+
steward, and the awareness state.
|
|
44
|
+
- `directory_get_org` — the organisation, its relationships, and its people.
|
|
45
|
+
- `directory_list_people` / `directory_list_orgs` — the People and Organisations
|
|
46
|
+
views: filter by relationship, organisation, awareness, list membership or free
|
|
47
|
+
text; `sort: "touch"` puts the recently-active first. Cursor-paginated.
|
|
48
|
+
- `directory_ask` — grounded Q&A. Returns `{content, grounding[], costCents,
|
|
49
|
+
auditId}`. **Always show the grounding rows and the cost.** Grounding is
|
|
50
|
+
awareness-scoped, so restricted records never reach the model.
|
|
51
|
+
|
|
52
|
+
## Enriching from real traffic
|
|
53
|
+
|
|
54
|
+
The Directory gets better by absorbing what already flowed past you — a signature
|
|
55
|
+
block, a meeting roster, a call transcript, a bank-feed counterparty.
|
|
56
|
+
|
|
57
|
+
- `directory_add_channel` — attach an email/phone/handle/URL **with its
|
|
58
|
+
provenance**. `verifiedFrom` (`SIGNATURE` | `CALL` | `MANUAL` | `IMPORT` |
|
|
59
|
+
`BANK_FEED`) is how the record knows the address is real. Re-adding a channel
|
|
60
|
+
that is already on the record with a fresh `verifiedFrom` is exactly how a
|
|
61
|
+
stale channel gets re-verified — that is the intended idiom, not a duplicate.
|
|
62
|
+
- `directory_update_person` — field edits. Send only what changed.
|
|
63
|
+
- `directory_create_person` — a record you know first-hand. If it came from
|
|
64
|
+
parsed traffic, propose a capture instead; the provenance is worth more than
|
|
65
|
+
the speed.
|
|
66
|
+
|
|
67
|
+
## The review queue — propose, never resolve
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
node --input-type=module -e '
|
|
71
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
72
|
+
const res = await executeOrgTool("directory_propose_capture", {
|
|
73
|
+
kind: "PERSON",
|
|
74
|
+
payload: { person: { displayName: "Dr. Lena Hartmann", email: "l.hartmann@example.de", title: "Head of Research" } },
|
|
75
|
+
source: "MAIL",
|
|
76
|
+
sourceRef: "msg_01H…",
|
|
77
|
+
sourceFingerprint: "sig:sha256:…",
|
|
78
|
+
confidence: 0.82,
|
|
79
|
+
});
|
|
80
|
+
console.log(res.ok ? res.result.captureId : res.error);
|
|
81
|
+
'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- `directory_propose_capture` — writes **no record**. It files a candidate with
|
|
85
|
+
its provenance line for a human to approve, edit-then-approve, or dismiss.
|
|
86
|
+
`sourceFingerprint` is the dedup key: a stable hash of the observation. Pass
|
|
87
|
+
one and re-proposing the same signature block every time you see it is free
|
|
88
|
+
and safe; omit one and you spam the queue.
|
|
89
|
+
- `directory_propose_merge` — flag two records as the same party. Put the reason
|
|
90
|
+
in `evidence` ( `{reason: "Same signature block, two addresses"}` ); the queue
|
|
91
|
+
prints it verbatim to whoever decides. Refs are `contact:<id>` /
|
|
92
|
+
`account:<id>`. This files a candidate; it does **not** merge.
|
|
93
|
+
- `directory_list_captures` / `directory_list_merges` — read the queues. Surface
|
|
94
|
+
what is waiting; report the counts and the evidence.
|
|
95
|
+
- `directory_request_awareness` — ask for a restricted record. The `reason` is
|
|
96
|
+
shown verbatim to the person deciding, so write it for them: what you are
|
|
97
|
+
working on and why the record is needed. Say what you need it for, not that
|
|
98
|
+
you need it.
|
|
99
|
+
|
|
100
|
+
## Human-only, by design
|
|
101
|
+
|
|
102
|
+
`directory.resolveCapture`, `directory.executeMerge`, `directory.revertMerge`,
|
|
103
|
+
`directory.setAwareness`, `directory.resolveAwarenessRequest`,
|
|
104
|
+
`directory.archivePerson` and `directory.archiveOrg` are human-gated. Do not
|
|
105
|
+
attempt them as an act of helpfulness — put the queue in front of the human
|
|
106
|
+
instead (counts, evidence, and what you would recommend).
|
|
107
|
+
|
|
108
|
+
## The long tail via `org_rpc`
|
|
109
|
+
|
|
110
|
+
`directory.listAwarenessRequests`, `directory.listLists`, `directory.createList`,
|
|
111
|
+
`directory.addToList`, `directory.removeFromList`, `directory.shareList`,
|
|
112
|
+
`directory.exportVcard`, `directory.linkParty` / `directory.unlinkParty`
|
|
113
|
+
(attach a party to a mail thread, meeting attendee, file share or bank-feed
|
|
114
|
+
line), `directory.createOrg` / `directory.updateOrg`,
|
|
115
|
+
`directory.removeChannel`, `directory.setPrimaryChannel`.
|
|
116
|
+
|
|
117
|
+
## Rules of the desk
|
|
118
|
+
|
|
119
|
+
- Provenance or it did not happen. Every channel you add carries where it came
|
|
120
|
+
from; an unsourced address is a guess wearing a record's clothes.
|
|
121
|
+
- Absence is not proof. Awareness-restricted records are invisible to you by
|
|
122
|
+
design — never report "we have no record of them" from an empty result.
|
|
123
|
+
- Propose in bulk, decide never. A clean queue is a human's work; a well-evidenced
|
|
124
|
+
queue is yours.
|
|
125
|
+
- Show the cost and the grounding on every `directory_ask`.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: draft-comms
|
|
3
|
+
description: "Draft a communication in the appropriate voice (agent, principal draft, or institutional). Takes: recipient, channel, purpose, key points. Applies communication governance rules. Never sends without approval for external recipients."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Draft Communications
|
|
7
|
+
|
|
8
|
+
You are {{agent.fullName}}, {{agent.title}}. Draft communications in the correct voice for the given context.
|
|
9
|
+
|
|
10
|
+
## Required Inputs
|
|
11
|
+
|
|
12
|
+
When invoked, gather from the user (or infer from context):
|
|
13
|
+
|
|
14
|
+
- **Recipient**: Who is this going to?
|
|
15
|
+
- **Channel**: Email, Slack, WhatsApp, formal letter, etc.
|
|
16
|
+
- **Purpose**: What is this communication trying to achieve?
|
|
17
|
+
- **Key points**: What must be included?
|
|
18
|
+
- **Voice**: Agent voice (default for internal ops), Principal draft (for principal-signed comms), or Institutional (for company-level comms)
|
|
19
|
+
|
|
20
|
+
## Voice Guidelines
|
|
21
|
+
|
|
22
|
+
Read `config/communication-governance.md` for full rules. Summary:
|
|
23
|
+
|
|
24
|
+
### Agent Voice (Internal Operations)
|
|
25
|
+
|
|
26
|
+
- Professional, warm, efficient
|
|
27
|
+
- "Hi [Name], following up on..." / "Quick update on..."
|
|
28
|
+
- Used for: scheduling, internal coordination, vendor management, routine follow-ups
|
|
29
|
+
|
|
30
|
+
### Principal Draft (CEO Communications)
|
|
31
|
+
|
|
32
|
+
- Authoritative but approachable
|
|
33
|
+
- Strategic framing, concise
|
|
34
|
+
- Used for: investor updates, partner outreach, board communications, key hire outreach
|
|
35
|
+
- **Always marked as DRAFT — requires {{agent.principal.firstName}}'s review and explicit send approval**
|
|
36
|
+
|
|
37
|
+
### Institutional Voice (Company Communications)
|
|
38
|
+
|
|
39
|
+
- Formal, precise, brand-aligned
|
|
40
|
+
- Used for: press, regulatory filings, official announcements
|
|
41
|
+
- **Always requires legal/compliance review flag**
|
|
42
|
+
|
|
43
|
+
## Communication Governance Rules
|
|
44
|
+
|
|
45
|
+
1. **External communications** — NEVER send without explicit CEO approval. Present draft and wait.
|
|
46
|
+
2. **Internal routine** — May send directly for scheduling, coordination, and acknowledged follow-ups.
|
|
47
|
+
3. **Investor/Board** — Always principal voice, always draft-only, always flag for review.
|
|
48
|
+
4. **Legal/Regulatory** — Flag for legal review before sending. Note any compliance implications.
|
|
49
|
+
5. **Sensitive topics** (compensation, termination, disputes) — Draft only, CEO + legal review.
|
|
50
|
+
|
|
51
|
+
## Process
|
|
52
|
+
|
|
53
|
+
1. Determine the correct voice based on recipient and purpose.
|
|
54
|
+
2. Check `config/contacts.md` for relationship context and any communication preferences.
|
|
55
|
+
3. Reference prior correspondence in `outputs/comms/` if this is a reply or follow-up.
|
|
56
|
+
4. Draft the communication with clear subject line (if email) and body.
|
|
57
|
+
5. Add governance flags as needed.
|
|
58
|
+
|
|
59
|
+
## Output Format
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
# Draft Communication
|
|
63
|
+
|
|
64
|
+
**To**: [Recipient]
|
|
65
|
+
**Channel**: [Email/Slack/etc.]
|
|
66
|
+
**Voice**: [Agent/Principal Draft/Institutional]
|
|
67
|
+
**Governance**: [Can send / Needs CEO approval / Needs legal review]
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
[Subject line if applicable]
|
|
72
|
+
|
|
73
|
+
[Body of communication]
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
**{{agent.firstName}}'s Notes**: [Any context, suggested timing, or caveats]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Output
|
|
81
|
+
|
|
82
|
+
1. Save draft to `outputs/comms/drafts/[recipient]-[date]-[topic].md`.
|
|
83
|
+
2. Present draft in conversation for review.
|
|
84
|
+
3. If approved for send and MCP tools available, use appropriate MCP to send.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: evening-wrap
|
|
3
|
+
description: Produce the Evening Wrap — what closed today, what didn't, open items carried forward, tomorrow's priorities. Use at end of day or when the principal asks for the wrap.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Evening Wrap
|
|
7
|
+
|
|
8
|
+
You are {{agent.fullName}}, {{agent.title}}. Produce the end-of-day Evening Wrap for {{agent.principal.firstName}}.
|
|
9
|
+
|
|
10
|
+
## Data Gathering
|
|
11
|
+
|
|
12
|
+
1. **Read today's morning brief** from `outputs/briefs/daily/morning-brief-latest.md` to compare planned vs actual.
|
|
13
|
+
2. **Check workstream updates** across `memory/workstreams/` for any status changes logged during the day.
|
|
14
|
+
3. **Review completed items** — scan `memory/executive/open-loops.md` for anything that was resolved today.
|
|
15
|
+
4. **Check communications log** — review any decisions made, emails sent, meetings held via `outputs/comms/` and calendar.
|
|
16
|
+
5. **Identify carried items** — anything from this morning's priorities that did not get addressed.
|
|
17
|
+
|
|
18
|
+
## Wrap Structure
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
# Evening Wrap — [DATE]
|
|
22
|
+
|
|
23
|
+
## Closed Today
|
|
24
|
+
- [Item completed, with outcome or result]
|
|
25
|
+
|
|
26
|
+
## Did Not Close (Carried Forward)
|
|
27
|
+
- [Item that was planned but not completed, with reason if known]
|
|
28
|
+
|
|
29
|
+
## Decisions Made
|
|
30
|
+
- [Any decisions logged today with brief context]
|
|
31
|
+
|
|
32
|
+
## Tomorrow's Top 3
|
|
33
|
+
- [Priority for tomorrow, seeded from today's carry-forwards and upcoming deadlines]
|
|
34
|
+
|
|
35
|
+
## Alerts / Emerging Issues
|
|
36
|
+
- [Anything new that surfaced today requiring attention tomorrow or this week]
|
|
37
|
+
|
|
38
|
+
## End-of-Day Status
|
|
39
|
+
| Workstream | Movement | Note |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| [domain] | [progressed/stalled/blocked] | [one-liner] |
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Output
|
|
45
|
+
|
|
46
|
+
1. Write the completed wrap to `outputs/briefs/daily/evening-wrap-YYYY-MM-DD.md`.
|
|
47
|
+
2. Also overwrite `outputs/briefs/daily/evening-wrap-latest.md` for quick access.
|
|
48
|
+
3. Update `memory/executive/open-loops.md` — remove closed items, add new carry-forwards.
|
|
49
|
+
4. Present the wrap directly in the conversation.
|
|
50
|
+
|
|
51
|
+
## Tone
|
|
52
|
+
|
|
53
|
+
Honest accounting. Don't sugarcoat what didn't happen. Tomorrow's priorities should feel actionable, not aspirational.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: files-find
|
|
3
|
+
description: Find, read, and write documents in the org's workspace drive — Docs, Sheets, Decks, folders, uploads — under the same VIEW/COMMENT/EDIT shares that govern humans. Use when asked to locate a file, pull a doc's content into context, draft or revise a workspace document, or share one with a person or channel.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Files — the Workspace Drive
|
|
7
|
+
|
|
8
|
+
The org drive is the shared filing plane: Docs (HTML), Sheets (cells + a shared
|
|
9
|
+
compute engine), Decks (ordered slides), folders, and registered binary uploads.
|
|
10
|
+
Agents obey exactly what they are granted — shares and ACLs (VIEW / COMMENT / EDIT)
|
|
11
|
+
gate agent calls the same way they gate the human UI, and every write appends a
|
|
12
|
+
chain event.
|
|
13
|
+
|
|
14
|
+
All of it is `executeOrgTool` over the files-desk tools; fail-open frames, never a
|
|
15
|
+
throw.
|
|
16
|
+
|
|
17
|
+
## Finding things
|
|
18
|
+
|
|
19
|
+
`files_list` is the drive listing with the human surface's filters:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
node --input-type=module -e '
|
|
23
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
24
|
+
const res = await executeOrgTool("files_list", { q: "Q3 plan", kind: "DOC", limit: 20 });
|
|
25
|
+
for (const f of res.ok ? res.result.files ?? res.result : []) console.log(f.id, f.kind, f.name);
|
|
26
|
+
'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Filters: `parentId` (folder scope), `kind` (`FOLDER|DOC|SHEET|DECK|PDF|IMAGE|FILE`),
|
|
30
|
+
`starred`, `byAgents`, free-text `q`, `deleted:true` (the 30-day recovery bin).
|
|
31
|
+
|
|
32
|
+
`files_get` returns one file with its shares and YOUR effective permission — check
|
|
33
|
+
it before promising an edit.
|
|
34
|
+
|
|
35
|
+
## Reading content
|
|
36
|
+
|
|
37
|
+
- `files_doc_read` — the doc's HEAD html + version.
|
|
38
|
+
- Sheets/decks ride the escape hatch: `org_rpc` `files.sheetRead` (raw cells +
|
|
39
|
+
computed values) / `files.deckRead` (ordered slides).
|
|
40
|
+
|
|
41
|
+
## Writing
|
|
42
|
+
|
|
43
|
+
- `files_create` — new Doc/Sheet/Deck/Folder owned by your seat.
|
|
44
|
+
- `files_doc_write` — write a doc revision (HEAD + a DocRevision row; requires
|
|
45
|
+
EDIT). Read-modify-write: fetch HEAD first, edit the html, write back.
|
|
46
|
+
- Long tail via `org_rpc`: `files.sheetWriteCells` (server recompute),
|
|
47
|
+
`files.deckWriteSlides` (replace the strip, or `append:true`), `files.rename`,
|
|
48
|
+
`files.move`, `files.duplicate`, `files.star`, `files.pin`, `files.delete` /
|
|
49
|
+
`files.recover` (soft delete, 30-day window), `files.uploadRegister`,
|
|
50
|
+
`files.exportRequest` (an AUDITED export intent — reads that land on the chain).
|
|
51
|
+
|
|
52
|
+
## Sharing
|
|
53
|
+
|
|
54
|
+
`files_share_grant` grants person / channel / email-invite access; folder grants
|
|
55
|
+
inherit to contents (INHERITED · REVOCABLE rows). Revoke via `org_rpc`
|
|
56
|
+
`files.shareRevoke`. Never widen access beyond what the task needs, and say who you
|
|
57
|
+
granted what.
|
|
58
|
+
|
|
59
|
+
## Rules of the desk
|
|
60
|
+
|
|
61
|
+
- Respect the ACL answer: a `FORBIDDEN` frame means the grant does not exist —
|
|
62
|
+
ask for the share, do not route around it.
|
|
63
|
+
- Cite files by id + name when you hand results to a human.
|
|
64
|
+
- Deletions are soft for 30 days; say so when you delete, and use `files.recover`
|
|
65
|
+
when someone deleted in error.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: generative-ui
|
|
3
|
+
description: Return interactive artifact cards in org conversations instead of plain text — catalog discovery, composing genui/v2 envelopes from the block vocabulary, streaming hydration, and acting on cards. Use when a reply benefits from structured, actionable UI (approvals, review grids, comparisons, forms), or when you need to invoke an action on a card someone posted.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Generative UI (artifact cards)
|
|
7
|
+
|
|
8
|
+
An **artifact** is an interactive card posted as a message into an org channel: a
|
|
9
|
+
`genui` envelope the Cohort app renders with real buttons, forms, and charts. It
|
|
10
|
+
obeys the **two-sided law** — every rendered button is equally invocable by an agent
|
|
11
|
+
via `artifact_act`, with the same params schema a human click sends. The org tools
|
|
12
|
+
for this are `artifact_create`, `artifact_act`, `artifact_get`, `artifact_list`, and
|
|
13
|
+
`artifact_catalog` — available in-session via the `cohort` MCP server, or from a
|
|
14
|
+
shell through `executeOrgTool` as below. Everything is **fail-open**: an unreachable
|
|
15
|
+
org or a pre-artifact SDK returns an error frame, never a throw.
|
|
16
|
+
|
|
17
|
+
## Text first — when NOT to send an artifact
|
|
18
|
+
|
|
19
|
+
Artifacts are for structure and action, not decoration. Answer in plain
|
|
20
|
+
`messaging_send` text when a sentence does the job:
|
|
21
|
+
|
|
22
|
+
- A yes/no answer, a single fact, a short status line → **text**.
|
|
23
|
+
- An artifact earns its place when the reply is (a) multi-field structured data,
|
|
24
|
+
(b) an action the reader should take (approve, pay, RSVP, claim), (c) a review of
|
|
25
|
+
several similar items, (d) a comparison between options, or (e) a form to fill.
|
|
26
|
+
- Never pad a card with filler stats to make it look substantial. If you only have
|
|
27
|
+
one number, say it in text.
|
|
28
|
+
|
|
29
|
+
## Discover the catalog first
|
|
30
|
+
|
|
31
|
+
`artifact_catalog` is where you discover the org's **native artifact classes** and
|
|
32
|
+
their action descriptors — class names, envelope versions, action names, and each
|
|
33
|
+
action's JSON-Schema params. Call it before composing a native-class card or acting
|
|
34
|
+
on one; compose a custom ad-hoc card only when no native class fits (see the
|
|
35
|
+
`native-artifacts` skill for the class-by-class guide).
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
node --input-type=module -e '
|
|
39
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
40
|
+
const res = await executeOrgTool("artifact_catalog", {});
|
|
41
|
+
console.log(JSON.stringify(res, null, 2));
|
|
42
|
+
'
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Result shape: `{version, classes:[{class, version, title, describe, actions:[{name,
|
|
46
|
+
label, kind, description?, params? (JSON Schema), confirm?, gate?, audience,
|
|
47
|
+
roles?}]}]}` — `describe` tells you when to use each class.
|
|
48
|
+
|
|
49
|
+
## The envelope (genui/v2)
|
|
50
|
+
|
|
51
|
+
`artifact_create` posts `{channelId, envelope, threadRootId?}` and returns
|
|
52
|
+
`{artifactId, messageId}`. The envelope:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"genui": "v2",
|
|
57
|
+
"artifact": {
|
|
58
|
+
"class": "ops.status",
|
|
59
|
+
"version": 1,
|
|
60
|
+
"state": "complete",
|
|
61
|
+
"source": { "kind": "native" },
|
|
62
|
+
"provenance": { "sources": [{ "label": "BOARD" }], "counts": { "tasks": 12 }, "generatedAt": "2026-07-24T09:00:00Z" },
|
|
63
|
+
"deepLink": "/board"
|
|
64
|
+
},
|
|
65
|
+
"actions": [
|
|
66
|
+
{ "name": "refresh", "label": "Refresh", "kind": "secondary", "audience": "both" }
|
|
67
|
+
],
|
|
68
|
+
"root": { "type": "card", "tone": "neutral", "title": "Board pulse", "blocks": [] }
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- `artifact.state`: `draft | streaming | complete | acted | expired | error`.
|
|
73
|
+
- `artifact.source`: `{kind:"native", surface?}` or `{kind:"plugin", plugin:{slug, domain}}`.
|
|
74
|
+
- `artifact.ttlAt` is for holds and quotes only — things that genuinely expire.
|
|
75
|
+
- `actions`: at most **12** descriptors; `kind` is `primary | secondary | ghost |
|
|
76
|
+
destructive`; `audience` is `both | human | agent` (an `agent`-audience action is
|
|
77
|
+
invocable by you even though humans never see the button).
|
|
78
|
+
- `root` is a v1-style card: `{type:"card", tone, title?, blocks:[…]}`.
|
|
79
|
+
- `genui/v1` (`{"genui":"v1", "root": card}`) remains valid for simple static cards —
|
|
80
|
+
reach for v2 whenever you need lifecycle, provenance, or envelope-level actions.
|
|
81
|
+
|
|
82
|
+
## Block vocabulary
|
|
83
|
+
|
|
84
|
+
`root.blocks` composes from this vocabulary (unknown block types degrade to a safe
|
|
85
|
+
fallback, so newer blocks never break older renderers):
|
|
86
|
+
|
|
87
|
+
| Block | Use for |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `text` | prose paragraph |
|
|
90
|
+
| `badge` | small status/label pill |
|
|
91
|
+
| `divider` | section separation |
|
|
92
|
+
| `entityHeader` | who/what the card is about — title, subtitle, avatar |
|
|
93
|
+
| `factRow` | one label: value line |
|
|
94
|
+
| `factGrid` | a grid of label: value pairs |
|
|
95
|
+
| `gallery` | a set of images |
|
|
96
|
+
| `table` | columnar data |
|
|
97
|
+
| `citations` | source links |
|
|
98
|
+
| `actions` | inline button row (references envelope action names) |
|
|
99
|
+
| `form` | input fields for a reply |
|
|
100
|
+
| `optionGroup` | radio/select choice set |
|
|
101
|
+
| `mediaTile` | one media preview tile |
|
|
102
|
+
| `metricTiles` | KPI tile row |
|
|
103
|
+
| `statusChip` | lifecycle/status chip |
|
|
104
|
+
| `confirmationRow` | post-action confirmation — who acted, when, outcome |
|
|
105
|
+
| `skeletonBlocks` | placeholders while streaming |
|
|
106
|
+
| `itemizedList` | line items (invoice rows, run items) |
|
|
107
|
+
| `comparisonList` | side-by-side option comparison |
|
|
108
|
+
| `personRow` | one person with avatar and role |
|
|
109
|
+
| `avatarStack` | compact overlapping avatars |
|
|
110
|
+
| `timelineSteps` | ordered progress steps |
|
|
111
|
+
| `recommendChip` | marks the AI-recommended option |
|
|
112
|
+
| `note` | callout/aside |
|
|
113
|
+
| `sparkline` | inline trend line |
|
|
114
|
+
| `miniBarChart` | small categorical bars |
|
|
115
|
+
| `diffBlock` | before/after diff |
|
|
116
|
+
|
|
117
|
+
## Visual laws
|
|
118
|
+
|
|
119
|
+
The renderer owns colour and type; your job is semantic discipline:
|
|
120
|
+
|
|
121
|
+
- **Moss green means running** — nothing else. Never use it as a success accent.
|
|
122
|
+
- **Amber is the AI accent** — AI-generated recommendations and held-for-approval
|
|
123
|
+
states. Do not scatter it.
|
|
124
|
+
- **At most one `recommendChip`** per artifact. A recommendation you cannot commit
|
|
125
|
+
to singular is not a recommendation.
|
|
126
|
+
- **Machine values render mono** — ids, hashes, amounts, timestamps. Put them in the
|
|
127
|
+
value slots (`factRow`, `metricTiles`), not in prose.
|
|
128
|
+
- **Provenance footer** on every artifact: fill `artifact.provenance`
|
|
129
|
+
(`sources:[{label}]`, `counts`, `costCents`, `generatedAt`) — the renderer shows a
|
|
130
|
+
`SOURCES · COUNTS · PROVIDER · $COST` footer from it.
|
|
131
|
+
- **No filler stats** — every number on the card must inform the decision at hand.
|
|
132
|
+
|
|
133
|
+
## Posting a card
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
node --input-type=module -e '
|
|
137
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
138
|
+
const envelope = {
|
|
139
|
+
genui: "v2",
|
|
140
|
+
artifact: {
|
|
141
|
+
class: "ops.status", version: 1, state: "complete",
|
|
142
|
+
source: { kind: "native" },
|
|
143
|
+
provenance: { sources: [{ label: "BOARD" }], generatedAt: new Date().toISOString() },
|
|
144
|
+
},
|
|
145
|
+
actions: [{ name: "refresh", label: "Refresh", kind: "secondary", audience: "both" }],
|
|
146
|
+
root: {
|
|
147
|
+
type: "card", tone: "neutral", title: "Board pulse",
|
|
148
|
+
blocks: [
|
|
149
|
+
{ type: "metricTiles", tiles: [{ label: "Ready", value: "4" }, { label: "Claimed", value: "2" }] },
|
|
150
|
+
{ type: "factRow", label: "Prepared by", value: "{{agent.fullName}}" },
|
|
151
|
+
{ type: "actions", refs: ["refresh"] },
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
const res = await executeOrgTool("artifact_create", { channelId: "CHANNEL_ID", envelope });
|
|
156
|
+
console.log(JSON.stringify(res)); // {ok:true, result:{artifactId, messageId}}
|
|
157
|
+
'
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
A `clientMsgId` is auto-minted for dedup; pass your own stable one if you might
|
|
161
|
+
retry the create.
|
|
162
|
+
|
|
163
|
+
## Streaming: skeleton → hydrate → complete
|
|
164
|
+
|
|
165
|
+
When the data behind a card is slow (a long retrieval, a batched computation), do
|
|
166
|
+
not block the conversation. Post the frame immediately, then hydrate:
|
|
167
|
+
|
|
168
|
+
1. `artifact_create` with `artifact.state: "streaming"` and `skeletonBlocks`
|
|
169
|
+
placeholders in `root.blocks`.
|
|
170
|
+
2. When results land, patch the full envelope in and transition the state
|
|
171
|
+
(`artifact.patch` — the authoring-side verb; use the `artifactPatch` ui-parity
|
|
172
|
+
wrapper, there is deliberately no curated patch tool):
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
node --input-type=module -e '
|
|
176
|
+
import { artifactPatch } from "./lib/org/ui-parity.mjs";
|
|
177
|
+
import { resolveOrgToolConfig } from "./lib/org/tool-surface.mjs";
|
|
178
|
+
const { base, token, orgId } = resolveOrgToolConfig({});
|
|
179
|
+
const res = await artifactPatch(
|
|
180
|
+
{ artifactId: "ART_ID", toState: "complete", envelope: { /* full hydrated envelope */ } },
|
|
181
|
+
{ base, token, orgId },
|
|
182
|
+
);
|
|
183
|
+
console.log(JSON.stringify(res)); // {ok:true}
|
|
184
|
+
'
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Never leave a card in `streaming` — if the retrieval fails, patch `toState:
|
|
188
|
+
"error"` so the reader is not staring at a permanent skeleton.
|
|
189
|
+
|
|
190
|
+
## Acting on artifacts
|
|
191
|
+
|
|
192
|
+
Invoke any action from a card's descriptors (or the catalog) with `artifact_act`,
|
|
193
|
+
addressing by `artifactId` or `messageId`:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
node --input-type=module -e '
|
|
197
|
+
import { executeOrgTool } from "./lib/org/tool-surface.mjs";
|
|
198
|
+
const res = await executeOrgTool("artifact_act", {
|
|
199
|
+
artifactId: "ART_ID",
|
|
200
|
+
action: "refresh",
|
|
201
|
+
params: {},
|
|
202
|
+
idempotencyKey: "refresh-ART_ID-2026-07-24",
|
|
203
|
+
});
|
|
204
|
+
console.log(JSON.stringify(res, null, 2));
|
|
205
|
+
'
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
- **Idempotency**: an `idempotencyKey` is auto-minted when absent, but pass a stable
|
|
209
|
+
key whenever you may retry — a repeated act with the same key returns
|
|
210
|
+
`{replay:true}` and the original outcome instead of running twice.
|
|
211
|
+
- **Approval-held**: a gated action returns a NORMAL result `{held:true,
|
|
212
|
+
approvalId}` (the card shows an amber held chip). Long-poll it with
|
|
213
|
+
`approval_wait`, and once approved re-invoke `artifact_act` with the **same**
|
|
214
|
+
`idempotencyKey` to consume the grant. A denial stays denied — do not shop for a
|
|
215
|
+
new key.
|
|
216
|
+
- Server-side enforcement is authoritative: `audience`/`roles` on the descriptor and
|
|
217
|
+
the org scope gate apply no matter which plane invoked the action.
|
|
218
|
+
|
|
219
|
+
## Notes
|
|
220
|
+
|
|
221
|
+
- Keep envelopes lean (48KB validation cap) — link out via `deepLink` instead of
|
|
222
|
+
inlining bulk.
|
|
223
|
+
- `artifact_get` re-reads one artifact (envelope, state, receipt); `artifact_list`
|
|
224
|
+
filters by `channelId` / `class` / `state`.
|
|
225
|
+
- Native domain cards (mail review, approvals, books runs, RSVPs …) are covered in
|
|
226
|
+
the `native-artifacts` skill.
|
|
227
|
+
- Prose inside cards follows the house voice (`policies/communication-style.md`):
|
|
228
|
+
plain, no filler openers, no emoji.
|