opensquid 0.5.441 → 0.5.447
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 +1 -0
- package/dist/functions/arm_scope.d.ts +27 -0
- package/dist/functions/arm_scope.d.ts.map +1 -0
- package/dist/functions/arm_scope.js +52 -0
- package/dist/functions/arm_scope.js.map +1 -0
- package/dist/functions/index.d.ts +1 -0
- package/dist/functions/index.d.ts.map +1 -1
- package/dist/functions/index.js +1 -0
- package/dist/functions/index.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts.map +1 -1
- package/dist/runtime/bootstrap.js +2 -0
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/handoff/render.d.ts +5 -4
- package/dist/runtime/handoff/render.d.ts.map +1 -1
- package/dist/runtime/handoff/render.js +7 -7
- package/dist/runtime/handoff/render.js.map +1 -1
- package/dist/runtime/hooks/active_task_mirror.js +0 -0
- package/dist/runtime/hooks/apply_patch.js +0 -0
- package/dist/runtime/hooks/dispatch.js +0 -0
- package/dist/runtime/hooks/hook_output.js +0 -0
- package/dist/runtime/hooks/memory_reconcile.js +0 -0
- package/dist/runtime/hooks/new_project_detect.js +0 -0
- package/dist/runtime/hooks/profession_resolver.js +0 -0
- package/dist/runtime/hooks/scope_intent.js +0 -0
- package/dist/runtime/hooks/session_id.js +0 -0
- package/dist/runtime/hooks/session_liveness.js +0 -0
- package/dist/runtime/hooks/stop_drive.js +0 -0
- package/dist/runtime/hooks/stop_stream.js +0 -0
- package/dist/runtime/hooks/subagent_guard.js +0 -0
- package/dist/runtime/hooks/transcript.js +0 -0
- package/dist/runtime/hooks/transcript_tasks.js +0 -0
- package/dist/runtime/ralph/orchestrator.d.ts.map +1 -1
- package/dist/runtime/ralph/orchestrator.js +2 -1
- package/dist/runtime/ralph/orchestrator.js.map +1 -1
- package/dist/setup/cli/limits_state.d.ts.map +1 -1
- package/dist/setup/cli/limits_state.js +6 -40
- package/dist/setup/cli/limits_state.js.map +1 -1
- package/dist/setup/cli/pack_walk.d.ts +32 -0
- package/dist/setup/cli/pack_walk.d.ts.map +1 -0
- package/dist/setup/cli/pack_walk.js +76 -0
- package/dist/setup/cli/pack_walk.js.map +1 -0
- package/dist/setup/cli/permissions_state.d.ts.map +1 -1
- package/dist/setup/cli/permissions_state.js +6 -37
- package/dist/setup/cli/permissions_state.js.map +1 -1
- package/dist/setup/cli/triggers_state.d.ts.map +1 -1
- package/dist/setup/cli/triggers_state.js +3 -29
- package/dist/setup/cli/triggers_state.js.map +1 -1
- package/dist/workgraph/events.d.ts.map +1 -1
- package/dist/workgraph/events.js +10 -0
- package/dist/workgraph/events.js.map +1 -1
- package/dist/workgraph/store.d.ts.map +1 -1
- package/dist/workgraph/store.js +5 -0
- package/dist/workgraph/store.js.map +1 -1
- package/dist/workgraph/types.d.ts +2 -1
- package/dist/workgraph/types.d.ts.map +1 -1
- package/docs/ARCHITECTURE.md +268 -0
- package/package.json +5 -3
- package/packs/builtin/coding-flow/skills/entry-and-handoffs/skill.yaml +13 -17
- package/dist/anti-drift/evaluator.d.ts +0 -88
- package/dist/anti-drift/evaluator.d.ts.map +0 -1
- package/dist/anti-drift/evaluator.js +0 -417
- package/dist/anti-drift/evaluator.js.map +0 -1
- package/dist/anti-drift/evaluator.test.js +0 -78
- package/dist/anti-drift/rules.d.ts +0 -80
- package/dist/anti-drift/rules.d.ts.map +0 -1
- package/dist/anti-drift/rules.js +0 -368
- package/dist/anti-drift/rules.js.map +0 -1
- package/dist/anti-drift/rules.test.js +0 -213
- package/dist/anti-drift/state.d.ts +0 -107
- package/dist/anti-drift/state.d.ts.map +0 -1
- package/dist/anti-drift/state.js +0 -177
- package/dist/anti-drift/state.js.map +0 -1
- package/dist/anti-drift/state.test.js +0 -120
- package/dist/chat/adapters/discord.d.ts +0 -41
- package/dist/chat/adapters/discord.d.ts.map +0 -1
- package/dist/chat/adapters/discord.js +0 -176
- package/dist/chat/adapters/discord.js.map +0 -1
- package/dist/chat/adapters/discord.test.js +0 -25
- package/dist/chat/adapters/slack.d.ts +0 -43
- package/dist/chat/adapters/slack.d.ts.map +0 -1
- package/dist/chat/adapters/slack.js +0 -172
- package/dist/chat/adapters/slack.js.map +0 -1
- package/dist/chat/adapters/slack.test.js +0 -30
- package/dist/chat/adapters/telegram.d.ts +0 -148
- package/dist/chat/adapters/telegram.d.ts.map +0 -1
- package/dist/chat/adapters/telegram.js +0 -498
- package/dist/chat/adapters/telegram.js.map +0 -1
- package/dist/chat/adapters/telegram.test.js +0 -94
- package/dist/chat/config.d.ts +0 -98
- package/dist/chat/config.d.ts.map +0 -1
- package/dist/chat/config.js +0 -185
- package/dist/chat/config.js.map +0 -1
- package/dist/chat/daemon/active-project.d.ts +0 -17
- package/dist/chat/daemon/active-project.d.ts.map +0 -1
- package/dist/chat/daemon/active-project.js +0 -23
- package/dist/chat/daemon/active-project.js.map +0 -1
- package/dist/chat/daemon/autospawn.d.ts +0 -40
- package/dist/chat/daemon/autospawn.d.ts.map +0 -1
- package/dist/chat/daemon/autospawn.js +0 -129
- package/dist/chat/daemon/autospawn.js.map +0 -1
- package/dist/chat/daemon/autospawn.test.js +0 -112
- package/dist/chat/daemon/cli.d.ts +0 -18
- package/dist/chat/daemon/cli.d.ts.map +0 -1
- package/dist/chat/daemon/cli.js +0 -71
- package/dist/chat/daemon/cli.js.map +0 -1
- package/dist/chat/daemon/collisions.js +0 -384
- package/dist/chat/daemon/health-check.d.ts +0 -69
- package/dist/chat/daemon/health-check.d.ts.map +0 -1
- package/dist/chat/daemon/health-check.js +0 -112
- package/dist/chat/daemon/health-check.js.map +0 -1
- package/dist/chat/daemon/inbox-read.d.ts +0 -35
- package/dist/chat/daemon/inbox-read.d.ts.map +0 -1
- package/dist/chat/daemon/inbox-read.js +0 -75
- package/dist/chat/daemon/inbox-read.js.map +0 -1
- package/dist/chat/daemon/inbox-read.test.js +0 -97
- package/dist/chat/daemon/inbox.d.ts +0 -63
- package/dist/chat/daemon/inbox.d.ts.map +0 -1
- package/dist/chat/daemon/inbox.js +0 -56
- package/dist/chat/daemon/inbox.js.map +0 -1
- package/dist/chat/daemon/inbox.test.js +0 -110
- package/dist/chat/daemon/lifecycle.d.ts +0 -71
- package/dist/chat/daemon/lifecycle.d.ts.map +0 -1
- package/dist/chat/daemon/lifecycle.js +0 -221
- package/dist/chat/daemon/lifecycle.js.map +0 -1
- package/dist/chat/daemon/lifecycle.test.js +0 -163
- package/dist/chat/daemon/protocol.d.ts +0 -107
- package/dist/chat/daemon/protocol.d.ts.map +0 -1
- package/dist/chat/daemon/protocol.js +0 -54
- package/dist/chat/daemon/protocol.js.map +0 -1
- package/dist/chat/daemon/routing.d.ts +0 -140
- package/dist/chat/daemon/routing.d.ts.map +0 -1
- package/dist/chat/daemon/routing.js +0 -198
- package/dist/chat/daemon/routing.js.map +0 -1
- package/dist/chat/daemon/routing.test.js +0 -259
- package/dist/chat/daemon/rpc-client.d.ts +0 -45
- package/dist/chat/daemon/rpc-client.d.ts.map +0 -1
- package/dist/chat/daemon/rpc-client.js +0 -133
- package/dist/chat/daemon/rpc-client.js.map +0 -1
- package/dist/chat/daemon/rpc-server.d.ts +0 -39
- package/dist/chat/daemon/rpc-server.d.ts.map +0 -1
- package/dist/chat/daemon/rpc-server.js +0 -385
- package/dist/chat/daemon/rpc-server.js.map +0 -1
- package/dist/chat/daemon/rpc.test.js +0 -177
- package/dist/chat/daemon/subscribers.js +0 -257
- package/dist/chat/daemon/worker.d.ts +0 -27
- package/dist/chat/daemon/worker.d.ts.map +0 -1
- package/dist/chat/daemon/worker.js +0 -313
- package/dist/chat/daemon/worker.js.map +0 -1
- package/dist/chat/daemon/workspace-topic.js +0 -324
- package/dist/chat/env-token.d.ts +0 -60
- package/dist/chat/env-token.d.ts.map +0 -1
- package/dist/chat/env-token.js +0 -137
- package/dist/chat/env-token.js.map +0 -1
- package/dist/chat/env-token.test.js +0 -160
- package/dist/chat/factory.d.ts +0 -30
- package/dist/chat/factory.d.ts.map +0 -1
- package/dist/chat/factory.js +0 -50
- package/dist/chat/factory.js.map +0 -1
- package/dist/chat/factory.test.js +0 -55
- package/dist/chat/gateway.d.ts +0 -176
- package/dist/chat/gateway.d.ts.map +0 -1
- package/dist/chat/gateway.js +0 -146
- package/dist/chat/gateway.js.map +0 -1
- package/dist/chat/gateway.test.js +0 -192
- package/dist/claude-md.d.ts +0 -39
- package/dist/claude-md.d.ts.map +0 -1
- package/dist/claude-md.js +0 -113
- package/dist/claude-md.js.map +0 -1
- package/dist/claude-md.test.js +0 -91
- package/dist/codex/activate.d.ts +0 -66
- package/dist/codex/activate.d.ts.map +0 -1
- package/dist/codex/activate.js +0 -329
- package/dist/codex/activate.js.map +0 -1
- package/dist/codex/activate.test.js +0 -229
- package/dist/codex/bundled-default/bundled-default.test.js +0 -161
- package/dist/codex/cli-publish.test.js +0 -133
- package/dist/codex/cli.d.ts +0 -35
- package/dist/codex/cli.d.ts.map +0 -1
- package/dist/codex/cli.js +0 -554
- package/dist/codex/cli.js.map +0 -1
- package/dist/codex/cli.test.js +0 -277
- package/dist/codex/import-skill-md.d.ts +0 -53
- package/dist/codex/import-skill-md.d.ts.map +0 -1
- package/dist/codex/import-skill-md.js +0 -236
- package/dist/codex/import-skill-md.js.map +0 -1
- package/dist/codex/import-skill-md.test.js +0 -225
- package/dist/codex/loader.d.ts +0 -27
- package/dist/codex/loader.d.ts.map +0 -1
- package/dist/codex/loader.js +0 -86
- package/dist/codex/loader.js.map +0 -1
- package/dist/codex/loader.test.js +0 -75
- package/dist/codex/parse.d.ts +0 -28
- package/dist/codex/parse.d.ts.map +0 -1
- package/dist/codex/parse.js +0 -309
- package/dist/codex/parse.js.map +0 -1
- package/dist/codex/parse.test.js +0 -241
- package/dist/codex/store.d.ts +0 -87
- package/dist/codex/store.d.ts.map +0 -1
- package/dist/codex/store.js +0 -205
- package/dist/codex/store.js.map +0 -1
- package/dist/codex/store.test.js +0 -242
- package/dist/codex/types.d.ts +0 -398
- package/dist/codex/types.d.ts.map +0 -1
- package/dist/codex/types.js +0 -21
- package/dist/codex/types.js.map +0 -1
- package/dist/config.d.ts +0 -53
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -202
- package/dist/config.js.map +0 -1
- package/dist/config.test.js +0 -117
- package/dist/engine/cli.d.ts +0 -14
- package/dist/engine/cli.d.ts.map +0 -1
- package/dist/engine/cli.js +0 -171
- package/dist/engine/cli.js.map +0 -1
- package/dist/engine/client.d.ts +0 -219
- package/dist/engine/client.d.ts.map +0 -1
- package/dist/engine/client.js +0 -312
- package/dist/engine/client.js.map +0 -1
- package/dist/engine/config.d.ts +0 -62
- package/dist/engine/config.d.ts.map +0 -1
- package/dist/engine/config.js +0 -223
- package/dist/engine/config.js.map +0 -1
- package/dist/engine/index.d.ts +0 -17
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js +0 -16
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/resolver.d.ts +0 -62
- package/dist/engine/resolver.d.ts.map +0 -1
- package/dist/engine/resolver.js +0 -103
- package/dist/engine/resolver.js.map +0 -1
- package/dist/engine/singleton.d.ts +0 -95
- package/dist/engine/singleton.d.ts.map +0 -1
- package/dist/engine/singleton.js +0 -325
- package/dist/engine/singleton.js.map +0 -1
- package/dist/engine/types.d.ts +0 -402
- package/dist/engine/types.d.ts.map +0 -1
- package/dist/engine/types.js +0 -22
- package/dist/engine/types.js.map +0 -1
- package/dist/engine-binary-resolver.js +0 -110
- package/dist/engine-binary-resolver.test.js +0 -61
- package/dist/engine-cli.js +0 -60
- package/dist/engine-client.js +0 -301
- package/dist/engine-client.test.js +0 -118
- package/dist/functions/chain_state.d.ts +0 -51
- package/dist/functions/chain_state.d.ts.map +0 -1
- package/dist/functions/chain_state.js +0 -59
- package/dist/functions/chain_state.js.map +0 -1
- package/dist/hooks/drift-catalog.d.ts +0 -68
- package/dist/hooks/drift-catalog.d.ts.map +0 -1
- package/dist/hooks/drift-catalog.js +0 -184
- package/dist/hooks/drift-catalog.js.map +0 -1
- package/dist/hooks/drift-catalog.test.js +0 -154
- package/dist/hooks/drift-patterns.d.ts +0 -110
- package/dist/hooks/drift-patterns.d.ts.map +0 -1
- package/dist/hooks/drift-patterns.js +0 -289
- package/dist/hooks/drift-patterns.js.map +0 -1
- package/dist/hooks/drift-patterns.test.js +0 -325
- package/dist/hooks/engine-vocab-gate.d.ts +0 -108
- package/dist/hooks/engine-vocab-gate.d.ts.map +0 -1
- package/dist/hooks/engine-vocab-gate.js +0 -225
- package/dist/hooks/engine-vocab-gate.js.map +0 -1
- package/dist/hooks/engine-vocab-gate.test.js +0 -170
- package/dist/hooks/heartbeat.d.ts +0 -107
- package/dist/hooks/heartbeat.d.ts.map +0 -1
- package/dist/hooks/heartbeat.js +0 -316
- package/dist/hooks/heartbeat.js.map +0 -1
- package/dist/hooks/heartbeat.test.js +0 -393
- package/dist/hooks/honesty-ledger-session-scope.test.js +0 -100
- package/dist/hooks/honesty-ledger.d.ts +0 -123
- package/dist/hooks/honesty-ledger.d.ts.map +0 -1
- package/dist/hooks/honesty-ledger.js +0 -226
- package/dist/hooks/honesty-ledger.js.map +0 -1
- package/dist/hooks/honesty-ledger.test.js +0 -466
- package/dist/hooks/inline-report-check.d.ts +0 -63
- package/dist/hooks/inline-report-check.d.ts.map +0 -1
- package/dist/hooks/inline-report-check.js +0 -88
- package/dist/hooks/inline-report-check.js.map +0 -1
- package/dist/hooks/inline-report-check.test.js +0 -96
- package/dist/hooks/pre-tool-use.d.ts +0 -62
- package/dist/hooks/pre-tool-use.d.ts.map +0 -1
- package/dist/hooks/pre-tool-use.js +0 -342
- package/dist/hooks/pre-tool-use.js.map +0 -1
- package/dist/hooks/pre-tool-use.test.js +0 -134
- package/dist/hooks/session-end.d.ts +0 -15
- package/dist/hooks/session-end.d.ts.map +0 -1
- package/dist/hooks/session-end.js +0 -60
- package/dist/hooks/session-end.js.map +0 -1
- package/dist/hooks/session-end.test.js +0 -52
- package/dist/hooks/stop.d.ts +0 -35
- package/dist/hooks/stop.d.ts.map +0 -1
- package/dist/hooks/stop.js +0 -136
- package/dist/hooks/stop.js.map +0 -1
- package/dist/hooks/transcript-active-task.test.js +0 -342
- package/dist/hooks/transcript.d.ts +0 -26
- package/dist/hooks/transcript.d.ts.map +0 -1
- package/dist/hooks/transcript.js +0 -266
- package/dist/hooks/transcript.js.map +0 -1
- package/dist/hooks/transcript.test.js +0 -103
- package/dist/hooks/user-prompt-submit.d.ts +0 -74
- package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/hooks/user-prompt-submit.js +0 -256
- package/dist/hooks/user-prompt-submit.js.map +0 -1
- package/dist/hooks/user-prompt-submit.test.js +0 -118
- package/dist/hooks/versioning-gate.d.ts +0 -101
- package/dist/hooks/versioning-gate.d.ts.map +0 -1
- package/dist/hooks/versioning-gate.js +0 -245
- package/dist/hooks/versioning-gate.js.map +0 -1
- package/dist/hooks/versioning-gate.test.js +0 -368
- package/dist/hooks/workflow-gate.d.ts +0 -64
- package/dist/hooks/workflow-gate.d.ts.map +0 -1
- package/dist/hooks/workflow-gate.js +0 -152
- package/dist/hooks/workflow-gate.js.map +0 -1
- package/dist/hooks/workflow-gate.test.js +0 -197
- package/dist/hooks-cli.d.ts +0 -25
- package/dist/hooks-cli.d.ts.map +0 -1
- package/dist/hooks-cli.js +0 -286
- package/dist/hooks-cli.js.map +0 -1
- package/dist/hooks-cli.test.js +0 -148
- package/dist/origin.d.ts +0 -16
- package/dist/origin.d.ts.map +0 -1
- package/dist/origin.js +0 -92
- package/dist/origin.js.map +0 -1
- package/dist/packs/seed_lessons_ingest.d.ts +0 -30
- package/dist/packs/seed_lessons_ingest.d.ts.map +0 -1
- package/dist/packs/seed_lessons_ingest.js +0 -107
- package/dist/packs/seed_lessons_ingest.js.map +0 -1
- package/dist/project-cli.d.ts +0 -7
- package/dist/project-cli.d.ts.map +0 -1
- package/dist/project-cli.js +0 -145
- package/dist/project-cli.js.map +0 -1
- package/dist/project.d.ts +0 -127
- package/dist/project.d.ts.map +0 -1
- package/dist/project.js +0 -281
- package/dist/project.js.map +0 -1
- package/dist/project.test.js +0 -287
- package/dist/rag/backends/loop_engine.d.ts +0 -61
- package/dist/rag/backends/loop_engine.d.ts.map +0 -1
- package/dist/rag/backends/loop_engine.js +0 -160
- package/dist/rag/backends/loop_engine.js.map +0 -1
- package/dist/recall.d.ts +0 -82
- package/dist/recall.d.ts.map +0 -1
- package/dist/recall.js +0 -81
- package/dist/recall.js.map +0 -1
- package/dist/runtime/agent_bridge/autospawn.d.ts +0 -131
- package/dist/runtime/agent_bridge/autospawn.d.ts.map +0 -1
- package/dist/runtime/agent_bridge/autospawn.js +0 -251
- package/dist/runtime/agent_bridge/autospawn.js.map +0 -1
- package/dist/runtime/chain_state.d.ts +0 -124
- package/dist/runtime/chain_state.d.ts.map +0 -1
- package/dist/runtime/chain_state.js +0 -189
- package/dist/runtime/chain_state.js.map +0 -1
- package/dist/runtime/hooks/permission_decision.d.ts +0 -34
- package/dist/runtime/hooks/permission_decision.d.ts.map +0 -1
- package/dist/runtime/hooks/permission_decision.js +0 -39
- package/dist/runtime/hooks/permission_decision.js.map +0 -1
- package/dist/runtime/workflow_fsm.d.ts +0 -21
- package/dist/runtime/workflow_fsm.d.ts.map +0 -1
- package/dist/runtime/workflow_fsm.js +0 -25
- package/dist/runtime/workflow_fsm.js.map +0 -1
- package/dist/runtime/workflow_map.d.ts +0 -26
- package/dist/runtime/workflow_map.d.ts.map +0 -1
- package/dist/runtime/workflow_map.js +0 -38
- package/dist/runtime/workflow_map.js.map +0 -1
- package/dist/scope.d.ts +0 -48
- package/dist/scope.d.ts.map +0 -1
- package/dist/scope.js +0 -111
- package/dist/scope.js.map +0 -1
- package/dist/setup/cli/topic_create_step.d.ts +0 -84
- package/dist/setup/cli/topic_create_step.d.ts.map +0 -1
- package/dist/setup/cli/topic_create_step.js +0 -213
- package/dist/setup/cli/topic_create_step.js.map +0 -1
- package/dist/system-export.d.ts +0 -65
- package/dist/system-export.d.ts.map +0 -1
- package/dist/system-export.js +0 -194
- package/dist/system-export.js.map +0 -1
- package/dist/utterance/classifier.d.ts +0 -53
- package/dist/utterance/classifier.d.ts.map +0 -1
- package/dist/utterance/classifier.js +0 -184
- package/dist/utterance/classifier.js.map +0 -1
- package/dist/utterance/classifier.test.js +0 -147
package/dist/hooks/heartbeat.js
DELETED
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token-threshold heartbeat — opensquid's in-ecosystem replacement for
|
|
3
|
-
* the auto-classifier subprocess.
|
|
4
|
-
*
|
|
5
|
-
* The agent (Claude Code itself) is the LLM in the loop and is already
|
|
6
|
-
* authenticated. There is no reason to spawn a second LLM subprocess
|
|
7
|
-
* to classify what the user said — the agent can do that work inline
|
|
8
|
-
* per the CLAUDE.md classify-and-act block.
|
|
9
|
-
*
|
|
10
|
-
* What the agent IS bad at: noticing when its in-context understanding
|
|
11
|
-
* has drifted enough that it should re-anchor via `recall`. That's a
|
|
12
|
-
* timing problem opensquid can solve cleanly: count tokens in the
|
|
13
|
-
* transcript, compare to a checkpoint, and if the delta crosses a
|
|
14
|
-
* threshold, drop a one-line nudge into the next turn's UserPromptSubmit
|
|
15
|
-
* stdout so the agent sees it at the top of its system context.
|
|
16
|
-
*
|
|
17
|
-
* Flow:
|
|
18
|
-
* Stop hook (every turn) → `checkAndMaybeArm(sessionId, transcriptPath)`
|
|
19
|
-
* - Estimates total transcript tokens (char count / 4)
|
|
20
|
-
* - Loads last checkpoint from `<data-root>/sessions/<sid>/heartbeat-checkpoint.json`
|
|
21
|
-
* - If (current - last) >= threshold, writes a marker at
|
|
22
|
-
* `<data-root>/sessions/<sid>/heartbeat-pending.txt` AND updates
|
|
23
|
-
* the checkpoint to the current count
|
|
24
|
-
* UserPromptSubmit hook (next turn) → `consumePendingHeartbeat(sessionId)`
|
|
25
|
-
* - Reads marker if present, returns its contents (for stdout injection)
|
|
26
|
-
* - Deletes the marker so the nudge fires exactly once per crossing
|
|
27
|
-
*
|
|
28
|
-
* Threshold: `OPENSQUID_HEARTBEAT_TOKENS` env, default 20000.
|
|
29
|
-
* Calibrated against the existing CLAUDE.md "drifts after ~10 unrelated
|
|
30
|
-
* turns" observation (~2000 tokens per turn typical).
|
|
31
|
-
*
|
|
32
|
-
* Zero subprocess. Zero external LLM. Zero new dependency. The agent
|
|
33
|
-
* (which already exists in the loop) does the actual recall + classify
|
|
34
|
-
* work inline after seeing the nudge.
|
|
35
|
-
*/
|
|
36
|
-
import { promises as fs } from "node:fs";
|
|
37
|
-
import * as path from "node:path";
|
|
38
|
-
import { resolveDataRoot } from "../codex/store.js";
|
|
39
|
-
/** Default threshold — see file docstring for rationale. */
|
|
40
|
-
export const DEFAULT_HEARTBEAT_TOKENS = 20_000;
|
|
41
|
-
/**
|
|
42
|
-
* Resolve the configured heartbeat threshold. Env var `OPENSQUID_HEARTBEAT_TOKENS`
|
|
43
|
-
* overrides; values <= 0 or non-numeric fall back to the default. Returning a
|
|
44
|
-
* sentinel `Infinity` would let callers disable cheaply, but we keep the
|
|
45
|
-
* contract simple: any positive integer is honored.
|
|
46
|
-
*/
|
|
47
|
-
export function heartbeatThresholdTokens() {
|
|
48
|
-
const raw = process.env.OPENSQUID_HEARTBEAT_TOKENS;
|
|
49
|
-
if (!raw)
|
|
50
|
-
return DEFAULT_HEARTBEAT_TOKENS;
|
|
51
|
-
const n = Number.parseInt(raw, 10);
|
|
52
|
-
if (!Number.isFinite(n) || n <= 0)
|
|
53
|
-
return DEFAULT_HEARTBEAT_TOKENS;
|
|
54
|
-
return n;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Rough token estimate from raw text — char-count / 4. Cheap, dependency-
|
|
58
|
-
* free, and accurate enough for "did the conversation grow by 20K tokens
|
|
59
|
-
* since last checkpoint" decisions. Real tokenizers (tiktoken,
|
|
60
|
-
* @anthropic-ai/tokenizer) would be more accurate but add a runtime dep
|
|
61
|
-
* for marginal gain on a threshold comparison.
|
|
62
|
-
*/
|
|
63
|
-
export function estimateTokens(text) {
|
|
64
|
-
if (!text)
|
|
65
|
-
return 0;
|
|
66
|
-
return Math.ceil(text.length / 4);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Read the Claude Code transcript file and estimate the agent-facing
|
|
70
|
-
* token count for "did the conversation drift since last checkpoint."
|
|
71
|
-
*
|
|
72
|
-
* 0.7.7 (#161) — replaces the previous whole-file char/4 estimate
|
|
73
|
-
* which inflated massively on long sessions because the transcript
|
|
74
|
-
* JSONL contains tool_result bodies (file reads, base64 images, git
|
|
75
|
-
* logs), thinking blocks, attachments, system frames, and
|
|
76
|
-
* permission-mode entries that don't represent conversation pressure.
|
|
77
|
-
*
|
|
78
|
-
* On a real session today this dropped a 125 MB transcript from
|
|
79
|
-
* reporting "31 million tokens" to a number that actually reflects
|
|
80
|
-
* the user+assistant exchange, so heartbeat fires when it should
|
|
81
|
-
* instead of constantly off inflated numbers.
|
|
82
|
-
*
|
|
83
|
-
* Counts:
|
|
84
|
-
* - user message text/string content
|
|
85
|
-
* - assistant text content
|
|
86
|
-
* - tool_result content — capped at 2000 chars per result, since
|
|
87
|
-
* the agent does read these but they shouldn't dominate
|
|
88
|
-
*
|
|
89
|
-
* Skips:
|
|
90
|
-
* - thinking blocks (agent internal CoT)
|
|
91
|
-
* - tool_use args (compact, plus they're outbound work not context)
|
|
92
|
-
* - system / file-history-snapshot / permission-mode / ai-title /
|
|
93
|
-
* last-prompt / attachment frames
|
|
94
|
-
*
|
|
95
|
-
* Returns 0 on any read failure (graceful, gate stays open).
|
|
96
|
-
*/
|
|
97
|
-
const TOOL_RESULT_CAP_CHARS = 2000;
|
|
98
|
-
export async function estimateTranscriptTokens(transcriptPath) {
|
|
99
|
-
try {
|
|
100
|
-
const raw = await fs.readFile(transcriptPath, "utf8");
|
|
101
|
-
let total = 0;
|
|
102
|
-
for (const line of raw.split("\n")) {
|
|
103
|
-
if (!line.trim())
|
|
104
|
-
continue;
|
|
105
|
-
let parsed;
|
|
106
|
-
try {
|
|
107
|
-
parsed = JSON.parse(line);
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (parsed.type !== "user" && parsed.type !== "assistant")
|
|
113
|
-
continue;
|
|
114
|
-
total += countContentChars(parsed.message?.content);
|
|
115
|
-
}
|
|
116
|
-
return Math.ceil(total / 4);
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
return 0;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
function countContentChars(content) {
|
|
123
|
-
if (typeof content === "string")
|
|
124
|
-
return content.length;
|
|
125
|
-
if (!Array.isArray(content))
|
|
126
|
-
return 0;
|
|
127
|
-
let chars = 0;
|
|
128
|
-
for (const block of content) {
|
|
129
|
-
if (!block || typeof block !== "object")
|
|
130
|
-
continue;
|
|
131
|
-
const b = block;
|
|
132
|
-
switch (b.type) {
|
|
133
|
-
case "text":
|
|
134
|
-
if (typeof b.text === "string")
|
|
135
|
-
chars += b.text.length;
|
|
136
|
-
break;
|
|
137
|
-
case "tool_result": {
|
|
138
|
-
// tool_result content can be a string OR an array of blocks
|
|
139
|
-
const c = b.content;
|
|
140
|
-
if (typeof c === "string") {
|
|
141
|
-
chars += Math.min(c.length, TOOL_RESULT_CAP_CHARS);
|
|
142
|
-
}
|
|
143
|
-
else if (Array.isArray(c)) {
|
|
144
|
-
let inner = 0;
|
|
145
|
-
for (const part of c) {
|
|
146
|
-
if (part && typeof part === "object") {
|
|
147
|
-
const p = part;
|
|
148
|
-
if (typeof p.text === "string")
|
|
149
|
-
inner += p.text.length;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
chars += Math.min(inner, TOOL_RESULT_CAP_CHARS);
|
|
153
|
-
}
|
|
154
|
-
break;
|
|
155
|
-
}
|
|
156
|
-
// thinking / tool_use / image / etc. — intentionally not counted
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return chars;
|
|
160
|
-
}
|
|
161
|
-
function checkpointPath(sessionId, dataRoot) {
|
|
162
|
-
return path.join(resolveDataRoot(dataRoot), "sessions", sessionId, "heartbeat-checkpoint.json");
|
|
163
|
-
}
|
|
164
|
-
function pendingPath(sessionId, dataRoot) {
|
|
165
|
-
return path.join(resolveDataRoot(dataRoot), "sessions", sessionId, "heartbeat-pending.txt");
|
|
166
|
-
}
|
|
167
|
-
export async function readCheckpoint(sessionId, options = {}) {
|
|
168
|
-
try {
|
|
169
|
-
const raw = await fs.readFile(checkpointPath(sessionId, options.dataRoot), "utf8");
|
|
170
|
-
const parsed = JSON.parse(raw);
|
|
171
|
-
if (parsed &&
|
|
172
|
-
typeof parsed.last_token_count === "number" &&
|
|
173
|
-
typeof parsed.last_checkpoint_at === "string") {
|
|
174
|
-
return parsed;
|
|
175
|
-
}
|
|
176
|
-
return null;
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
export async function writeCheckpoint(sessionId, checkpoint, options = {}) {
|
|
183
|
-
const p = checkpointPath(sessionId, options.dataRoot);
|
|
184
|
-
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
185
|
-
await fs.writeFile(p, JSON.stringify(checkpoint, null, 2) + "\n", "utf8");
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Build the one-line nudge that gets injected into the agent's next-
|
|
189
|
-
* turn system context. Kept short — the agent's existing system prompt
|
|
190
|
-
* (CLAUDE.md classify-and-act + the user-is-god promoted lesson)
|
|
191
|
-
* already tells it what to do with classification work.
|
|
192
|
-
*/
|
|
193
|
-
export function formatHeartbeatNudge(delta, threshold) {
|
|
194
|
-
return (`🦑 [opensquid heartbeat] ${delta.toLocaleString()} tokens since last re-anchor ` +
|
|
195
|
-
`(threshold: ${threshold.toLocaleString()}). Before answering: ` +
|
|
196
|
-
`(1) call \`recall\` with your current task to refresh context; ` +
|
|
197
|
-
`(2) scan recent user turns for substantive items needing memorize / remember / promote.`);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Stop-hook entrypoint: check whether the transcript has grown past
|
|
201
|
-
* the threshold since the last checkpoint. If so, arm a pending
|
|
202
|
-
* heartbeat marker for UserPromptSubmit to surface on the next turn,
|
|
203
|
-
* and bump the checkpoint to the current count.
|
|
204
|
-
*
|
|
205
|
-
* Returns the nudge text written (or null if no arming happened) for
|
|
206
|
-
* test introspection and Stop-hook stderr surfacing.
|
|
207
|
-
*/
|
|
208
|
-
export async function checkAndMaybeArm(sessionId, transcriptPath, options = {}) {
|
|
209
|
-
const threshold = options.thresholdTokens ?? heartbeatThresholdTokens();
|
|
210
|
-
const currentTokens = await estimateTranscriptTokens(transcriptPath);
|
|
211
|
-
if (currentTokens === 0)
|
|
212
|
-
return null;
|
|
213
|
-
const previous = await readCheckpoint(sessionId, { dataRoot: options.dataRoot });
|
|
214
|
-
let baseline = previous?.last_token_count ?? 0;
|
|
215
|
-
// 0.7.7 (#161, audit MED #3): the estimator was rewritten in 0.7.7
|
|
216
|
-
// to count only conversation bodies (not whole-file char/4) — typical
|
|
217
|
-
// 20x deflation vs the old value. Existing checkpoints written by
|
|
218
|
-
// the old estimator now show wildly higher numbers than the new
|
|
219
|
-
// estimator returns, which would make `delta = current - baseline`
|
|
220
|
-
// permanently negative → heartbeat never fires. Detect that case
|
|
221
|
-
// (baseline > 10x current) and reset the baseline to 0 so the next
|
|
222
|
-
// crossing is the first under the new regime.
|
|
223
|
-
if (baseline > currentTokens * 10) {
|
|
224
|
-
baseline = 0;
|
|
225
|
-
}
|
|
226
|
-
const delta = currentTokens - baseline;
|
|
227
|
-
if (delta < threshold)
|
|
228
|
-
return null;
|
|
229
|
-
const nudge = formatHeartbeatNudge(delta, threshold);
|
|
230
|
-
const p = pendingPath(sessionId, options.dataRoot);
|
|
231
|
-
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
232
|
-
await fs.writeFile(p, nudge + "\n", "utf8");
|
|
233
|
-
await writeCheckpoint(sessionId, { last_token_count: currentTokens, last_checkpoint_at: new Date().toISOString() }, { dataRoot: options.dataRoot });
|
|
234
|
-
return nudge;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* UserPromptSubmit-hook entrypoint: consume any armed heartbeat marker
|
|
238
|
-
* and return its text. Caller injects via stdout. Marker is removed so
|
|
239
|
-
* the nudge fires exactly once per threshold crossing.
|
|
240
|
-
*/
|
|
241
|
-
export async function consumePendingHeartbeat(sessionId, options = {}) {
|
|
242
|
-
const p = pendingPath(sessionId, options.dataRoot);
|
|
243
|
-
let nudge;
|
|
244
|
-
try {
|
|
245
|
-
nudge = (await fs.readFile(p, "utf8")).trim();
|
|
246
|
-
}
|
|
247
|
-
catch {
|
|
248
|
-
return null;
|
|
249
|
-
}
|
|
250
|
-
try {
|
|
251
|
-
await fs.rm(p);
|
|
252
|
-
}
|
|
253
|
-
catch {
|
|
254
|
-
// already gone — concurrent UserPromptSubmit or test cleanup
|
|
255
|
-
}
|
|
256
|
-
return nudge.length === 0 ? null : nudge;
|
|
257
|
-
}
|
|
258
|
-
/** Test/SessionEnd helper — paths the cleanup phase removes. */
|
|
259
|
-
export function heartbeatSessionFiles(sessionId, dataRoot) {
|
|
260
|
-
return [
|
|
261
|
-
checkpointPath(sessionId, dataRoot),
|
|
262
|
-
pendingPath(sessionId, dataRoot),
|
|
263
|
-
recallRequiredFlagPath(sessionId, dataRoot),
|
|
264
|
-
];
|
|
265
|
-
}
|
|
266
|
-
// =====================================================================
|
|
267
|
-
// 0.7.26 / D7 — recall-required flag
|
|
268
|
-
//
|
|
269
|
-
// After the heartbeat nudge is consumed (surfaced to the agent via
|
|
270
|
-
// UserPromptSubmit), set a per-session flag that BLOCKS any
|
|
271
|
-
// mcp__opensquid__* tool call other than `recall` until the agent
|
|
272
|
-
// actually calls recall.
|
|
273
|
-
//
|
|
274
|
-
// Catches D7: heartbeat fires, agent acknowledges, agent continues
|
|
275
|
-
// without calling recall. The mechanism exists, the agent's compliance
|
|
276
|
-
// was the failure point. Make it teeth.
|
|
277
|
-
//
|
|
278
|
-
// Lifecycle:
|
|
279
|
-
// - markRecallRequired: called from UPS after consumePendingHeartbeat
|
|
280
|
-
// returns a nudge
|
|
281
|
-
// - isRecallRequired: checked from pre-tool-use before any
|
|
282
|
-
// mcp__opensquid__* tool call
|
|
283
|
-
// - clearRecallRequired: called from pre-tool-use when the agent
|
|
284
|
-
// calls mcp__opensquid__recall
|
|
285
|
-
// =====================================================================
|
|
286
|
-
function recallRequiredFlagPath(sessionId, dataRoot) {
|
|
287
|
-
return path.join(resolveDataRoot(dataRoot), "sessions", sessionId, "recall-required.flag");
|
|
288
|
-
}
|
|
289
|
-
/** Set the flag — called after the heartbeat nudge is surfaced. */
|
|
290
|
-
export async function markRecallRequired(sessionId, options = {}) {
|
|
291
|
-
const p = recallRequiredFlagPath(sessionId, options.dataRoot);
|
|
292
|
-
await fs.mkdir(path.dirname(p), { recursive: true });
|
|
293
|
-
await fs.writeFile(p, new Date().toISOString() + "\n", "utf8");
|
|
294
|
-
}
|
|
295
|
-
/** Check whether the flag is set for this session. */
|
|
296
|
-
export async function isRecallRequired(sessionId, options = {}) {
|
|
297
|
-
const p = recallRequiredFlagPath(sessionId, options.dataRoot);
|
|
298
|
-
try {
|
|
299
|
-
await fs.access(p);
|
|
300
|
-
return true;
|
|
301
|
-
}
|
|
302
|
-
catch {
|
|
303
|
-
return false;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
/** Clear the flag — called after the agent calls recall. */
|
|
307
|
-
export async function clearRecallRequired(sessionId, options = {}) {
|
|
308
|
-
const p = recallRequiredFlagPath(sessionId, options.dataRoot);
|
|
309
|
-
try {
|
|
310
|
-
await fs.rm(p);
|
|
311
|
-
}
|
|
312
|
-
catch {
|
|
313
|
-
/* already gone */
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
//# sourceMappingURL=heartbeat.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src.legacy/hooks/heartbeat.ts"],"names":[],"mappings":"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"}
|