@synap-core/cli 1.10.0 → 1.12.2
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/README.md +23 -198
- package/dist/build-info.json +6 -0
- package/dist/commands/agent-run.js +3 -2
- package/dist/commands/agent-run.js.map +1 -1
- package/dist/commands/agents.d.ts +33 -17
- package/dist/commands/agents.js +203 -237
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/app.d.ts +143 -0
- package/dist/commands/app.js +523 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/automate.d.ts +21 -0
- package/dist/commands/automate.js +42 -0
- package/dist/commands/automate.js.map +1 -0
- package/dist/commands/automation-schema.test.d.ts +16 -0
- package/dist/commands/automation-schema.test.js +77 -0
- package/dist/commands/automation-schema.test.js.map +1 -0
- package/dist/commands/automation.d.ts +12 -0
- package/dist/commands/automation.js +80 -35
- package/dist/commands/automation.js.map +1 -1
- package/dist/commands/bridge-setup.d.ts +14 -1
- package/dist/commands/bridge-setup.js +392 -128
- package/dist/commands/bridge-setup.js.map +1 -1
- package/dist/commands/cap-connections.d.ts +4 -4
- package/dist/commands/cap-connections.js +14 -14
- package/dist/commands/cap-connections.js.map +1 -1
- package/dist/commands/capability.d.ts +2 -0
- package/dist/commands/capability.js +297 -176
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/catalog.d.ts +275 -0
- package/dist/commands/catalog.js +481 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/cell.d.ts +155 -8
- package/dist/commands/cell.js +416 -40
- package/dist/commands/cell.js.map +1 -1
- package/dist/commands/centrality.js +3 -14
- package/dist/commands/centrality.js.map +1 -1
- package/dist/commands/connect.d.ts +38 -13
- package/dist/commands/connect.js +68 -167
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.d.ts +3 -2
- package/dist/commands/connections.js +95 -25
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/context.js +9 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +34 -0
- package/dist/commands/data-extra.js +198 -25
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.d.ts +120 -2
- package/dist/commands/data.js +307 -24
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +66 -4
- package/dist/commands/diagnose.js +329 -29
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/digest.js +2 -1
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/doc.d.ts +25 -4
- package/dist/commands/doc.js +100 -18
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +130 -0
- package/dist/commands/doctor.js +814 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.js +3 -1
- package/dist/commands/events.js.map +1 -1
- package/dist/commands/explain.js +5 -5
- package/dist/commands/explain.js.map +1 -1
- package/dist/commands/graph.js +5 -3
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import.d.ts +368 -13
- package/dist/commands/import.js +1096 -55
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/init.d.ts +20 -9
- package/dist/commands/init.js +433 -973
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +1 -0
- package/dist/commands/keys.js +15 -2
- package/dist/commands/keys.js.map +1 -1
- package/dist/commands/knowledge.d.ts +28 -6
- package/dist/commands/knowledge.js +358 -73
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.js +2 -2
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/lens.d.ts +37 -1
- package/dist/commands/lens.js +193 -72
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +72 -0
- package/dist/commands/market-authoring.js +566 -0
- package/dist/commands/market-authoring.js.map +1 -0
- package/dist/commands/market-official.d.ts +58 -0
- package/dist/commands/market-official.js +84 -0
- package/dist/commands/market-official.js.map +1 -0
- package/dist/commands/market.d.ts +419 -20
- package/dist/commands/market.js +2124 -193
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +70 -13
- package/dist/commands/mcp.js +308 -40
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/open.d.ts +39 -9
- package/dist/commands/open.js +80 -25
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/playbook.d.ts +42 -0
- package/dist/commands/playbook.js +162 -0
- package/dist/commands/playbook.js.map +1 -0
- package/dist/commands/pod.js +1 -1
- package/dist/commands/pod.js.map +1 -1
- package/dist/commands/pods.d.ts +19 -0
- package/dist/commands/pods.js +220 -85
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +62 -0
- package/dist/commands/proposals-actions.js +146 -8
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/proposals-await.d.ts +68 -0
- package/dist/commands/proposals-await.js +248 -0
- package/dist/commands/proposals-await.js.map +1 -0
- package/dist/commands/proton-setup.d.ts +73 -0
- package/dist/commands/proton-setup.js +577 -0
- package/dist/commands/proton-setup.js.map +1 -0
- package/dist/commands/providers.d.ts +23 -0
- package/dist/commands/providers.js +126 -1
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/raycast.js +6 -2
- package/dist/commands/raycast.js.map +1 -1
- package/dist/commands/rule.d.ts +150 -0
- package/dist/commands/rule.js +447 -0
- package/dist/commands/rule.js.map +1 -0
- package/dist/commands/session-wait.d.ts +111 -0
- package/dist/commands/session-wait.js +209 -0
- package/dist/commands/session-wait.js.map +1 -0
- package/dist/commands/sessions.d.ts +52 -0
- package/dist/commands/sessions.js +479 -58
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +136 -19
- package/dist/commands/skill-manage.js.map +1 -1
- package/dist/commands/skills.js +19 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +1 -4
- package/dist/commands/status.js +5 -34
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.backoff.test.d.ts +13 -0
- package/dist/commands/statusline.backoff.test.js +100 -0
- package/dist/commands/statusline.backoff.test.js.map +1 -0
- package/dist/commands/statusline.js +16 -9
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/sync-status.d.ts +12 -0
- package/dist/commands/sync-status.js +125 -0
- package/dist/commands/sync-status.js.map +1 -0
- package/dist/commands/templates-retire.d.ts +34 -0
- package/dist/commands/templates-retire.js +192 -0
- package/dist/commands/templates-retire.js.map +1 -0
- package/dist/commands/tools.js +6 -21
- package/dist/commands/tools.js.map +1 -1
- package/dist/commands/tracks.d.ts +51 -0
- package/dist/commands/tracks.js +291 -0
- package/dist/commands/tracks.js.map +1 -0
- package/dist/commands/update.d.ts +3 -11
- package/dist/commands/update.js +5 -134
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upload.d.ts +68 -0
- package/dist/commands/upload.js +257 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/vendor.d.ts +28 -0
- package/dist/commands/vendor.js +110 -0
- package/dist/commands/vendor.js.map +1 -0
- package/dist/commands/versions.js +6 -0
- package/dist/commands/versions.js.map +1 -1
- package/dist/commands/view.js +10 -5
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/whoami.d.ts +23 -3
- package/dist/commands/whoami.js +169 -23
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/worker.d.ts +122 -0
- package/dist/commands/worker.js +435 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/commands/worker.test.d.ts +1 -0
- package/dist/commands/worker.test.js +116 -0
- package/dist/commands/worker.test.js.map +1 -0
- package/dist/commands/workspace-ops.d.ts +35 -0
- package/dist/commands/workspace-ops.js +153 -0
- package/dist/commands/workspace-ops.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +1009 -171
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-connections.d.ts +31 -0
- package/dist/lib/agent-connections.js +33 -0
- package/dist/lib/agent-connections.js.map +1 -0
- package/dist/lib/agent-detect.d.ts +27 -0
- package/dist/lib/agent-detect.js +71 -0
- package/dist/lib/agent-detect.js.map +1 -0
- package/dist/lib/agent-door.d.ts +138 -0
- package/dist/lib/agent-door.js +426 -0
- package/dist/lib/agent-door.js.map +1 -0
- package/dist/lib/agents-config.d.ts +2 -0
- package/dist/lib/agents-config.js +4 -9
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +31 -2
- package/dist/lib/approval-poll.js +20 -7
- package/dist/lib/approval-poll.js.map +1 -1
- package/dist/lib/atomic-file.d.ts +48 -0
- package/dist/lib/atomic-file.js +129 -0
- package/dist/lib/atomic-file.js.map +1 -0
- package/dist/lib/auth.d.ts +14 -9
- package/dist/lib/auth.js +44 -61
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/batch-approval.d.ts +85 -0
- package/dist/lib/batch-approval.js +170 -0
- package/dist/lib/batch-approval.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +6 -5
- package/dist/lib/capture-lane.js +11 -8
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +342 -0
- package/dist/lib/capture-structure.js +295 -0
- package/dist/lib/capture-structure.js.map +1 -0
- package/dist/lib/catalog-templates.d.ts +59 -0
- package/dist/lib/catalog-templates.js +126 -0
- package/dist/lib/catalog-templates.js.map +1 -0
- package/dist/lib/cli-build.d.ts +19 -0
- package/dist/lib/cli-build.js +37 -0
- package/dist/lib/cli-build.js.map +1 -0
- package/dist/lib/conversation-headers.d.ts +18 -0
- package/dist/lib/conversation-headers.js +32 -0
- package/dist/lib/conversation-headers.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +216 -4
- package/dist/lib/cp-packages.js +414 -11
- package/dist/lib/cp-packages.js.map +1 -1
- package/dist/lib/credential-class.d.ts +117 -0
- package/dist/lib/credential-class.js +116 -0
- package/dist/lib/credential-class.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +35 -0
- package/dist/lib/describe-lens.js +40 -0
- package/dist/lib/describe-lens.js.map +1 -1
- package/dist/lib/device-connect.d.ts +125 -0
- package/dist/lib/device-connect.js +256 -0
- package/dist/lib/device-connect.js.map +1 -0
- package/dist/lib/directory-lens.d.ts +99 -0
- package/dist/lib/directory-lens.js +187 -0
- package/dist/lib/directory-lens.js.map +1 -0
- package/dist/lib/exporter-coverage.d.ts +71 -0
- package/dist/lib/exporter-coverage.js +97 -0
- package/dist/lib/exporter-coverage.js.map +1 -0
- package/dist/lib/hub-client.d.ts +43 -9
- package/dist/lib/hub-client.js +429 -65
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/id.d.ts +23 -0
- package/dist/lib/id.js +35 -0
- package/dist/lib/id.js.map +1 -0
- package/dist/lib/init-connect.d.ts +41 -0
- package/dist/lib/init-connect.js +75 -0
- package/dist/lib/init-connect.js.map +1 -0
- package/dist/lib/init-exit.d.ts +24 -0
- package/dist/lib/init-exit.js +41 -0
- package/dist/lib/init-exit.js.map +1 -0
- package/dist/lib/init-flow.d.ts +25 -0
- package/dist/lib/init-flow.js +40 -0
- package/dist/lib/init-flow.js.map +1 -0
- package/dist/lib/init-handoff.d.ts +16 -0
- package/dist/lib/init-handoff.js +19 -0
- package/dist/lib/init-handoff.js.map +1 -0
- package/dist/lib/init-output.d.ts +18 -0
- package/dist/lib/init-output.js +43 -0
- package/dist/lib/init-output.js.map +1 -0
- package/dist/lib/init-pod.d.ts +45 -0
- package/dist/lib/init-pod.js +36 -0
- package/dist/lib/init-pod.js.map +1 -0
- package/dist/lib/installed.d.ts +210 -11
- package/dist/lib/installed.js +234 -36
- package/dist/lib/installed.js.map +1 -1
- package/dist/lib/key-approval.d.ts +57 -0
- package/dist/lib/key-approval.js +117 -0
- package/dist/lib/key-approval.js.map +1 -0
- package/dist/lib/key-diagnosis.d.ts +56 -0
- package/dist/lib/key-diagnosis.js +227 -0
- package/dist/lib/key-diagnosis.js.map +1 -0
- package/dist/lib/key-doctor.d.ts +136 -0
- package/dist/lib/key-doctor.js +286 -0
- package/dist/lib/key-doctor.js.map +1 -0
- package/dist/lib/key-locations.d.ts +120 -0
- package/dist/lib/key-locations.js +326 -0
- package/dist/lib/key-locations.js.map +1 -0
- package/dist/lib/key-source.d.ts +66 -0
- package/dist/lib/key-source.js +106 -0
- package/dist/lib/key-source.js.map +1 -0
- package/dist/lib/key-state.d.ts +70 -0
- package/dist/lib/key-state.js +115 -0
- package/dist/lib/key-state.js.map +1 -0
- package/dist/lib/kind-package.d.ts +181 -0
- package/dist/lib/kind-package.js +679 -0
- package/dist/lib/kind-package.js.map +1 -0
- package/dist/lib/knowledge-title.d.ts +24 -0
- package/dist/lib/knowledge-title.js +46 -0
- package/dist/lib/knowledge-title.js.map +1 -0
- package/dist/lib/knowledge-title.test.d.ts +1 -0
- package/dist/lib/knowledge-title.test.js +34 -0
- package/dist/lib/knowledge-title.test.js.map +1 -0
- package/dist/lib/machine-instance.d.ts +64 -0
- package/dist/lib/machine-instance.js +142 -0
- package/dist/lib/machine-instance.js.map +1 -0
- package/dist/lib/mcp-bridge.d.ts +42 -0
- package/dist/lib/mcp-bridge.js +147 -0
- package/dist/lib/mcp-bridge.js.map +1 -0
- package/dist/lib/mcp-bridge.test.d.ts +1 -0
- package/dist/lib/mcp-bridge.test.js +90 -0
- package/dist/lib/mcp-bridge.test.js.map +1 -0
- package/dist/lib/mcp-call.d.ts +30 -0
- package/dist/lib/mcp-call.js +107 -0
- package/dist/lib/mcp-call.js.map +1 -0
- package/dist/lib/mcp-snippets.d.ts +53 -0
- package/dist/lib/mcp-snippets.js +82 -0
- package/dist/lib/mcp-snippets.js.map +1 -0
- package/dist/lib/next-steps.d.ts +8 -0
- package/dist/lib/next-steps.js +31 -1
- package/dist/lib/next-steps.js.map +1 -1
- package/dist/lib/package-wire.d.ts +179 -0
- package/dist/lib/package-wire.js +68 -0
- package/dist/lib/package-wire.js.map +1 -0
- package/dist/lib/pair-link.d.ts +38 -0
- package/dist/lib/pair-link.js +68 -0
- package/dist/lib/pair-link.js.map +1 -0
- package/dist/lib/pod-wide.d.ts +40 -0
- package/dist/lib/pod-wide.js +46 -0
- package/dist/lib/pod-wide.js.map +1 -0
- package/dist/lib/pod.d.ts +119 -115
- package/dist/lib/pod.js +206 -412
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +9 -3
- package/dist/lib/project-ref.js +10 -4
- package/dist/lib/project-ref.js.map +1 -1
- package/dist/lib/review-credential.d.ts +119 -0
- package/dist/lib/review-credential.js +147 -0
- package/dist/lib/review-credential.js.map +1 -0
- package/dist/lib/safe-open.d.ts +49 -0
- package/dist/lib/safe-open.js +119 -0
- package/dist/lib/safe-open.js.map +1 -0
- package/dist/lib/session-lens.d.ts +40 -1
- package/dist/lib/session-lens.js +54 -4
- package/dist/lib/session-lens.js.map +1 -1
- package/dist/lib/superwhisper-import.d.ts +8 -0
- package/dist/lib/superwhisper-import.js +14 -7
- package/dist/lib/superwhisper-import.js.map +1 -1
- package/dist/lib/superwhisper-title.test.d.ts +1 -0
- package/dist/lib/superwhisper-title.test.js +18 -0
- package/dist/lib/superwhisper-title.test.js.map +1 -0
- package/dist/lib/targets.d.ts +134 -10
- package/dist/lib/targets.js +962 -258
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-file.d.ts +78 -0
- package/dist/lib/template-file.js +140 -0
- package/dist/lib/template-file.js.map +1 -0
- package/dist/lib/template-lifecycle.d.ts +217 -0
- package/dist/lib/template-lifecycle.js +433 -0
- package/dist/lib/template-lifecycle.js.map +1 -0
- package/dist/lib/template-steps.d.ts +88 -0
- package/dist/lib/template-steps.js +118 -0
- package/dist/lib/template-steps.js.map +1 -0
- package/dist/lib/time-ago.d.ts +2 -0
- package/dist/lib/time-ago.js +15 -0
- package/dist/lib/time-ago.js.map +1 -0
- package/dist/utils/logger.js +5 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +25 -18
- package/skills/README.md +12 -10
- package/skills/agent-os/SKILL.md +220 -99
- package/skills/manifest.json +2 -2
- package/skills/onboard/SKILL.md +61 -25
- package/skills/synap/README.md +5 -8
- package/skills/synap/SKILL.md +1185 -301
- package/skills/synap/_order.txt +7 -0
- package/skills/synap/_skill.yaml +1 -1
- package/skills/synap/automations.md +15 -0
- package/skills/synap/capture.md +54 -151
- package/skills/synap/cli-operations.md +24 -18
- package/skills/synap/common-mistakes.md +1 -0
- package/skills/synap/concepts.md +28 -0
- package/skills/synap/content-os.md +92 -0
- package/skills/synap/creative-loop.md +15 -10
- package/skills/synap/crm.md +21 -52
- package/skills/synap/digesting-a-channel.md +25 -0
- package/skills/synap/document-embeds.md +141 -47
- package/skills/synap/escalation-ladder.md +20 -10
- package/skills/synap/focus-sessions.md +47 -21
- package/skills/synap/from-intent.md +142 -0
- package/skills/synap/governance-rules.md +4 -4
- package/skills/synap/governance.md +10 -7
- package/skills/synap/hand-off.md +33 -0
- package/skills/synap/inline-patterns.md +15 -7
- package/skills/synap/lenses.md +33 -15
- package/skills/synap/linking.md +41 -40
- package/skills/synap/mcp-remote-servers.md +64 -0
- package/skills/synap/mental-model.md +24 -22
- package/skills/synap/multi-entity-capture.md +6 -4
- package/skills/synap/operating-mode-rules.md +1 -1
- package/skills/synap/processes.md +118 -0
- package/skills/synap/quick-reference.md +5 -1
- package/skills/synap/reading.md +3 -1
- package/skills/synap/reflexes.md +12 -42
- package/skills/synap/viewframe-cells.md +38 -5
- package/skills/synap/work-flow.md +1 -1
- package/skills/synap/work-model.md +96 -0
- package/skills/synap/worked-examples.md +21 -1
- package/skills/synap/workspace-design.md +14 -10
- package/skills/synap/writes.md +165 -35
- package/skills/synap/writing-titles.md +63 -0
- package/skills/synap-app/SKILL.md +319 -0
- package/skills/synap-app/_order.txt +5 -0
- package/skills/synap-app/_skill.yaml +20 -0
- package/skills/synap-app/creating-the-base-app.md +64 -0
- package/skills/synap-app/governance.md +42 -0
- package/skills/synap-app/install-commands.md +55 -0
- package/skills/synap-app/overview.md +50 -0
- package/skills/synap-app/using-the-sdk.md +73 -0
- package/skills/synap-design/SKILL.md +474 -0
- package/skills/synap-design/_order.txt +4 -0
- package/skills/synap-design/_skill.yaml +21 -0
- package/skills/synap-design/loop.md +134 -0
- package/skills/synap-design/overview.md +44 -0
- package/skills/synap-design/principles.md +130 -0
- package/skills/synap-design/system.md +133 -0
- package/skills/synap-market/SKILL.md +625 -0
- package/skills/synap-market/_order.txt +5 -0
- package/skills/synap-market/_skill.yaml +24 -0
- package/skills/synap-market/author-and-publish.md +212 -0
- package/skills/synap-market/discover-and-fetch.md +59 -0
- package/skills/synap-market/governance-and-catalog.md +63 -0
- package/skills/synap-market/install.md +133 -0
- package/skills/synap-market/overview.md +119 -0
- package/skills/synap-schema/SKILL.md +172 -10
- package/skills/synap-schema/_order.txt +2 -0
- package/skills/synap-schema/_skill.yaml +4 -2
- package/skills/synap-schema/common-mistakes.md +4 -2
- package/skills/synap-schema/discover-profiles.md +1 -1
- package/skills/synap-schema/entity-scope.md +15 -3
- package/skills/synap-schema/extend-first.md +29 -0
- package/skills/synap-schema/extend-vs-create.md +1 -1
- package/skills/synap-schema/intent-vocabulary-ssot.md +111 -0
- package/skills/synap-schema/property-types.md +1 -1
- package/skills/synap-schema/relations.md +1 -1
- package/skills/synap-ui/SKILL.md +19 -12
- package/skills/synap-ui/_skill.yaml +1 -1
- package/skills/synap-ui/ai-companion.md +1 -1
- package/skills/synap-ui/arranging-bento.md +2 -0
- package/skills/synap-ui/bento-layouts.md +10 -10
- package/skills/synap-ui/bento-recipes.md +313 -543
- package/skills/synap-ui/four-builds.md +5 -0
- package/skills/synap-ui/view-types.md +2 -2
- package/skills/synap-ui/widget-catalog.md +22 -278
- package/templates/automations/bookmark-enrichment.automation.json +290 -13
- package/templates/automations/url-bookmark-capture.automation.json +73 -11
- package/templates/skills/authoring-playbooks/SKILL.md +6 -3
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +15 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +3 -0
- package/dist/commands/infra.d.ts +0 -21
- package/dist/commands/infra.js +0 -262
- package/dist/commands/infra.js.map +0 -1
- package/dist/lib/browser-auth.d.ts +0 -35
- package/dist/lib/browser-auth.js +0 -170
- package/dist/lib/browser-auth.js.map +0 -1
- package/dist/lib/openclaw.d.ts +0 -32
- package/dist/lib/openclaw.js +0 -164
- package/dist/lib/openclaw.js.map +0 -1
- package/dist/lib/seed.d.ts +0 -13
- package/dist/lib/seed.js +0 -135
- package/dist/lib/seed.js.map +0 -1
|
@@ -6,15 +6,15 @@ Synap is a typed knowledge graph. **Reading is one verb (`synap ask`) — it rou
|
|
|
6
6
|
|
|
7
7
|
Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchpad** — structuring knowledge into a real lane IS your job. Never write a `note` (that's the human's raw inbox); always `capture` into a lane.
|
|
8
8
|
|
|
9
|
-
**Known fields → typed create.** If you already know the profileSlug and
|
|
9
|
+
**Known fields → typed create.** If you already know the profileSlug and values, use `synap create entity` / `synap_create_entity`. Reach for free-text `capture "…"` only for an unstructured blob you haven't parsed — it runs an AI pipeline that can degrade to one flat `note`. 'Always capture into a lane' means _don't leave it unstructured_, not _always use the free-text pipeline_.
|
|
10
10
|
|
|
11
|
-
| If it…
|
|
12
|
-
|
|
|
13
|
-
| **is about the CURRENT WORK** —
|
|
14
|
-
| **is GLOBAL truth** — a best-practice / runbook / how-to that holds across ALL projects
|
|
15
|
-
| **is about the USER** — how they work/talk/decide, their preferences, their life
|
|
11
|
+
| If it… | Lane | Where it goes | Governance |
|
|
12
|
+
| --------------------------------------------------------------------------------------------- | -------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| **is about the CURRENT WORK** — a reusable conclusion or caveat in the project/task you're on | **Work** _(default)_ | a `knowledge` entity through server-derived Work placement (pin with `--workspace` only when you know the domain) | proposal-gated (it's the user's real data; the workspace IS the domain — Builder ≠ marketing) |
|
|
14
|
+
| **is GLOBAL truth** — a best-practice / runbook / how-to that holds across ALL projects | **Global** | pod-wide procedural `knowledge_keys` (`synap capture --global --type … [--key ns:slug]`) | reviewed for shared truth |
|
|
15
|
+
| **is about the USER** — how they work/talk/decide, their preferences, their life | **User** | pod-wide `user_observation` (`synap observe write` / `record_observation` tool) | inferences are **proposed** (you review); explicit "I always X" auto-saves — never model the user silently |
|
|
16
16
|
|
|
17
|
-
> **Why this matters:** writing to the wrong lane degrades the graph. A
|
|
17
|
+
> **Why this matters:** writing to the wrong lane degrades the graph. A caution you learned about the **current project** is **Work** (let the server route it, or pin the known domain explicitly). A best-practice that holds **everywhere** is **Global** (`--global`, pod-wide). A fact about **how the user works** is **User** (pod-wide, inferences proposed). `synap capture` echoes which lane + governance it used; check it.
|
|
18
18
|
|
|
19
19
|
> **Read the write outcome — it guides your next move (it never blocks you).** Every write (`capture`, `observe`, `create entity`, `create relation`, `note`) reports one of two outcomes (and `--json` carries `"outcome"`):
|
|
20
20
|
>
|
|
@@ -23,23 +23,25 @@ Ask yourself: _who does this knowledge serve?_ **There is no private AI scratchp
|
|
|
23
23
|
|
|
24
24
|
> **Substrate names (tables under the hood):** _semantic_ = `entities` (the `knowledge` profile, workspace-scoped = domain separation), _episodic_ = `knowledge_facts`, _procedural_ = `knowledge_keys` (pod-wide runbooks). `ask` queries across them so you never pick on read.
|
|
25
25
|
|
|
26
|
+
**Facets (roles)** are hats on **any kind** (`applicableKinds`), not only person/company. “This item is an X” is `attach_facet`, not a new kind, until X has its own life. Widen the role when `kind_mismatch`. See `from-intent` + `extend-first`. What role, workspace, project, track and template mean: `concepts` (the one glossary).
|
|
27
|
+
|
|
26
28
|
### Data layers — the graph itself
|
|
27
29
|
|
|
28
|
-
| Layer | What it is
|
|
29
|
-
| ------------- |
|
|
30
|
-
| **Entities** | Typed structured nodes (task, person, …)
|
|
31
|
-
| **Relations** | Typed edges between entities
|
|
32
|
-
| **Documents** | Long-form
|
|
33
|
-
| **Threads** | Channel conversations, optional entity context
|
|
34
|
-
| **Proposals** | Writes queued for human approval
|
|
30
|
+
| Layer | What it is | When to use |
|
|
31
|
+
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
|
|
32
|
+
| **Entities** | Typed structured nodes (task, person, …) | Anything worth filtering, sorting, or linking |
|
|
33
|
+
| **Relations** | Typed edges between entities | Making the graph traversable |
|
|
34
|
+
| **Documents** | Long-form versioned body attached to an entity — auto-materialized from an entity's `content`, or created standalone via `synap_create_document` | Meeting notes, research writeups, articles — **never** a `file`/`document`-kind entity for text you authored |
|
|
35
|
+
| **Threads** | Channel conversations, optional entity context | Posting to the user's personal AI channel |
|
|
36
|
+
| **Proposals** | Writes queued for human approval | Governance for some mutations (not an error — see below) |
|
|
35
37
|
|
|
36
38
|
### Key profiles for AI use
|
|
37
39
|
|
|
38
|
-
| Profile slug | Scope | Who writes | Purpose
|
|
39
|
-
| ------------------ | --------- | -------------- |
|
|
40
|
-
| `note` | pod | **human only** | The human's raw "dump now, structure later" inbox. **The AI never writes a note** — structuring into a lane is its job; use `capture` instead.
|
|
41
|
-
| `knowledge` | workspace | AI |
|
|
42
|
-
| `user_observation` | pod | AI only | Durable user model — habits, communication style, preferences
|
|
43
|
-
| `decision` | pod | human + AI | Architectural decisions with rationale
|
|
44
|
-
| `research` | pod | AI | Investigation with sources + conclusion
|
|
45
|
-
| `question` | pod | human + AI | Open inquiry, closed when a decision answers it
|
|
40
|
+
| Profile slug | Scope | Who writes | Purpose |
|
|
41
|
+
| ------------------ | --------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
42
|
+
| `note` | pod | **human only** | The human's raw "dump now, structure later" inbox. **The AI never writes a note** — structuring into a lane is its job; use `capture` instead. |
|
|
43
|
+
| `knowledge` | workspace | AI | Reusable **Insights** and **Cautions** — one required `knowledgeForm`; an optional `ek_claim` is only a compact summary and long form belongs in the linked Markdown document. Decisions and sources remain linked first-class entities. DOMAIN = the workspace. Cross-project runbooks go to `knowledge_keys` via `--global`. |
|
|
44
|
+
| `user_observation` | pod | AI only | Durable user model — habits, communication style, preferences |
|
|
45
|
+
| `decision` | pod | human + AI | Architectural decisions with rationale |
|
|
46
|
+
| `research` | pod | AI | Investigation with sources + conclusion |
|
|
47
|
+
| `question` | pod | human + AI | Open inquiry, closed when a decision answers it |
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
## Multi-entity capture from free-form text
|
|
2
2
|
|
|
3
|
-
When the user pastes a block of unstructured content (a meeting transcript, an email, a LinkedIn bio),
|
|
3
|
+
When the user pastes a block of unstructured content (a meeting transcript, an email, a LinkedIn bio) or when several related things come up at once, send it through the **one capture door** — `synap_capture` (CLI: `synap capture`). Don't chain manual creates, and don't run a two-step "structure then commit" dance.
|
|
4
|
+
|
|
5
|
+
The payload is a gradient in a single call:
|
|
4
6
|
|
|
5
7
|
```
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
{ "text": "…paste the raw content…" } → the AI structures it into entities
|
|
9
|
+
{ "entities": [ … ], "relations": [ … ] } → you supply the graph directly (refs link them)
|
|
8
10
|
```
|
|
9
11
|
|
|
10
|
-
|
|
12
|
+
Everything lands as ONE reviewable proposal (or auto-applies when every op is safe), and you get back one receipt — `status: "applied" | "proposed" | "rejected"`. `proposed` is success: surface the review link. There is no separate commit step. Read **`capture.md`** for the full flow, dedup signals, name-refs, and reject reasons.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
## Synap-first operating mode
|
|
2
2
|
|
|
3
|
-
> **MCP clients** (Claude Desktop, Raycast,
|
|
3
|
+
> **MCP clients** (Claude Desktop, Raycast, any agent with MCP): use `synap_*` tool names — they wrap auth and governance automatically. **REST / HTTP clients**: use the endpoints below.
|
|
4
4
|
|
|
5
5
|
These five rules override default assistant behavior when connected to a Synap pod:
|
|
6
6
|
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Processes — a playbook that follows a kind's lifecycle
|
|
2
|
+
|
|
3
|
+
<!-- brief:start -->
|
|
4
|
+
|
|
5
|
+
A process = `synap_create_playbook` with `subjectProfileSlug`; it FOLLOWS the
|
|
6
|
+
lifecycle the kind or role declares (omit `statusProperty`, or name that same
|
|
7
|
+
property). Each stage's `subjectStatus` is an EXISTING option of it (read it
|
|
8
|
+
with `synap_list_profiles` first — never invent one); `gate: {kind: 'human'}` at
|
|
9
|
+
every commitment, `onFail: {toStage}` for rework; typed `expectedOutputs`
|
|
10
|
+
(`kind`, `label`, `relationToSubject`); workers = `activators` (`on`, `size`,
|
|
11
|
+
default `mode: 'propose'`). What you create is POD-LOCAL, never an official
|
|
12
|
+
template.
|
|
13
|
+
|
|
14
|
+
<!-- brief:end -->
|
|
15
|
+
|
|
16
|
+
## Writing a process (a playbook that follows a kind's lifecycle)
|
|
17
|
+
|
|
18
|
+
The status belongs to the **kind or role**, never to a playbook. Its profile declares the lifecycle ONCE, in its
|
|
19
|
+
template:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
lifecycle:
|
|
23
|
+
property: post-status
|
|
24
|
+
options:
|
|
25
|
+
- { key: Idea, category: open }
|
|
26
|
+
- { key: Published, category: done }
|
|
27
|
+
- { key: Archived, category: lost, humanOnly: true }
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Every option has one category (`open · active · paused · done · lost`); rules read the category, names stay free.
|
|
31
|
+
`humanOnly` marks an option no agent sets; an agent's move into `done` or `lost` proposes. Every move goes through
|
|
32
|
+
the one status door (`moveStatus`; an agent sends `update_entity` with `expectedStatus`).
|
|
33
|
+
|
|
34
|
+
A playbook that works that lifecycle is a **process**: it FOLLOWS it. Its stages name options of it, its workers
|
|
35
|
+
start on it, and a person decides at the moments that commit the business. It never keeps a second status field.
|
|
36
|
+
The reference is Content OS "Produce Content" (`synap-app/packages/workspace-templates/src/content-os.yaml`).
|
|
37
|
+
|
|
38
|
+
**Official vs pod-local.** An official template or capability lives ONLY in the catalog
|
|
39
|
+
(`synap-app/packages/workspace-templates/`, by kind) and is published with
|
|
40
|
+
`synap catalog publish --official` (CI on main). A playbook, kind or automation an agent creates on a pod
|
|
41
|
+
(`synap_create_playbook`, `synap_define_kind`, …) is **pod-local**: it never reaches the catalog. To make it
|
|
42
|
+
official, write it into the catalog file and publish.
|
|
43
|
+
|
|
44
|
+
| Field | Where | Rule |
|
|
45
|
+
| ------------------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
46
|
+
| `subjectProfile.profileSlug` | playbook | The kind or role the process works. |
|
|
47
|
+
| `subjectProfile.statusProperty` | playbook | Omit it: the pod follows the profile's declared lifecycle. If you name it, name that same property. A status worker on a role with no declared lifecycle is refused. |
|
|
48
|
+
| `stages[].subjectStatus` | stage | Entering the stage moves the subject to this option, through the door. Must be an **existing option** of the lifecycle — never invent one. |
|
|
49
|
+
| `stages[].gate` | stage | `{kind: human}` at every commitment: send to a client, sign, pay, publish, won/lost, anything irreversible. `{kind: check}` only where the stage's own criteria can be verified. A gated stage writes its status only when the gate passes. A check gate judges the stage being LEFT, so never use it to guard an irreversible status. |
|
|
50
|
+
| `stages[].onFail` | stage | `{toStage: <key>}` — where a rejected gate sends the run (rework loop). |
|
|
51
|
+
| `stages[].criteria` | stage | 2–5 binary statements; `check.kind` evidence (cheapest) · capability · judge · human. |
|
|
52
|
+
| `expectedOutputs[]` | stage or playbook | What the step must produce: `kind` + `label` + `relationToSubject` (an existing relation slug, or `none`). The UI shows what was produced from this. |
|
|
53
|
+
| `activators[]` (workers) | playbook | `on`: `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min` ≥ 2) · `schedule` (+ `cron`, UTC) · `manual`. `size`: `per_thing` (default) · `per_moment` (count and schedule always are). `mode`: `propose` (default) · `run` only when cheap and safe. `maxPendingApprovals` (default 20) throttles. Compiled to a governed rule the owner can pause; it fires once per thing per transition. |
|
|
54
|
+
| `humanOnlyStatuses` | playbook | Legacy: the options no stage owns. Mark a person-only option `humanOnly` on the lifecycle instead; while `statusProperty` is set, `synap catalog validate` still checks that stages and this list cover every option. |
|
|
55
|
+
| `goalTemplate` | playbook | Placeholders are `{paramName}`. Never `@{arg:…}` (read-only legacy). |
|
|
56
|
+
| `params` | playbook | The subject is a `type: entity` param. A required param left unanswered becomes a question owed by the person, not an empty string. |
|
|
57
|
+
|
|
58
|
+
Human moments use an `ask` on an owed slot: `confirm` / `choose` (one `recommended`) / `form` / `act` / `provide`
|
|
59
|
+
(connection, file or secret through the vault). Never ask for a secret in a form.
|
|
60
|
+
|
|
61
|
+
Validation: `synap catalog validate` (process contract, goal grammar, lifecycle coverage ratchet — the count of
|
|
62
|
+
lifecycle kinds with no process may only go down).
|
|
63
|
+
|
|
64
|
+
## Declaring it over MCP
|
|
65
|
+
|
|
66
|
+
`synap_create_playbook` takes the contract as-is. Before calling it, read the
|
|
67
|
+
subject kind (`synap_list_profiles`) and copy the options of its lifecycle
|
|
68
|
+
property exactly. Over MCP you cannot declare or change a lifecycle; it comes
|
|
69
|
+
with the kind's template.
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"name": "Draft a post",
|
|
74
|
+
"goalTemplate": "Draft {post}",
|
|
75
|
+
"params": [{ "name": "post", "type": "entity", "required": true }],
|
|
76
|
+
"subjectProfileSlug": "post",
|
|
77
|
+
"activators": [
|
|
78
|
+
{
|
|
79
|
+
"on": "enters_status",
|
|
80
|
+
"status": "Briefed",
|
|
81
|
+
"size": "per_thing",
|
|
82
|
+
"mode": "propose"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"stages": [
|
|
86
|
+
{
|
|
87
|
+
"key": "draft",
|
|
88
|
+
"name": "Draft",
|
|
89
|
+
"category": "started",
|
|
90
|
+
"subjectStatus": "In Draft",
|
|
91
|
+
"expectedOutputs": [
|
|
92
|
+
{
|
|
93
|
+
"kind": "document",
|
|
94
|
+
"label": "Draft",
|
|
95
|
+
"relationToSubject": "made_for"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"key": "review",
|
|
101
|
+
"name": "Review",
|
|
102
|
+
"category": "started",
|
|
103
|
+
"subjectStatus": "Review",
|
|
104
|
+
"gate": { "kind": "human" },
|
|
105
|
+
"onFail": { "toStage": "draft" }
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
These are the Content OS post options; use the ones the kind really has. A
|
|
112
|
+
batch worker looks like `{ "on": "schedule", "cron": "0 8 * * 1", "status":
|
|
113
|
+
"Idea", "mode": "propose" }` (one session over every post in Idea, weekly) or
|
|
114
|
+
`{ "on": "count", "status": "Review", "min": 5, "mode": "propose" }`.
|
|
115
|
+
An agent call lands as a proposal (`status: "proposed"` is success). The
|
|
116
|
+
playbook lives on this pod only; to make it an official template, a developer
|
|
117
|
+
writes it into the catalog and publishes it with
|
|
118
|
+
`synap catalog publish --official`.
|
|
@@ -8,11 +8,15 @@ synap use <workspace-name-or-id> # focus a workspace (this
|
|
|
8
8
|
synap create entity --profile=task --name="…" --props='{"status":"todo","priority":"high"}' --json
|
|
9
9
|
synap set entity <id> --props='{"status":"done"}' --json # merge-patch (only changed keys)
|
|
10
10
|
synap ask "your question" --json # THE read verb — routes to the right store(s) + shows which answered
|
|
11
|
-
synap
|
|
11
|
+
synap create entity --profile=knowledge --name="…" --props='{"knowledgeForm":"fact|caution|convention","ek_claim":"…"}' --content="…" --json
|
|
12
12
|
synap capture --global --type=reference --claim="…" --json # Global lane — pod-wide cross-cutting runbook (knowledge_keys)
|
|
13
13
|
synap observe write "…" --json # User lane — durable user model (inferences proposed)
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
**Titles:** ≤ 80 characters, the lasting thing, no status words, ids or "…"; the
|
|
17
|
+
receipt's `titleLint` says what to rewrite. Rules + what counts as knowledge:
|
|
18
|
+
`synap_load_skill("system/synap/writing-titles")`.
|
|
19
|
+
|
|
16
20
|
**The canonical verbs:** `ask` (read) · `capture` (structured write — pick a lane:
|
|
17
21
|
Work default / `--global` / `observe` for User) · `orient` (bootstrap). `note` exists
|
|
18
22
|
for the HUMAN's raw "dump now, structure later" inbox — **the AI always `capture`s
|
package/skills/synap/reading.md
CHANGED
|
@@ -7,11 +7,13 @@ the low-level doors below only when you deliberately want a single substrate or
|
|
|
7
7
|
specific shape (a graph traversal, a typed-entity filter, an entity's neighborhood).
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
# THE read door — routes across semantic / procedural / episodic, tells you which answered
|
|
10
|
+
# THE read door — routes across semantic / procedural / episodic / library, tells you which answered
|
|
11
11
|
POST /api/hub/knowledge/ask body: { query, workspaceId?, limit? }
|
|
12
12
|
→ { query, routedTo: [...], primary, answers: [{ substrate, items, status }], degraded, understanding, verdict }
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
+
A link the person kept is in their Library: `ask` finds it (a `library` block — title, source URL, a snippet of what was read, who read it; `degraded: ["library"]` means the Library could not be read, never "nothing kept"). To read any URL use the `read_webpage` intent (builtin `web.read`).
|
|
16
|
+
|
|
15
17
|
Low-level doors (`ask` routes to these — graph-based, not semantic; type filter →
|
|
16
18
|
relations → neighborhood):
|
|
17
19
|
|
package/skills/synap/reflexes.md
CHANGED
|
@@ -1,46 +1,16 @@
|
|
|
1
|
-
## Reflexes —
|
|
1
|
+
## Reflexes — what holds on every door
|
|
2
2
|
|
|
3
|
-
> Canonical source — MCP instructions
|
|
3
|
+
> Canonical source — the MCP `instructions` field is derived from this file and composed with live grounding under ONE 2 KB budget (pinned by `instructions-budget.test.ts`). Most important first. Depth belongs in a skill, never here.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
(the source of truth about their life, work, projects, people, and preferences).
|
|
7
|
-
Two reflexes hold on every session, on every door (MCP, IS, CLI, HTTP):
|
|
5
|
+
The user's Synap pod: their source of truth. Tool names below are stems; your door may prefix them (`pod__ask`).
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
second brain grows.
|
|
7
|
+
1. **Recall first.** Before answering or creating, `ask`.
|
|
8
|
+
2. **Capture after.** A durable fact, decision, person, task: `capture`; about the user: `remember_fact`. No private scratchpad.
|
|
9
|
+
3. **Orient once.** `orient`: pending review (raise first), open sessions, kinds.
|
|
10
|
+
4. **Work in a session.** `start_session` or resume (playbook `templateId`); a lasting goal = TRACK: `list_tracks`, else `start_track`; work in it = `start_session` + `trackId`; 2-5 `criteria`; status moves carry `expectedStatus`; person-only: `owner:'human'` slot + `blockedReason` + `ask` (confirm/choose with 1 `recommended`/form/act/provide), then `wait_for_answer` if listed; post progress, questions and results in its room (`post_message` to `session.channelId`); your own chat may repeat them; `evaluate_session` before `complete_session`.
|
|
11
|
+
5. **Never guess a project.** Pin only what the user names (`set_workspace_focus`, `set_project_focus`).
|
|
12
|
+
6. **`proposed` is success**: keep going, never retry.
|
|
13
|
+
7. **Discover before inventing.** `list_profiles` / `list_capabilities` before defining a kind, role, space. **Extend first** (facet, overlay, parent); never a twin.
|
|
14
|
+
8. **One space per domain**; projects filter it (`file_into_project`, `project_use_workspace`).
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
workspaces, projects, and entity types before acting.
|
|
21
|
-
|
|
22
|
-
**Writes are governed: a `"proposed"` response is normal, never an error.** It
|
|
23
|
-
means the write is queued for the user's review — like a PR, not a failure. Keep
|
|
24
|
-
working; see `writes.md` for the full governance contract and `inline-patterns.md`
|
|
25
|
-
for how to surface a proposal's review link in a Companion reply.
|
|
26
|
-
|
|
27
|
-
**No private scratchpad.** Everything you learn goes into the shared graph, not a hidden note. Capture a proven tool-fact into `knowledge` immediately; PROMOTE it into a curated skill only once it's proven reusable — a skill is a versioned artifact (one capability, when-to-use + do/don't), never an append-anything log.
|
|
28
|
-
|
|
29
|
-
## Escalation ladder (keep in a corner of your head)
|
|
30
|
-
|
|
31
|
-
You can always escalate — never dead-end on "I can't." Full detail: `escalation-ladder.md`.
|
|
32
|
-
|
|
33
|
-
- **L0 Reflexes** — recall before, capture after, proposed ≠ error
|
|
34
|
-
- **L1 OPERATE on data** — capture, create_entity, link, attach KNOWN facets, sessions
|
|
35
|
-
- **L2 DISCOVER before invent** — list_profiles, list_capabilities, market.search (capability|template|automation|cell)
|
|
36
|
-
- **L3 MUTATE meta-model (proposal-gated)** — only if L2 empty for the need:
|
|
37
|
-
define_role, create_property_def/profile, create_view, create_workspace, market.install.
|
|
38
|
-
**Template FIRST for new domains:** market.search(kind:template) before freehand create_workspace
|
|
39
|
-
- **L4 CRYSTALLIZE after proof** — promote_session_to_playbook, promote_cell_to_renderer, create_playbook.
|
|
40
|
-
Never crystallize a one-off that hasn't succeeded once
|
|
41
|
-
|
|
42
|
-
**Gates:**
|
|
43
|
-
|
|
44
|
-
- Blocked / can't express need → L2 then L3 propose (never dead-end error; never silent invent)
|
|
45
|
-
- Success / repeatable pattern → one structural suggestion (question first if speculative)
|
|
46
|
-
- Capture placement routes to EXISTING lenses only — never invent a workspace from capture
|
|
16
|
+
Depth: `load_skill` `system/synap/concepts`, `work-model`, `focus-sessions`, `from-intent`, `escalation-ladder`, `writes`, `catalog`.
|
|
@@ -10,6 +10,12 @@ ViewFrame is the standard way to create custom data visualizations in Synap. Use
|
|
|
10
10
|
| User asks for a specific chart type, map, 3D scene, or custom layout | Generate a ViewFrame widget |
|
|
11
11
|
| User says "show X as a [funnel / heatmap / treemap / scatter / globe]" | Generate a ViewFrame widget |
|
|
12
12
|
|
|
13
|
+
### Default vs. generated — never the reflex, always the explicit ask
|
|
14
|
+
|
|
15
|
+
Every kind already renders as a familiar, kind-shaped card — its built-in `entity-card` (small block) / `entity-detail` (full page) / `entity-profile` (dashboard) renderer. That built-in is the DEFAULT for everyone, including brand-new user-defined kinds (which get an automatic card built from the schema — no generation needed). **Never generate a frame renderer as a kind's default presentation.** Generate one ONLY when the user explicitly asks for a custom look — a specific chart type, a redesigned card, a bespoke layout — and bind it PER KIND (one profile's one renderer slot), never as a blanket replacement for every kind. The sandbox's egress holes (see Security below) are still open, so treat "generate a view/card" as a deliberate, scoped request, not something to reach for by default.
|
|
16
|
+
|
|
17
|
+
After binding, tell the user where the result lives: **"⋯ → Customize display"** on that kind's page (Renderer Studio itself now lives in Builder mode / Settings, not a designer mode you build). That is the one place a human reverts it or picks something else — never invent a second, agent-only way to switch it back.
|
|
18
|
+
|
|
13
19
|
### What ViewFrame Is
|
|
14
20
|
|
|
15
21
|
- A sandboxed iframe that renders **one ES module** that default-exports a React component (or plain JS)
|
|
@@ -17,7 +23,7 @@ ViewFrame is the standard way to create custom data visualizations in Synap. Use
|
|
|
17
23
|
`deps` map, but the current Hub `cells/define` persistence path does not yet
|
|
18
24
|
retain that map, so external runtime dependencies are not a reliable contract.
|
|
19
25
|
- The host injects a `SynapWidget` bridge for data access and shell actions
|
|
20
|
-
- Security: `sandbox="allow-scripts allow-modals allow-popups
|
|
26
|
+
- Security: `sandbox="allow-scripts allow-modals"` — no `allow-popups`, no `allow-same-origin`, no cookies, no pod token
|
|
21
27
|
|
|
22
28
|
### Authoring contract
|
|
23
29
|
|
|
@@ -32,7 +38,7 @@ A ViewFrame cell is **one self-contained ES module** (inline in `rendererSource`
|
|
|
32
38
|
|
|
33
39
|
**Use `POST /api/hub/cells/define` — this is the canonical Hub Protocol path for AI-generated cells.**
|
|
34
40
|
|
|
35
|
-
It is idempotent (upserts on typeKey)
|
|
41
|
+
It is idempotent (upserts on typeKey) and pod-global by default (no workspaceId needed). **It IS governed for agent callers** — `POST /cells/define` runs `checkPermissionOrPropose({ resource: "cell", action: "define", trustLevel: "generated" })`; a `status: "proposed"` response is the normal outcome for AI-generated renderer source, not an error — surface `reviewUrl` and keep going. Only an operator-initiated define auto-applies.
|
|
36
42
|
|
|
37
43
|
```
|
|
38
44
|
POST /api/hub/cells/define
|
|
@@ -100,7 +106,7 @@ The cell appears immediately in the side panel with "Q2 Revenue Report" as the t
|
|
|
100
106
|
|
|
101
107
|
> **Note:** `POST /api/hub/widget-definitions` (tRPC path) still works but is the internal/admin path. Use `POST /api/hub/cells/define` for all agent-generated cells.
|
|
102
108
|
|
|
103
|
-
### CLI commands (when running as Claude Code
|
|
109
|
+
### CLI commands (when running as Claude Code or another terminal agent)
|
|
104
110
|
|
|
105
111
|
```bash
|
|
106
112
|
# Build a multi-file cell source into a single ES module bundle
|
|
@@ -120,7 +126,7 @@ synap doc create --title "Q2 Report" --file ./report.md
|
|
|
120
126
|
synap doc update <docId> --file ./updated-report.md
|
|
121
127
|
|
|
122
128
|
# Arrange widgets on an existing bento view
|
|
123
|
-
|
|
129
|
+
echo '[{"key":"generated:my-chart","x":0,"y":0,"w":8,"h":6}]' | synap view arrange <viewId>
|
|
124
130
|
```
|
|
125
131
|
|
|
126
132
|
### The SynapWidget Bridge (inside the iframe)
|
|
@@ -157,6 +163,33 @@ SynapWidget.onInit(async ({ config, context }) => {
|
|
|
157
163
|
|
|
158
164
|
All `query()` calls return a Promise. Entity shape: `{ id, title, profileSlug, properties, createdAt, … }`.
|
|
159
165
|
|
|
166
|
+
#### Intent reads (a kind's pipeline, goal, needs-you, sessions)
|
|
167
|
+
|
|
168
|
+
The same reads a kind's own page makes, so a frame can be that kind's dashboard. The host stamps the lens (the active space and project); a `workspaceId` / `projectId` you pass is ignored. `trackId` narrows to one track.
|
|
169
|
+
|
|
170
|
+
| Operation | Params | Returns |
|
|
171
|
+
| ---------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
172
|
+
| `lifecycle.board` | `profileSlug` (required), `trackId`, `windowDays`, `firstN`, `column` + `cursor`, `limit`, `workedBy` | `{ lifecycle: { profileSlug, property, options }, columns: [{ key, category, count, stuck, items: [{ id, name, status, since, stuck, workedBy? }] }], live, total, doneWindowed, lostWindowed, suggestedShape, window, nextCursor }` |
|
|
173
|
+
| `lifecycle.throughput` | `profileSlug`, `trackId`, `bucket` (`day` · `week` · `month`), `count` | `{ bucket, since, buckets: [{ bucketStart, done, lost }] }`, oldest first, zeros included |
|
|
174
|
+
| `attention.needsYou` | `profileSlug`, `trackId`, `limit` | `{ signals: [{ id, kind, title, count, occurredAt, target }] }` |
|
|
175
|
+
| `attention.count` | `profileSlug`, `trackId` | `{ needsYou, decisions, blocked, review, captures, truncated, … }` |
|
|
176
|
+
| `sessions.list` | `profileSlug` (its things) or `entityId` (one thing), `status`, `kind` (default `work`), `limit` | `[{ id, title, goal, status, currentStage, progress, startedAt, … }]` |
|
|
177
|
+
|
|
178
|
+
```js
|
|
179
|
+
const board = await SynapWidget.query("lifecycle.board", {
|
|
180
|
+
profileSlug: "post",
|
|
181
|
+
firstN: 5,
|
|
182
|
+
});
|
|
183
|
+
if (board?.error) return showError(board.error); // 404 = unknown kind, 412 = no lifecycle
|
|
184
|
+
const month = await SynapWidget.query("lifecycle.throughput", {
|
|
185
|
+
profileSlug: "post",
|
|
186
|
+
bucket: "month",
|
|
187
|
+
count: 1,
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
A failed read returns `{ error }`. Show it as a failure, never as an empty board. Moves still go through `update_entity` (the lifecycle property), so the status door and governance apply.
|
|
192
|
+
|
|
160
193
|
#### Mutations (governance-gated — return `{ status: "approved" | "proposed" | "denied" }`)
|
|
161
194
|
|
|
162
195
|
```js
|
|
@@ -182,7 +215,7 @@ await SynapWidget.mutate("delete_entity", { id: "uuid" });
|
|
|
182
215
|
await SynapWidget.mutate("create_relation", {
|
|
183
216
|
sourceEntityId: "uuid-a",
|
|
184
217
|
targetEntityId: "uuid-b",
|
|
185
|
-
type: "
|
|
218
|
+
type: "relates_to",
|
|
186
219
|
});
|
|
187
220
|
```
|
|
188
221
|
|
|
@@ -77,7 +77,7 @@ User: _"I'm trying to figure out whether we should build our own orchestrator or
|
|
|
77
77
|
} }
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
4. When the user
|
|
80
|
+
4. When the user picked through an answered `confirm`/`choose` ask, the pod ALREADY filed the decision (`slot.decisionId`) — link that one, never create a twin. Picked in plain chat? Create it yourself, linked to the question:
|
|
81
81
|
|
|
82
82
|
```json
|
|
83
83
|
POST /api/hub/entities
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
## Work model — how work is shaped on a pod
|
|
2
|
+
|
|
3
|
+
Load this before you plan, start or run work, or author a process. The long form is the pod document "The Synap work model" (36878a70-6cbb-4122-8bfa-288fdbd65218); the words are in `concepts`.
|
|
4
|
+
|
|
5
|
+
### Why
|
|
6
|
+
|
|
7
|
+
A process is the life of a **thing**, not a script. A lead, a post or a feature has ONE status. Boards, workers, sessions, goals and history read that status or move it through ONE door. So "when a post enters Review, run the review" is one rule, "how many leads reached Qualified this month" is a count, and a person and an agent can work the same thing without overwriting each other. Before, each playbook kept its own stages and status field, and the same fact lived in three places.
|
|
8
|
+
|
|
9
|
+
### The nouns
|
|
10
|
+
|
|
11
|
+
| Noun | What it is | Not |
|
|
12
|
+
| -------------------- | ----------------------------------------------------------------------------------- | ------------------------------------ |
|
|
13
|
+
| **Project** | a commitment, and a lens across spaces | a method, a domain |
|
|
14
|
+
| **Track** (optional) | a LASTING intent in one project: direction, instructions, goal; it turns workers on | a list of stages; it never completes |
|
|
15
|
+
| **Thing** | any entity: one kind, maybe roles, one status per kind or role | a second entity for a hat |
|
|
16
|
+
| **Session** | the unit of work that closes: goal, criteria, room; one thing or a batch | a "run" because it follows a method |
|
|
17
|
+
|
|
18
|
+
Not nouns (nobody manages them as objects): a **pipeline** is a view of a lifecycle; a **worker** is configuration (a method + a trigger + a size); a **method** is a playbook a session may follow; a **check** is a recurring verification.
|
|
19
|
+
|
|
20
|
+
How they relate: a project files things; each kind or role declares one **lifecycle** (its status list); its **pipeline** is computed (columns = the options in order); a status change fires **workers**, which start **sessions** carrying the project, the track and their **targets**; a session moves each thing's status through the door. **Hand-off is a role:** a won deal makes the party a client (attach the role); nothing is copied.
|
|
21
|
+
|
|
22
|
+
### Three tenses of a thing
|
|
23
|
+
|
|
24
|
+
- **Past = history.** Every status change is one transition event: from, to, who, which session, why.
|
|
25
|
+
- **Present = status.** One value per kind or role, in its own column.
|
|
26
|
+
- **Future = agenda.** Tasks and events linked to the thing, with an owner. _(Planned, wave 4.)_
|
|
27
|
+
|
|
28
|
+
### Five categories
|
|
29
|
+
|
|
30
|
+
Every lifecycle option has one fixed category: `open · active · paused · done · lost`. Names are free; rules read the category. An agent moving a thing into `done` or `lost` proposes by default; an option marked `humanOnly` is never set by an agent. A space may ADD options; it never renames, removes or recategorises one.
|
|
31
|
+
|
|
32
|
+
### The one door
|
|
33
|
+
|
|
34
|
+
Every status change — your call, a board drag, a method's step, a sync — goes through `moveStatus`. As an agent: a kind's status = `update_entity` with the lifecycle property set to the new value AND, over MCP, `expectedStatus` = the status you saw (the in-app `update_entity` has no `expectedStatus` yet; the door still checks the lifecycle); a role's status = `update_facet` `status` where your tools list it (the in-app agent; MCP has no role-status tool yet).
|
|
35
|
+
|
|
36
|
+
- `conflict` (with the current status) is normal: someone moved it; re-read and decide again. A person's move always wins.
|
|
37
|
+
- `proposed` is success (a done/lost move, or governance said review).
|
|
38
|
+
- A refusal naming the valid options means the value is not in the declared lifecycle: pick one of them.
|
|
39
|
+
Never invent a status, never keep your own stage field.
|
|
40
|
+
|
|
41
|
+
### Session size
|
|
42
|
+
|
|
43
|
+
- **Per thing** when each item needs its own thinking: a post, a feature, a deal in negotiation.
|
|
44
|
+
- **Per batch** when items are interchangeable: one session for "find 10 leads today" or "today's follow-ups".
|
|
45
|
+
- A session's **step is its subject's status**: move the thing, the step follows.
|
|
46
|
+
- **Set the subject.** A session about one thing names it: `subjectEntityId` on `start_session`, or on `update_session` the moment the thing exists (a batch names its things as targets). A session on no thing shows on the homes as "No thing yet · attach one", outside every pipeline.
|
|
47
|
+
- Following a method does not turn your session into a run; it stays your work and still shows in the method's runs.
|
|
48
|
+
- **Targets get a result each**: a worker session holds its things as targets. Your own move of a target marks it `done`; someone else's move marks it `skipped`; targets left at close are `skipped`. Put the outcome on each thing, not only in a summary.
|
|
49
|
+
|
|
50
|
+
### Workers
|
|
51
|
+
|
|
52
|
+
A worker is a playbook **activator**, declared on the method and owned by the lifecycle: `on` = `created` · `enters_status` (+ `status`) · `count` (+ `status`, `min`: once N things wait) · `schedule` (+ `cron`) · `manual`; `size` = `per_thing` · `per_moment` (a count or schedule is always per batch); `mode` = `propose` (default) · `run`; `maxPendingApprovals` throttles it. It compiles into a governed rule the owner can pause; it fires once per thing per transition. A track or project **turns it on** for its scope; installs turn it on space-wide. Authoring: `processes`.
|
|
53
|
+
|
|
54
|
+
### Tracks
|
|
55
|
+
|
|
56
|
+
A track holds an owner, a direction, instructions, the workers it turns on, and a goal (stated, or measured as transitions into `done`). It has no stages and never completes: pause or archive it. Work in it = `start_session` + `trackId`. A thing may count for two tracks. Solo users may never need one: workers can run space-wide. Legacy: `start_stage_session` and `add_track_stage` serve old tracks started from a method; never `advance_track` without the user.
|
|
57
|
+
|
|
58
|
+
### The homes: what each space makes, what is moving
|
|
59
|
+
|
|
60
|
+
Home, a space and a project read the work through two reads (the same answer every app shows):
|
|
61
|
+
|
|
62
|
+
- `lifecycle.home` (Hub `GET /api/hub/lifecycle/home?projectId=`): every space you see with its intent and, per kind it produces, the pipeline in one line, needs-you, being-worked and one headline thing.
|
|
63
|
+
- `lifecycle.moving` (Hub `GET /api/hub/lifecycle/moving?workspaceId=&projectId=&limit=`): the things with open work on them, the work under each (asks you first), and `unattached`, the open sessions on no thing.
|
|
64
|
+
|
|
65
|
+
Read them to answer "what is going on" before you list sessions one by one.
|
|
66
|
+
|
|
67
|
+
### A kind's dashboard
|
|
68
|
+
|
|
69
|
+
A kind with a lifecycle has its own page: the board, Needs you, the sessions on its things. To give it a custom Dashboard ("make this my Posts dashboard"), `create_cell` a frame over the bridge's intent reads (`lifecycle.board`, `lifecycle.throughput`, `attention.needsYou`, `attention.count`, `sessions.list`), then `promote_cell_to_renderer` with `slot: "dashboard"` (the `entity-profile` content kind). Recipe: `synap-ui`; params and shapes: `viewframe-cells`.
|
|
70
|
+
|
|
71
|
+
### Rules of thumb
|
|
72
|
+
|
|
73
|
+
1. Find the thing before creating one: resolve identity, then attach a role — never a twin.
|
|
74
|
+
2. Status changes go through the door, with `expectedStatus`.
|
|
75
|
+
3. Never invent a status or a second status field; the lifecycle is declared on the profile (`list_profiles`).
|
|
76
|
+
4. Size the session from the work: per thing or per batch.
|
|
77
|
+
5. Results go on the things, not only in prose.
|
|
78
|
+
6. `proposed` is success. Commitments (publish, send, sign, spend) are a person's call.
|
|
79
|
+
|
|
80
|
+
### Applied: content (Content OS)
|
|
81
|
+
|
|
82
|
+
- Thing = a **post**. Lifecycle `post-status`: Idea (open) · Briefed · Scripted · In Draft · Review · Scheduled (active) · Published (done) · Archived (lost, human-only).
|
|
83
|
+
- Nothing publishes itself: a move to Published is a proposal the person approves on the preview.
|
|
84
|
+
- Pipeline = the Posts board, filtered by project or campaign.
|
|
85
|
+
- Workers: **Draft** (per thing, enters Briefed) · **Review prep** (per thing, enters Review, ends by proposing the publish date) · **Ideas** (per batch, weekly, creates posts at Idea). Today the catalog ships them as Produce Content (enters Briefed), Repurpose (enters Published) and Plan Next Content (weekly, off by default).
|
|
86
|
+
- "The next posts" = read the pipeline: gaps per pillar, posts waiting per status.
|
|
87
|
+
|
|
88
|
+
### Applied: leads and deals (CRM)
|
|
89
|
+
|
|
90
|
+
- **Lead** = a role for qualification only, `leadStage`: new · researching · outreach (open) · engaged · qualified · nurturing (active) · converted (done) · disqualified (lost, human-only).
|
|
91
|
+
- **Deal** = the sale, `commercialStage`, created only at hand-off. A **won** deal attaches the client role to the party.
|
|
92
|
+
- A Cal.com booking makes the attendee a lead at `engaged` and records the call as an event; it never creates a deal and never moves a lead backwards.
|
|
93
|
+
|
|
94
|
+
### Point another AI here
|
|
95
|
+
|
|
96
|
+
Every door can load this: `load_skill system/synap/work-model`. To make a space carry it, put a one-line pointer in the space brief (`update_space_brief`, `purpose` or `framing`, 240 characters each): in-app agents and worker sessions read the brief every turn, MCP agents when they `orient`. To steer a session in flight, post the pointer in its room. A document attached to a session reaches an agent as a title only, so it does not teach.
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
{ "userId": "{userId}",
|
|
26
26
|
"sourceEntityId": "ent_new_task",
|
|
27
27
|
"targetEntityId": "ent_acme",
|
|
28
|
-
"type": "
|
|
28
|
+
"type": "relates_to" }
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
5. Confirm: "Task created and linked to Acme, due Friday."
|
|
@@ -51,3 +51,23 @@
|
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
3. If the user said why ("interesting for the onboarding project"), also create a relation to that project — never drop the reason as a plain comment, turn it into a link.
|
|
54
|
+
|
|
55
|
+
### Example 4 — "Write up a strategic plan for the Q3 launch"
|
|
56
|
+
|
|
57
|
+
You are authoring this text yourself — it is not a file you have. Don't create
|
|
58
|
+
a `file`/`document`-kind entity and stuff the Markdown into it.
|
|
59
|
+
|
|
60
|
+
1. Search for an existing plan: `GET /entities?q=Q3 launch&profileSlug=note&workspaceId=…` → none
|
|
61
|
+
2. Create a CONTENT-kind entity carrying the plan as `content` (the doc auto-materializes):
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
POST /api/hub/entities
|
|
65
|
+
{ "userId": "{userId}", "workspaceId": "{wsId}",
|
|
66
|
+
"profileSlug": "note",
|
|
67
|
+
"title": "Q3 launch strategic plan",
|
|
68
|
+
"content": "# Q3 Launch Plan\n\n## Goals\n…\n\n## Timeline\n…"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
3. Link it to the relevant project: `POST /api/hub/relations` `{ sourceEntityId: "ent_new_plan", targetEntityId: "ent_project_q3", type: "relates_to" }`.
|
|
73
|
+
4. Confirm: "Plan captured and linked to Q3 launch." No upload, no `file` entity, no separate `synap_create_document` call.
|