@synap-core/cli 1.7.0 → 1.10.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/dist/commands/agent-chat.d.ts +47 -0
- package/dist/commands/agent-chat.js +250 -0
- package/dist/commands/agent-chat.js.map +1 -0
- package/dist/commands/agent-run.d.ts +47 -0
- package/dist/commands/agent-run.js +301 -0
- package/dist/commands/agent-run.js.map +1 -0
- package/dist/commands/agents.js +85 -46
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/artifact.d.ts +26 -0
- package/dist/commands/artifact.js +76 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/automation.d.ts +47 -0
- package/dist/commands/automation.js +601 -0
- package/dist/commands/automation.js.map +1 -0
- package/dist/commands/bridge-setup.d.ts +66 -0
- package/dist/commands/bridge-setup.js +1112 -0
- package/dist/commands/bridge-setup.js.map +1 -0
- package/dist/commands/cap-connections.d.ts +28 -0
- package/dist/commands/cap-connections.js +224 -0
- package/dist/commands/cap-connections.js.map +1 -0
- package/dist/commands/capability.d.ts +89 -0
- package/dist/commands/capability.js +1523 -0
- package/dist/commands/capability.js.map +1 -0
- package/dist/commands/cell.d.ts +55 -0
- package/dist/commands/cell.js +277 -0
- package/dist/commands/cell.js.map +1 -0
- package/dist/commands/centrality.d.ts +20 -0
- package/dist/commands/centrality.js +94 -0
- package/dist/commands/centrality.js.map +1 -0
- package/dist/commands/connect.d.ts +2 -0
- package/dist/commands/connect.js +25 -10
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connections.js +0 -16
- package/dist/commands/connections.js.map +1 -1
- package/dist/commands/context.d.ts +22 -0
- package/dist/commands/context.js +149 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/data-extra.d.ts +14 -0
- package/dist/commands/data-extra.js +185 -0
- package/dist/commands/data-extra.js.map +1 -0
- package/dist/commands/data.d.ts +14 -10
- package/dist/commands/data.js +353 -192
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.d.ts +20 -0
- package/dist/commands/diagnose.js +143 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/digest.d.ts +17 -0
- package/dist/commands/digest.js +121 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/discover.d.ts +2 -0
- package/dist/commands/discover.js +25 -8
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/doc.d.ts +39 -0
- package/dist/commands/doc.js +130 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/events.d.ts +26 -0
- package/dist/commands/events.js +69 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/explain.d.ts +21 -0
- package/dist/commands/explain.js +251 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/facet.d.ts +29 -0
- package/dist/commands/facet.js +113 -0
- package/dist/commands/facet.js.map +1 -0
- package/dist/commands/graph.d.ts +18 -0
- package/dist/commands/graph.js +74 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/home.d.ts +12 -0
- package/dist/commands/home.js +54 -0
- package/dist/commands/home.js.map +1 -0
- package/dist/commands/import.d.ts +38 -0
- package/dist/commands/import.js +440 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts +0 -2
- package/dist/commands/init.js +97 -118
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys.d.ts +9 -0
- package/dist/commands/keys.js +78 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/knowledge.d.ts +34 -18
- package/dist/commands/knowledge.js +355 -57
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.d.ts +50 -0
- package/dist/commands/launch.js +790 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/lens.d.ts +45 -0
- package/dist/commands/lens.js +386 -0
- package/dist/commands/lens.js.map +1 -0
- package/dist/commands/market.d.ts +209 -0
- package/dist/commands/market.js +1368 -0
- package/dist/commands/market.js.map +1 -0
- package/dist/commands/mcp.d.ts +42 -0
- package/dist/commands/mcp.js +184 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.js +93 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/open.d.ts +32 -0
- package/dist/commands/open.js +85 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/pod.d.ts +100 -0
- package/dist/commands/pod.js +359 -0
- package/dist/commands/pod.js.map +1 -0
- package/dist/commands/pods.d.ts +6 -0
- package/dist/commands/pods.js +160 -50
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.d.ts +7 -0
- package/dist/commands/proposals-actions.js +77 -0
- package/dist/commands/proposals-actions.js.map +1 -0
- package/dist/commands/providers.d.ts +38 -0
- package/dist/commands/providers.js +170 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/purge.d.ts +23 -0
- package/dist/commands/purge.js +148 -0
- package/dist/commands/purge.js.map +1 -0
- package/dist/commands/raycast.d.ts +15 -0
- package/dist/commands/raycast.js +153 -0
- package/dist/commands/raycast.js.map +1 -0
- package/dist/commands/sessions.d.ts +31 -0
- package/dist/commands/sessions.js +248 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/skill-manage.d.ts +21 -0
- package/dist/commands/skill-manage.js +195 -0
- package/dist/commands/skill-manage.js.map +1 -0
- package/dist/commands/skills-commands.d.ts +26 -0
- package/dist/commands/skills-commands.js +187 -0
- package/dist/commands/skills-commands.js.map +1 -0
- package/dist/commands/skills.d.ts +26 -0
- package/dist/commands/skills.js +196 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts +3 -1
- package/dist/commands/status.js +231 -41
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.d.ts +24 -0
- package/dist/commands/statusline.js +450 -0
- package/dist/commands/statusline.js.map +1 -0
- package/dist/commands/subscribe.d.ts +19 -0
- package/dist/commands/subscribe.js +91 -0
- package/dist/commands/subscribe.js.map +1 -0
- package/dist/commands/tools.d.ts +30 -0
- package/dist/commands/tools.js +315 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/versions.d.ts +27 -0
- package/dist/commands/versions.js +277 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/commands/view.d.ts +57 -0
- package/dist/commands/view.js +195 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/whoami.d.ts +21 -0
- package/dist/commands/whoami.js +129 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -4
- package/dist/index.js +1524 -202
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-templates.d.ts +25 -0
- package/dist/lib/agent-templates.js +148 -0
- package/dist/lib/agent-templates.js.map +1 -0
- package/dist/lib/agents-config.d.ts +4 -1
- package/dist/lib/agents-config.js +19 -2
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/approval-poll.d.ts +42 -0
- package/dist/lib/approval-poll.js +52 -0
- package/dist/lib/approval-poll.js.map +1 -0
- package/dist/lib/auth.d.ts +29 -6
- package/dist/lib/auth.js +105 -94
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/bundle-version.d.ts +11 -0
- package/dist/lib/bundle-version.js +33 -0
- package/dist/lib/bundle-version.js.map +1 -0
- package/dist/lib/capture-lane.d.ts +67 -0
- package/dist/lib/capture-lane.js +136 -0
- package/dist/lib/capture-lane.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +121 -0
- package/dist/lib/cp-packages.js +218 -0
- package/dist/lib/cp-packages.js.map +1 -0
- package/dist/lib/describe-lens.d.ts +46 -0
- package/dist/lib/describe-lens.js +33 -0
- package/dist/lib/describe-lens.js.map +1 -0
- package/dist/lib/hub-client.d.ts +84 -1
- package/dist/lib/hub-client.js +502 -22
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/installed.d.ts +51 -0
- package/dist/lib/installed.js +70 -0
- package/dist/lib/installed.js.map +1 -0
- package/dist/lib/next-steps.d.ts +61 -0
- package/dist/lib/next-steps.js +146 -0
- package/dist/lib/next-steps.js.map +1 -0
- package/dist/lib/pod.d.ts +104 -19
- package/dist/lib/pod.js +245 -57
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/project-ref.d.ts +95 -0
- package/dist/lib/project-ref.js +144 -0
- package/dist/lib/project-ref.js.map +1 -0
- package/dist/lib/project.d.ts +35 -0
- package/dist/lib/project.js +39 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/session-lens.d.ts +33 -0
- package/dist/lib/session-lens.js +76 -0
- package/dist/lib/session-lens.js.map +1 -0
- package/dist/lib/skill-import.d.ts +40 -0
- package/dist/lib/skill-import.js +203 -0
- package/dist/lib/skill-import.js.map +1 -0
- package/dist/lib/skills-installer.d.ts +16 -5
- package/dist/lib/skills-installer.js +132 -18
- package/dist/lib/skills-installer.js.map +1 -1
- package/dist/lib/suite.d.ts +28 -0
- package/dist/lib/suite.js +29 -0
- package/dist/lib/suite.js.map +1 -0
- package/dist/lib/superwhisper-import.d.ts +40 -0
- package/dist/lib/superwhisper-import.js +389 -0
- package/dist/lib/superwhisper-import.js.map +1 -0
- package/dist/lib/targets.d.ts +66 -2
- package/dist/lib/targets.js +914 -132
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/unwrapList.d.ts +1 -0
- package/dist/lib/unwrapList.js +20 -0
- package/dist/lib/unwrapList.js.map +1 -0
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.js +10 -2
- package/dist/utils/logger.js.map +1 -1
- package/package.json +10 -4
- package/skills/agent-os/SKILL.md +212 -0
- package/skills/manifest.json +5 -0
- package/skills/onboard/SKILL.md +186 -0
- package/skills/synap/SKILL.md +1524 -104
- package/skills/synap/_order.txt +37 -0
- package/skills/synap/_skill.yaml +24 -0
- package/skills/synap/authentication.md +10 -0
- package/skills/synap/automations.md +264 -0
- package/skills/synap/capabilities.md +107 -0
- package/skills/synap/capture.md +10 -0
- package/skills/synap/cli-operations.md +107 -0
- package/skills/synap/common-mistakes.md +12 -0
- package/skills/synap/creative-loop.md +43 -0
- package/skills/synap/crm.md +117 -0
- package/skills/synap/diagnostics.md +35 -0
- package/skills/synap/digesting-a-channel.md +38 -0
- package/skills/synap/document-embeds.md +123 -0
- package/skills/synap/escalation-ladder.md +71 -0
- package/skills/synap/focus-sessions.md +47 -0
- package/skills/synap/governance-rules.md +64 -0
- package/skills/synap/governance.md +6 -6
- package/skills/synap/graph-gardening.md +21 -0
- package/skills/synap/inline-patterns.md +38 -0
- package/skills/synap/lenses.md +38 -0
- package/skills/synap/linking-principle.md +39 -0
- package/skills/synap/linking.md +1 -0
- package/skills/synap/mental-model.md +45 -0
- package/skills/synap/more.md +7 -0
- package/skills/synap/multi-entity-capture.md +10 -0
- package/skills/synap/next-action.md +37 -0
- package/skills/synap/north-star.md +17 -0
- package/skills/synap/operating-mode-rules.md +45 -0
- package/skills/synap/operating-mode.md +9 -0
- package/skills/synap/quick-reference.md +67 -0
- package/skills/synap/reading.md +43 -0
- package/skills/synap/recap.md +21 -0
- package/skills/synap/reflexes.md +46 -0
- package/skills/synap/response-style.md +21 -0
- package/skills/synap/scope.md +13 -0
- package/skills/synap/showing.md +17 -0
- package/skills/synap/user-model.md +25 -0
- package/skills/synap/viewframe-cells.md +290 -0
- package/skills/synap/work-flow.md +113 -0
- package/skills/synap/worked-examples.md +53 -0
- package/skills/synap/workspace-design.md +45 -0
- package/skills/synap/workspace-edges.md +49 -0
- package/skills/synap/writes.md +156 -0
- package/skills/synap-schema/SKILL.md +97 -6
- package/skills/synap-schema/_order.txt +13 -0
- package/skills/synap-schema/_skill.yaml +22 -0
- package/skills/synap-schema/before-you-touch.md +14 -0
- package/skills/synap-schema/common-mistakes.md +9 -0
- package/skills/synap-schema/creating-profiles.md +17 -0
- package/skills/synap-schema/discover-profiles.md +24 -0
- package/skills/synap-schema/entity-scope.md +8 -0
- package/skills/synap-schema/extend-vs-create.md +31 -0
- package/skills/synap-schema/more.md +6 -0
- package/skills/synap-schema/overlay-properties.md +22 -0
- package/skills/synap-schema/profiles.md +3 -0
- package/skills/synap-schema/property-defs.md +29 -0
- package/skills/synap-schema/read-before-write.md +50 -0
- package/skills/synap-schema/relations.md +18 -0
- package/skills/synap-schema/worked-example.md +30 -0
- package/skills/synap-ui/SKILL.md +38 -11
- package/skills/synap-ui/_order.txt +13 -0
- package/skills/synap-ui/_skill.yaml +23 -0
- package/skills/synap-ui/ai-companion.md +27 -0
- package/skills/synap-ui/arranging-bento.md +8 -0
- package/skills/synap-ui/before-you-build.md +20 -0
- package/skills/synap-ui/bento-layouts.md +35 -0
- package/skills/synap-ui/common-mistakes.md +10 -0
- package/skills/synap-ui/creating-views.md +26 -0
- package/skills/synap-ui/four-builds.md +24 -0
- package/skills/synap-ui/more.md +7 -0
- package/skills/synap-ui/proposing-vs-extending.md +11 -0
- package/skills/synap-ui/view-list.md +24 -0
- package/skills/synap-ui/views.md +3 -0
- package/skills/synap-ui/worked-example.md +18 -0
- package/skills/synap-ui/workspaces.md +47 -0
- package/templates/automations/bookmark-enrichment.automation.json +44 -0
- package/templates/automations/mail-feed.automation.json +86 -0
- package/templates/automations/url-bookmark-capture.automation.json +70 -0
- package/templates/skills/README.md +21 -0
- package/templates/skills/authoring-automations/SKILL.md +95 -0
- package/templates/skills/authoring-automations/reference/node-matrix.md +49 -0
- package/templates/skills/authoring-capabilities/SKILL.md +93 -0
- package/templates/skills/authoring-capabilities/reference/template-anatomy.md +70 -0
- package/templates/skills/authoring-playbooks/SKILL.md +102 -0
- package/templates/skills/authoring-playbooks/reference/stages-contract.md +35 -0
- package/templates/skills/authoring-playbooks/reference/worked-example.md +64 -0
- package/templates/skills/bookmark-enrichment/SKILL.md +40 -0
- package/templates/skills/coordinating-agents/SKILL.md +32 -0
- package/templates/skills/coordinating-branches/SKILL.md +27 -0
- package/templates/skills/mapping-the-server/SKILL.md +54 -0
- package/templates/skills/reading-client-progress/SKILL.md +65 -0
- package/templates/skills/routing-to-channels/SKILL.md +54 -0
- package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
- package/templates/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
- package/templates/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
- package/templates/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
- package/templates/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
- package/templates/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
- package/templates/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
- package/templates/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
- package/templates/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
- package/dist/commands/finish.d.ts +0 -25
- package/dist/commands/finish.js +0 -274
- package/dist/commands/finish.js.map +0 -1
- package/dist/commands/openclaw.d.ts +0 -40
- package/dist/commands/openclaw.js +0 -1148
- package/dist/commands/openclaw.js.map +0 -1
- package/dist/commands/security-audit.d.ts +0 -12
- package/dist/commands/security-audit.js +0 -100
- package/dist/commands/security-audit.js.map +0 -1
- package/dist/lib/hardening.d.ts +0 -18
- package/dist/lib/hardening.js +0 -214
- package/dist/lib/hardening.js.map +0 -1
- package/dist/lib/templates.d.ts +0 -11
- package/dist/lib/templates.js +0 -13
- package/dist/lib/templates.js.map +0 -1
- package/dist/templates/agent-os.json +0 -3090
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +0 -881
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +0 -907
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +0 -907
- package/node_modules/@synap/hub-rest-client/dist/index.js +0 -851
- package/node_modules/@synap/hub-rest-client/package.json +0 -45
- package/node_modules/@synap/hub-rest-client/src/client.ts +0 -1143
- package/node_modules/@synap/hub-rest-client/src/errors.ts +0 -30
- package/node_modules/@synap/hub-rest-client/src/index.ts +0 -111
- package/node_modules/@synap/hub-rest-client/src/setup.ts +0 -77
- package/node_modules/@synap/hub-rest-client/src/types.ts +0 -639
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap statusline — full 3-line ANSI status for the Claude Code statusLine.
|
|
3
|
+
*
|
|
4
|
+
* Two modes, both via `synap statusline`:
|
|
5
|
+
*
|
|
6
|
+
* RENDER (default) Parse the Claude Code JSON from stdin, read the pod
|
|
7
|
+
* cache file (NO network), compose 3 ANSI lines, print,
|
|
8
|
+
* exit. Always instant. If the cache is stale it spawns a
|
|
9
|
+
* detached refresh (fire-and-forget) so the NEXT render is
|
|
10
|
+
* fresh — this render never blocks on the network.
|
|
11
|
+
*
|
|
12
|
+
* REFRESH (--refresh) Fetch pod data in a single parallel burst and write the
|
|
13
|
+
* cache. Lock-guarded so only one refresh runs at a time.
|
|
14
|
+
* On error/429, the last good cache is preserved (the dot
|
|
15
|
+
* goes stale, not blank).
|
|
16
|
+
*
|
|
17
|
+
* Why: Claude Code calls the statusline on every render (debounced ~300ms +
|
|
18
|
+
* periodic refresh). Fetching live pod data synchronously per render hammers
|
|
19
|
+
* the pod's 100-req/min budget → 429 → red dot. Decoupling render from fetch
|
|
20
|
+
* caps pod traffic at ~1 burst / REFRESH_TTL regardless of render frequency.
|
|
21
|
+
*/
|
|
22
|
+
import fs from "node:fs";
|
|
23
|
+
import os from "node:os";
|
|
24
|
+
import { execSync, spawn } from "node:child_process";
|
|
25
|
+
import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
|
|
26
|
+
import { resolveActiveLens } from "../lib/session-lens.js";
|
|
27
|
+
import { describeLens } from "../lib/describe-lens.js";
|
|
28
|
+
import { getSurfaceAgentKey, SURFACE_NAMES } from "../lib/pod.js";
|
|
29
|
+
const CACHE_FILE = "/tmp/synap-statusline-cache.json";
|
|
30
|
+
const LOCK_FILE = "/tmp/synap-statusline-refresh.lock";
|
|
31
|
+
// The pod sits behind a strict edge rate-limiter (15-min window) shared with
|
|
32
|
+
// the agent's own traffic on the same key. Keep statusline cost minimal:
|
|
33
|
+
// refresh at most once per 120s; the burst is ~4-6 GETs (workspaces, skills,
|
|
34
|
+
// session, proposals, + conditional project/identity). Fold new fields into an
|
|
35
|
+
// existing call rather than adding to the burst.
|
|
36
|
+
const REFRESH_TTL_MS = 120_000;
|
|
37
|
+
const LOCK_STALE_MS = 30_000; // a lock older than this is considered dead
|
|
38
|
+
// ── ANSI + OSC 8 helpers ───────────────────────────────────────────────
|
|
39
|
+
const G = "\x1b[01;32m"; // green bold
|
|
40
|
+
const Y = "\x1b[01;33m"; // yellow bold
|
|
41
|
+
const R = "\x1b[01;31m"; // red bold
|
|
42
|
+
const C = "\x1b[36m"; // cyan
|
|
43
|
+
const BB = "\x1b[01;34m"; // bold blue — used for the pinned PROJECT (prominence)
|
|
44
|
+
const M = "\x1b[35m"; // magenta
|
|
45
|
+
const D = "\x1b[2m"; // dim
|
|
46
|
+
const X = "\x1b[0m"; // reset
|
|
47
|
+
function osc8(url, text) {
|
|
48
|
+
if (!url)
|
|
49
|
+
return text;
|
|
50
|
+
return `\x1b]8;;${url}\x1b\\${text}\x1b]8;;\x1b\\`;
|
|
51
|
+
}
|
|
52
|
+
function ctxColor(pct) {
|
|
53
|
+
if (pct >= 80)
|
|
54
|
+
return R;
|
|
55
|
+
if (pct >= 60)
|
|
56
|
+
return Y;
|
|
57
|
+
return G;
|
|
58
|
+
}
|
|
59
|
+
function rateColor(pct) {
|
|
60
|
+
if (pct >= 80)
|
|
61
|
+
return R;
|
|
62
|
+
if (pct >= 50)
|
|
63
|
+
return Y;
|
|
64
|
+
return G;
|
|
65
|
+
}
|
|
66
|
+
function bar(pct, width = 16) {
|
|
67
|
+
const filled = Math.max(0, Math.min(width, Math.round((pct / 100) * width)));
|
|
68
|
+
return ctxColor(pct) + "▰".repeat(filled) + D + "▱".repeat(width - filled) + X;
|
|
69
|
+
}
|
|
70
|
+
function compact(n) {
|
|
71
|
+
if (n >= 1_000_000)
|
|
72
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
73
|
+
if (n >= 1_000)
|
|
74
|
+
return `${(n / 1000).toFixed(0)}K`;
|
|
75
|
+
return String(n);
|
|
76
|
+
}
|
|
77
|
+
function emptyCache() {
|
|
78
|
+
return {
|
|
79
|
+
ts: 0, ok: false, podUrl: "", activeWorkspaceId: "", workspaces: [], projectName: "", projectId: "",
|
|
80
|
+
skillCount: 0, proposalCount: 0, proposalsFetched: false, sessionGoal: "", sessionId: "", totalEntities: 0,
|
|
81
|
+
actingAgentLabel: "", identityMismatch: false,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/** Find which known surface (if any) owns this hub API key — for a friendly acting-agent label. */
|
|
85
|
+
function findSurfaceLabelForKey(hubApiKey) {
|
|
86
|
+
for (const s of SURFACE_NAMES) {
|
|
87
|
+
if (getSurfaceAgentKey(s)?.hubApiKey === hubApiKey)
|
|
88
|
+
return s;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function readCache() {
|
|
93
|
+
try {
|
|
94
|
+
return JSON.parse(fs.readFileSync(CACHE_FILE, "utf-8"));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ── Detached refresh trigger (fire-and-forget) ─────────────────────────
|
|
101
|
+
function lockIsFresh() {
|
|
102
|
+
try {
|
|
103
|
+
return Date.now() - fs.statSync(LOCK_FILE).mtimeMs < LOCK_STALE_MS;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function triggerRefresh(claudeSessionId) {
|
|
110
|
+
if (lockIsFresh())
|
|
111
|
+
return; // a refresh is already running
|
|
112
|
+
try {
|
|
113
|
+
const entry = process.argv[1]; // the CLI entry script
|
|
114
|
+
// The detached refresh has no Claude env of its own — forward the session
|
|
115
|
+
// id (from stdin) so its resolveHubConfig/lens picks the right workspace.
|
|
116
|
+
const env = claudeSessionId
|
|
117
|
+
? { ...process.env, SYNAP_LENS_SESSION: claudeSessionId }
|
|
118
|
+
: process.env;
|
|
119
|
+
const child = spawn(process.execPath, [entry, "statusline", "--refresh"], {
|
|
120
|
+
detached: true,
|
|
121
|
+
stdio: "ignore",
|
|
122
|
+
env,
|
|
123
|
+
});
|
|
124
|
+
child.unref();
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
/* best-effort */
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ── REFRESH mode: fetch pod, write cache (lock-guarded) ────────────────
|
|
131
|
+
async function refresh() {
|
|
132
|
+
if (lockIsFresh())
|
|
133
|
+
return; // another refresh owns the window
|
|
134
|
+
try {
|
|
135
|
+
fs.writeFileSync(LOCK_FILE, String(process.pid));
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
/* ignore */
|
|
139
|
+
}
|
|
140
|
+
const prev = readCache();
|
|
141
|
+
try {
|
|
142
|
+
const cfg = await resolveHubConfig({});
|
|
143
|
+
if (!cfg.podUrl || !cfg.apiKey)
|
|
144
|
+
return;
|
|
145
|
+
// This connection's per-Claude-session lens (forwarded as SYNAP_LENS_SESSION
|
|
146
|
+
// by the render process). Drives WHICH project/session we show — the bound
|
|
147
|
+
// ones, not a global guess.
|
|
148
|
+
const lens = resolveActiveLens();
|
|
149
|
+
// Minimal burst (the pod's edge limiter is shared with agent traffic).
|
|
150
|
+
// `/workspaces` succeeding doubles as the liveness signal — no separate
|
|
151
|
+
// `/health`. The bound focus-session and project are fetched by id only
|
|
152
|
+
// when the lens has them (0–2 extra calls).
|
|
153
|
+
const sessionReq = lens?.focusSessionId
|
|
154
|
+
? hubGet(`/focus-sessions/${lens.focusSessionId}`, cfg.workspaceId ? { workspaceId: cfg.workspaceId } : {}, cfg)
|
|
155
|
+
: hubGet("/focus-sessions?status=active&limit=1", {}, cfg);
|
|
156
|
+
// Use the FULLY-RESOLVED project id (cfg.projectId = session-lens ?? env ??
|
|
157
|
+
// durable activeProjectId), NOT just the session lens — so a durable
|
|
158
|
+
// `synap project use` shows even in a fresh session with no lens file yet.
|
|
159
|
+
// Mirrors how activeWorkspaceId already uses cfg.workspaceId below.
|
|
160
|
+
const resolvedProjectId = cfg.projectId;
|
|
161
|
+
// Resolve the NAME via the single-project route. `GET /projects` returns a
|
|
162
|
+
// bare array and ignores `?ids=` (only status/limit) — the old call read a
|
|
163
|
+
// nonexistent `.projects` field, so the name never resolved and the line
|
|
164
|
+
// showed the raw UUID. `/projects/:id` returns the row directly ({id,name}).
|
|
165
|
+
const projectReq = resolvedProjectId
|
|
166
|
+
? hubGet(`/projects/${encodeURIComponent(resolvedProjectId)}`, {}, cfg)
|
|
167
|
+
: Promise.resolve(null);
|
|
168
|
+
// Identity safety: compare the AMBIENT SYNAP_HUB_API_KEY against the
|
|
169
|
+
// claude-code surface key pinned to this pod. A cheap string compare
|
|
170
|
+
// covers the common case (no pod call). Only when they diverge do we pay
|
|
171
|
+
// for one extra `/users/me` call — resolved with the RAW ambient key
|
|
172
|
+
// (not `cfg`, which resolveHubConfig may already have self-corrected to
|
|
173
|
+
// the pinned key) so the acting identity we show reflects what this
|
|
174
|
+
// session's environment actually carries, not the corrected value.
|
|
175
|
+
const surfaceKey = getSurfaceAgentKey("claude-code");
|
|
176
|
+
const expectedAgentUserId = surfaceKey?.podUrl === cfg.podUrl ? surfaceKey.agentUserId : "";
|
|
177
|
+
const ambientKey = process.env.SYNAP_HUB_API_KEY;
|
|
178
|
+
const ambientMatchesExpected = Boolean(ambientKey && surfaceKey && ambientKey === surfaceKey.hubApiKey);
|
|
179
|
+
const needsIdentityCheck = Boolean(expectedAgentUserId && ambientKey && !ambientMatchesExpected);
|
|
180
|
+
const identityReq = needsIdentityCheck
|
|
181
|
+
? hubGet("/users/me", {}, { podUrl: cfg.podUrl, apiKey: ambientKey, userId: "cli" })
|
|
182
|
+
: Promise.resolve(null);
|
|
183
|
+
// Pending proposals — the one actionable ambient signal. No dedicated
|
|
184
|
+
// count endpoint exists yet (verified: `/proposals` returns `{ proposals: [] }`,
|
|
185
|
+
// no `total`); a high `limit` on the pending-only list is the cheapest
|
|
186
|
+
// accurate count within the burst budget (a personal pod won't realistically
|
|
187
|
+
// clear 1000 pending proposals before this undercounts).
|
|
188
|
+
const proposalsReq = hubGet("/proposals", { status: "pending", limit: 1000 }, cfg);
|
|
189
|
+
const [ws, skills, session, project, identity, proposals] = await Promise.allSettled([
|
|
190
|
+
hubGet("/workspaces", {}, cfg),
|
|
191
|
+
hubGet("/agent-skills?limit=1", {}, cfg),
|
|
192
|
+
sessionReq,
|
|
193
|
+
projectReq,
|
|
194
|
+
identityReq,
|
|
195
|
+
proposalsReq,
|
|
196
|
+
]);
|
|
197
|
+
// Reached the pod iff /workspaces returned a well-formed payload.
|
|
198
|
+
const ok = ws.status === "fulfilled" && Array.isArray(ws.value?.workspaces);
|
|
199
|
+
if (!ok)
|
|
200
|
+
throw new Error("pod unreachable");
|
|
201
|
+
const workspaces = [];
|
|
202
|
+
let totalEntities = 0;
|
|
203
|
+
const list = ws.value?.workspaces ?? [];
|
|
204
|
+
for (const w of list) {
|
|
205
|
+
workspaces.push({ id: w.id, name: w.name, count: w.entityCount ?? 0 });
|
|
206
|
+
totalEntities += w.entityCount ?? 0;
|
|
207
|
+
}
|
|
208
|
+
const skillCount = skills.status === "fulfilled" ? (skills.value?.total ?? 0) : prev?.skillCount ?? 0;
|
|
209
|
+
// Bound session — either the by-id fetch (object) or the active-list fallback.
|
|
210
|
+
let sessionGoal = prev?.sessionGoal ?? "";
|
|
211
|
+
let sessionId = prev?.sessionId ?? "";
|
|
212
|
+
if (session.status === "fulfilled" && session.value) {
|
|
213
|
+
const v = session.value;
|
|
214
|
+
const s = v.sessions ? v.sessions[0] : v; // list-shape vs object-shape
|
|
215
|
+
sessionGoal = s?.goal?.slice(0, 60) ?? "";
|
|
216
|
+
sessionId = s?.id ?? "";
|
|
217
|
+
}
|
|
218
|
+
else if (lens?.focusSessionId) {
|
|
219
|
+
sessionGoal = "";
|
|
220
|
+
sessionId = "";
|
|
221
|
+
}
|
|
222
|
+
// Bound project (from the fully-resolved id — durable or session).
|
|
223
|
+
let projectName = resolvedProjectId ? prev?.projectName ?? "" : "";
|
|
224
|
+
let projectId = resolvedProjectId ?? "";
|
|
225
|
+
if (project.status === "fulfilled" && project.value) {
|
|
226
|
+
const p = project.value?.projects?.find((x) => x.id === resolvedProjectId);
|
|
227
|
+
projectName = p?.name?.slice(0, 30) ?? "";
|
|
228
|
+
}
|
|
229
|
+
// Acting identity: clean unless we detected a real divergence.
|
|
230
|
+
let actingAgentLabel = "";
|
|
231
|
+
let identityMismatch = false;
|
|
232
|
+
if (expectedAgentUserId && !ambientMatchesExpected && identity.status === "fulfilled" && identity.value) {
|
|
233
|
+
const actingId = identity.value?.id ?? "";
|
|
234
|
+
if (actingId && actingId !== expectedAgentUserId) {
|
|
235
|
+
identityMismatch = true;
|
|
236
|
+
actingAgentLabel = (ambientKey && findSurfaceLabelForKey(ambientKey)) || actingId.slice(0, 8);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Only a well-shaped array counts as "fetched" — a malformed 200 must not
|
|
240
|
+
// masquerade as "0 pending"; it falls back to the last-good count instead.
|
|
241
|
+
const proposalsRaw = proposals.status === "fulfilled"
|
|
242
|
+
? proposals.value?.proposals
|
|
243
|
+
: undefined;
|
|
244
|
+
const proposalsFetched = Array.isArray(proposalsRaw);
|
|
245
|
+
const proposalCount = Array.isArray(proposalsRaw)
|
|
246
|
+
? proposalsRaw.length
|
|
247
|
+
: prev?.proposalCount ?? 0;
|
|
248
|
+
const out = {
|
|
249
|
+
ts: Date.now(),
|
|
250
|
+
ok: true,
|
|
251
|
+
podUrl: cfg.podUrl,
|
|
252
|
+
activeWorkspaceId: cfg.workspaceId ?? "", // the lens THIS connection resolves to
|
|
253
|
+
workspaces,
|
|
254
|
+
projectName,
|
|
255
|
+
projectId,
|
|
256
|
+
skillCount,
|
|
257
|
+
proposalCount,
|
|
258
|
+
proposalsFetched: proposalsFetched || (prev?.proposalsFetched ?? false),
|
|
259
|
+
sessionGoal,
|
|
260
|
+
sessionId,
|
|
261
|
+
totalEntities,
|
|
262
|
+
actingAgentLabel,
|
|
263
|
+
identityMismatch,
|
|
264
|
+
};
|
|
265
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify(out));
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
// Preserve last good cache, just mark it not-ok so render can dim the dot.
|
|
269
|
+
if (prev) {
|
|
270
|
+
try {
|
|
271
|
+
fs.writeFileSync(CACHE_FILE, JSON.stringify({ ...prev, ok: false }));
|
|
272
|
+
}
|
|
273
|
+
catch { }
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
try {
|
|
278
|
+
fs.unlinkSync(LOCK_FILE);
|
|
279
|
+
}
|
|
280
|
+
catch { }
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// ── RENDER mode: stdin + cache → 3 lines (no network) ──────────────────
|
|
284
|
+
function render() {
|
|
285
|
+
let cc = {};
|
|
286
|
+
try {
|
|
287
|
+
const raw = fs.readFileSync(0, "utf-8");
|
|
288
|
+
if (raw?.trim())
|
|
289
|
+
cc = JSON.parse(raw);
|
|
290
|
+
}
|
|
291
|
+
catch { }
|
|
292
|
+
// The Claude session id — forwarded to the detached refresh so it resolves
|
|
293
|
+
// THIS session's lens (workspace/project/session), not a global guess.
|
|
294
|
+
const claudeSessionId = cc.session_id || process.env.CLAUDE_CODE_SESSION_ID;
|
|
295
|
+
const cache = readCache();
|
|
296
|
+
// Trigger a background refresh if cache is missing or stale.
|
|
297
|
+
if (!cache || Date.now() - cache.ts > REFRESH_TTL_MS)
|
|
298
|
+
triggerRefresh(claudeSessionId);
|
|
299
|
+
const pod = cache ?? emptyCache();
|
|
300
|
+
// ── Claude Code fields ───────────────────────────────────────────────
|
|
301
|
+
const modelName = (cc.model?.display_name ?? "").replace(/\s*\((?:1M|200K) context\)/, "").trim();
|
|
302
|
+
const ctxPct = cc.context_window?.used_percentage;
|
|
303
|
+
const cost = cc.cost?.total_cost_usd;
|
|
304
|
+
const linesAdd = cc.cost?.total_lines_added ?? 0;
|
|
305
|
+
const linesDel = cc.cost?.total_lines_removed ?? 0;
|
|
306
|
+
const rl = cc.rate_limits;
|
|
307
|
+
const fhPct = rl?.five_hour?.used_percentage;
|
|
308
|
+
const sdPct = rl?.seven_day?.used_percentage;
|
|
309
|
+
const fhReset = rl?.five_hour?.resets_at;
|
|
310
|
+
const vimMode = cc.vim?.mode;
|
|
311
|
+
const cwd = (cc.cwd ?? "");
|
|
312
|
+
let branch = "";
|
|
313
|
+
if (cwd) {
|
|
314
|
+
try {
|
|
315
|
+
branch = execSync(`git -C ${JSON.stringify(cwd)} --no-optional-locks symbolic-ref --short HEAD`, { encoding: "utf-8", timeout: 1000, stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
316
|
+
}
|
|
317
|
+
catch { /* not a git repo */ }
|
|
318
|
+
}
|
|
319
|
+
// ── Session stats (local file) ───────────────────────────────────────
|
|
320
|
+
let callCount = 0;
|
|
321
|
+
let sessionCount = 0;
|
|
322
|
+
try {
|
|
323
|
+
const ss = JSON.parse(fs.readFileSync(os.homedir() + "/.claude/.session-stats.json", "utf-8"));
|
|
324
|
+
const sessions = ss?.sessions;
|
|
325
|
+
if (sessions) {
|
|
326
|
+
sessionCount = Object.keys(sessions).length;
|
|
327
|
+
callCount = Object.values(sessions).reduce((s, v) => s + (v.total_calls ?? 0), 0);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch { }
|
|
331
|
+
// ── Pod dot: green=fresh, yellow=stale, grey=never fetched ───────────
|
|
332
|
+
let dot = `${D}○${X}`;
|
|
333
|
+
if (pod.ts > 0) {
|
|
334
|
+
const stale = !pod.ok || Date.now() - pod.ts > REFRESH_TTL_MS * 3;
|
|
335
|
+
dot = stale ? `${Y}●${X}` : `${G}●${X}`;
|
|
336
|
+
}
|
|
337
|
+
// Show the workspace THIS connection is scoped to. No fallback to
|
|
338
|
+
// workspaces[0] — an unset activeWorkspaceId means pod-wide, and faking an
|
|
339
|
+
// "active" workspace would hide that state from the 4-state lens (pod /
|
|
340
|
+
// project / project×workspace / workspace).
|
|
341
|
+
const activeWsEntry = pod.activeWorkspaceId
|
|
342
|
+
? pod.workspaces.find((w) => w.id === pod.activeWorkspaceId)
|
|
343
|
+
: undefined;
|
|
344
|
+
const described = describeLens({
|
|
345
|
+
workspace: pod.activeWorkspaceId ? { id: pod.activeWorkspaceId, name: activeWsEntry?.name } : undefined,
|
|
346
|
+
project: pod.projectId ? { id: pod.projectId, name: pod.projectName } : undefined,
|
|
347
|
+
});
|
|
348
|
+
const hasWs = Boolean(described.structured.workspace);
|
|
349
|
+
const hasProject = Boolean(described.structured.project);
|
|
350
|
+
const activeWs = described.structured.workspace?.name;
|
|
351
|
+
const activeWsId = described.structured.workspace?.id ?? "";
|
|
352
|
+
const activeWsCount = activeWsEntry?.count ?? 0;
|
|
353
|
+
// ─═─ LINE 1 — model · context bar · branch · vim ─═─────────────────────
|
|
354
|
+
const l1 = [];
|
|
355
|
+
if (modelName) {
|
|
356
|
+
l1.push(`${C}${modelName}${X}`);
|
|
357
|
+
if (branch)
|
|
358
|
+
l1.push(`${D}${branch}${X}`);
|
|
359
|
+
if (vimMode && vimMode !== "NORMAL")
|
|
360
|
+
l1.push(`${M}${vimMode}${X}`);
|
|
361
|
+
}
|
|
362
|
+
if (ctxPct !== undefined)
|
|
363
|
+
l1.push(` ${bar(ctxPct)} ${ctxColor(ctxPct)}${Math.round(ctxPct)}%${X}`);
|
|
364
|
+
if (l1.length)
|
|
365
|
+
console.log(l1.join(" "));
|
|
366
|
+
// ─═─ LINE 2 — pod dot · identity warning · lens state (pod/project/project×ws/ws) · session · metrics ─═──
|
|
367
|
+
const l2 = [dot];
|
|
368
|
+
// Identity safety: an inherited/foreign SYNAP_HUB_API_KEY (e.g. another
|
|
369
|
+
// agent's key) is otherwise invisible — surface it loudly, not clean.
|
|
370
|
+
if (pod.identityMismatch)
|
|
371
|
+
l2.push(`${R}⚠ as ${pod.actingAgentLabel || "unknown"}${X}`);
|
|
372
|
+
// PROJECT leads the lens fields — it's the "what am I working on" answer.
|
|
373
|
+
// cmd/ctrl-click opens the project home in the Synap app via the /open bounce
|
|
374
|
+
// (`project` is registered in apps/api/src/index.ts ALLOWED + handled by the
|
|
375
|
+
// browser deep-link handler, which switches the lens + lands on home).
|
|
376
|
+
// OSC 8 degrades to plain text where the terminal/renderer doesn't support it.
|
|
377
|
+
if (hasProject) {
|
|
378
|
+
const projectLink = pod.podUrl ? `${pod.podUrl}/open/project/${pod.projectId}` : "";
|
|
379
|
+
l2.push(`${BB}${osc8(projectLink, described.structured.project?.name ?? pod.projectId)}${X}`);
|
|
380
|
+
}
|
|
381
|
+
if (hasWs) {
|
|
382
|
+
// Same /open bounce — `workspace` switches the workspace lens + lands on home.
|
|
383
|
+
const wsLink = pod.podUrl && activeWsId ? `${pod.podUrl}/open/workspace/${activeWsId}` : "";
|
|
384
|
+
l2.push(activeWsId ? osc8(wsLink, activeWs ?? "") : activeWs ?? "");
|
|
385
|
+
if (activeWsCount > 0)
|
|
386
|
+
l2.push(`${compact(activeWsCount)} entities`);
|
|
387
|
+
}
|
|
388
|
+
else if (described.structured.podWide) {
|
|
389
|
+
l2.push(`${D}pod-wide${X}`);
|
|
390
|
+
}
|
|
391
|
+
if (pod.skillCount > 0)
|
|
392
|
+
l2.push(`${pod.skillCount} skills`);
|
|
393
|
+
if (pod.sessionGoal) {
|
|
394
|
+
const sg = pod.sessionId ? osc8(`synap://open/session/${pod.sessionId}`, pod.sessionGoal) : pod.sessionGoal;
|
|
395
|
+
l2.push(`${D}▸${X} ${Y}${sg}${X}`);
|
|
396
|
+
}
|
|
397
|
+
if (pod.proposalCount > 0) {
|
|
398
|
+
// cmd/ctrl-click opens the Proposals review app via the /open bounce
|
|
399
|
+
// (bare `proposals` keyword → synap://open/proposals → browser opens the app).
|
|
400
|
+
const proposalsLink = pod.podUrl ? `${pod.podUrl}/open/proposals` : "";
|
|
401
|
+
const label = `${pod.proposalCount} proposals`;
|
|
402
|
+
l2.push(`${D}↳${X} ${Y}${proposalsLink ? osc8(proposalsLink, label) : label}${X}`);
|
|
403
|
+
}
|
|
404
|
+
else if (pod.proposalsFetched) {
|
|
405
|
+
// Genuinely fetched and empty — distinct from "never fetched" so the line
|
|
406
|
+
// never silently omits a signal a user might mistake for "not checked yet".
|
|
407
|
+
l2.push(`${D}↳ 0 proposals${X}`);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
// No successful refresh has completed yet (fresh cache / all refreshes failed).
|
|
411
|
+
l2.push(`${D}↳ proposals —${X}`);
|
|
412
|
+
}
|
|
413
|
+
console.log(l2.join(" · "));
|
|
414
|
+
// ─═─ LINE 3 — cost · rate limits · session stats ─═─────────────────────
|
|
415
|
+
const l3 = [];
|
|
416
|
+
if (cost !== undefined && cost > 0) {
|
|
417
|
+
l3.push(`${D}$${cost.toFixed(2)}${X}`);
|
|
418
|
+
if (linesAdd > 0)
|
|
419
|
+
l3.push(`${D}+${linesAdd}/-${linesDel}${X}`);
|
|
420
|
+
}
|
|
421
|
+
if (fhPct !== undefined) {
|
|
422
|
+
if (l3.length)
|
|
423
|
+
l3.push(`${D}│${X}`);
|
|
424
|
+
l3.push(`${D}5h${X} ${rateColor(fhPct)}${Math.round(fhPct)}%${X}`);
|
|
425
|
+
}
|
|
426
|
+
if (sdPct !== undefined)
|
|
427
|
+
l3.push(`${D}7d${X} ${rateColor(sdPct)}${Math.round(sdPct)}%${X}`);
|
|
428
|
+
if (fhReset !== undefined && (fhPct ?? 0) >= 60) {
|
|
429
|
+
const rem = fhReset - Math.floor(Date.now() / 1000);
|
|
430
|
+
if (rem > 0)
|
|
431
|
+
l3.push(`${D}resets ${Math.floor(rem / 3600)}h${String(Math.floor((rem % 3600) / 60)).padStart(2, "0")}${X}`);
|
|
432
|
+
}
|
|
433
|
+
if (callCount > 0) {
|
|
434
|
+
if (l3.length)
|
|
435
|
+
l3.push(`${D}│${X}`);
|
|
436
|
+
l3.push(`${D}${compact(callCount)} calls · ${sessionCount} sessions${X}`);
|
|
437
|
+
}
|
|
438
|
+
if (l3.length)
|
|
439
|
+
console.log(l3.join(" "));
|
|
440
|
+
}
|
|
441
|
+
// ── Entry ──────────────────────────────────────────────────────────────
|
|
442
|
+
export async function statusline(opts) {
|
|
443
|
+
if (opts?.refresh) {
|
|
444
|
+
await refresh();
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
render();
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=statusline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusline.js","sourceRoot":"","sources":["../../src/commands/statusline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap subscribe
|
|
3
|
+
*
|
|
4
|
+
* Long-poll the pod's Pulse/subscription feed and stream events as NDJSON.
|
|
5
|
+
* Polls GET /api/hub/subscriptions every 3 seconds with a cursor.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* synap subscribe # all events
|
|
9
|
+
* synap subscribe --event proposal.* # filter by eventType pattern
|
|
10
|
+
* synap subscribe --limit 50 # events per poll
|
|
11
|
+
*/
|
|
12
|
+
export interface SubscribeOpts {
|
|
13
|
+
event?: string;
|
|
14
|
+
limit?: string;
|
|
15
|
+
json?: boolean;
|
|
16
|
+
podUrl?: string;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function subscribeEvents(opts: SubscribeOpts): Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap subscribe
|
|
3
|
+
*
|
|
4
|
+
* Long-poll the pod's Pulse/subscription feed and stream events as NDJSON.
|
|
5
|
+
* Polls GET /api/hub/subscriptions every 3 seconds with a cursor.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* synap subscribe # all events
|
|
9
|
+
* synap subscribe --event proposal.* # filter by eventType pattern
|
|
10
|
+
* synap subscribe --limit 50 # events per poll
|
|
11
|
+
*/
|
|
12
|
+
import { log } from "../utils/logger.js";
|
|
13
|
+
import { resolveHubConfig, hubGet } from "../lib/hub-client.js";
|
|
14
|
+
import { unwrapList } from "../lib/unwrapList.js";
|
|
15
|
+
/** Simple glob match: "proposal.*" matches "proposal.approved", "proposal.created", etc. */
|
|
16
|
+
function matchesPattern(eventType, pattern) {
|
|
17
|
+
if (pattern === "*")
|
|
18
|
+
return true;
|
|
19
|
+
if (pattern.endsWith(".*")) {
|
|
20
|
+
const prefix = pattern.slice(0, -2);
|
|
21
|
+
return eventType === prefix || eventType.startsWith(prefix + ".");
|
|
22
|
+
}
|
|
23
|
+
// Escape regex special chars except * which we convert to .*
|
|
24
|
+
const regexStr = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
25
|
+
return new RegExp(`^${regexStr}$`).test(eventType);
|
|
26
|
+
}
|
|
27
|
+
export async function subscribeEvents(opts) {
|
|
28
|
+
const cfg = await resolveHubConfig(opts);
|
|
29
|
+
const limit = parseInt(opts.limit ?? "20", 10);
|
|
30
|
+
if (!opts.json) {
|
|
31
|
+
log.dim("Subscribing to pod events... (Ctrl+C to stop)");
|
|
32
|
+
if (opts.event) {
|
|
33
|
+
log.dim(` filter: ${opts.event}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Seen-event deduplication cache (keep last 500 ids)
|
|
37
|
+
const seenIds = new Set();
|
|
38
|
+
const MAX_SEEN = 500;
|
|
39
|
+
// Start cursor at now so we only get future events
|
|
40
|
+
let cursor = new Date().toISOString();
|
|
41
|
+
let intervalHandle = null;
|
|
42
|
+
let stopped = false;
|
|
43
|
+
let consecutiveErrors = 0;
|
|
44
|
+
const poll = async () => {
|
|
45
|
+
if (stopped)
|
|
46
|
+
return;
|
|
47
|
+
try {
|
|
48
|
+
const params = { limit, since: cursor };
|
|
49
|
+
const res = await hubGet("/subscriptions", params, cfg);
|
|
50
|
+
consecutiveErrors = 0;
|
|
51
|
+
const events = unwrapList(res, ["events", "items"]);
|
|
52
|
+
for (const event of events) {
|
|
53
|
+
const id = String(event.id ?? "");
|
|
54
|
+
if (id && seenIds.has(id))
|
|
55
|
+
continue;
|
|
56
|
+
if (id) {
|
|
57
|
+
seenIds.add(id);
|
|
58
|
+
if (seenIds.size > MAX_SEEN) {
|
|
59
|
+
const first = seenIds.values().next().value;
|
|
60
|
+
if (first !== undefined)
|
|
61
|
+
seenIds.delete(first);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const eventType = String(event.eventType ?? event.type ?? "");
|
|
65
|
+
if (opts.event && eventType && !matchesPattern(eventType, opts.event))
|
|
66
|
+
continue;
|
|
67
|
+
const createdAt = String(event.createdAt ?? event.timestamp ?? "");
|
|
68
|
+
if (createdAt && createdAt > cursor)
|
|
69
|
+
cursor = createdAt;
|
|
70
|
+
console.log(JSON.stringify(event));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
consecutiveErrors++;
|
|
75
|
+
if (consecutiveErrors === 3 && !opts.json) {
|
|
76
|
+
log.dim(" Pod unreachable — retrying...");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// Graceful shutdown on SIGINT (Ctrl+C)
|
|
81
|
+
process.on("SIGINT", () => {
|
|
82
|
+
stopped = true;
|
|
83
|
+
if (intervalHandle !== null)
|
|
84
|
+
clearInterval(intervalHandle);
|
|
85
|
+
process.exit(0);
|
|
86
|
+
});
|
|
87
|
+
// Run immediately then every 3 seconds
|
|
88
|
+
await poll();
|
|
89
|
+
intervalHandle = setInterval(() => { void poll(); }, 3_000);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=subscribe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribe.js","sourceRoot":"","sources":["../../src/commands/subscribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* synap tools — Add and manage external service tools (credentials + connections)
|
|
3
|
+
*
|
|
4
|
+
* Subcommands: list, connect, disconnect, sync, schema
|
|
5
|
+
*/
|
|
6
|
+
export interface ConnectOpts {
|
|
7
|
+
workspace?: string;
|
|
8
|
+
podUrl?: string;
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function toolsConnect(service: string | undefined, opts: ConnectOpts): Promise<void>;
|
|
12
|
+
export interface ListOpts {
|
|
13
|
+
json?: boolean;
|
|
14
|
+
workspace?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function toolsList(opts: ListOpts): Promise<void>;
|
|
17
|
+
export interface SyncOpts {
|
|
18
|
+
workspace?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function toolsSync(provider: string, opts: SyncOpts): Promise<void>;
|
|
21
|
+
export interface DisconnectOpts {
|
|
22
|
+
workspace?: string;
|
|
23
|
+
force?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function toolsDisconnect(provider: string, opts: DisconnectOpts): Promise<void>;
|
|
26
|
+
export interface SchemaOpts {
|
|
27
|
+
writeContext?: string | boolean;
|
|
28
|
+
json?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare function toolsSchema(opts: SchemaOpts): Promise<void>;
|