opensquid 0.5.441 → 0.5.449
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/functions/recall_pre_inject.d.ts.map +1 -1
- package/dist/functions/recall_pre_inject.js +12 -0
- package/dist/functions/recall_pre_inject.js.map +1 -1
- package/dist/rag/store_git.d.ts +23 -0
- package/dist/rag/store_git.d.ts.map +1 -0
- package/dist/rag/store_git.js +57 -0
- package/dist/rag/store_git.js.map +1 -0
- 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-end.js +11 -0
- package/dist/runtime/hooks/session-end.js.map +1 -1
- 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/docs/pack-runtime.md +15 -12
- package/docs/skill-grammar-guide.md +4 -4
- 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
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* chat-daemon RPC client (v0.7.1 Phase B).
|
|
3
|
-
*
|
|
4
|
-
* Used by the MCP server when it wants to send a chat message but
|
|
5
|
-
* doesn't want to start its own long-poll adapter (which would
|
|
6
|
-
* collide with any other MCP server holding the same bot token).
|
|
7
|
-
*
|
|
8
|
-
* Behavior:
|
|
9
|
-
* - One short-lived connection per request — keeps the implementation
|
|
10
|
-
* trivial and avoids reconnect/backoff logic. Performance is fine
|
|
11
|
-
* for v0.7.1's expected traffic (a handful of agent reports per
|
|
12
|
-
* project session).
|
|
13
|
-
* - Returns a typed result on success.
|
|
14
|
-
* - Throws `DaemonUnreachableError` when the socket can't be reached
|
|
15
|
-
* so callers can fall back to in-process send.
|
|
16
|
-
* - Throws `DaemonRpcError` on JSON-RPC error responses.
|
|
17
|
-
*/
|
|
18
|
-
import { connect } from "node:net";
|
|
19
|
-
import { daemonSockAddress, } from "./protocol.js";
|
|
20
|
-
export class DaemonUnreachableError extends Error {
|
|
21
|
-
constructor(message) {
|
|
22
|
-
super(message);
|
|
23
|
-
this.name = "DaemonUnreachableError";
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
export class DaemonRpcError extends Error {
|
|
27
|
-
code;
|
|
28
|
-
constructor(message, code) {
|
|
29
|
-
super(message);
|
|
30
|
-
this.code = code;
|
|
31
|
-
this.name = "DaemonRpcError";
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
let requestCounter = 0;
|
|
35
|
-
export class DaemonClient {
|
|
36
|
-
address;
|
|
37
|
-
connectTimeoutMs;
|
|
38
|
-
requestTimeoutMs;
|
|
39
|
-
constructor(opts = {}) {
|
|
40
|
-
this.address = daemonSockAddress(opts.dataRoot);
|
|
41
|
-
this.connectTimeoutMs = opts.connectTimeoutMs ?? 1500;
|
|
42
|
-
this.requestTimeoutMs = opts.requestTimeoutMs ?? 5000;
|
|
43
|
-
}
|
|
44
|
-
ping() {
|
|
45
|
-
return this.call("ping", {});
|
|
46
|
-
}
|
|
47
|
-
listChannels() {
|
|
48
|
-
return this.call("list_channels", {});
|
|
49
|
-
}
|
|
50
|
-
send(params) {
|
|
51
|
-
return this.call("send", params);
|
|
52
|
-
}
|
|
53
|
-
createTopic(params) {
|
|
54
|
-
return this.call("create_topic", params);
|
|
55
|
-
}
|
|
56
|
-
async call(method, params) {
|
|
57
|
-
const sock = await this.openSocket();
|
|
58
|
-
try {
|
|
59
|
-
const id = ++requestCounter;
|
|
60
|
-
const req = { jsonrpc: "2.0", id, method: method, params };
|
|
61
|
-
sock.write(`${JSON.stringify(req)}\n`);
|
|
62
|
-
const line = await readOneLine(sock, this.requestTimeoutMs);
|
|
63
|
-
const res = JSON.parse(line);
|
|
64
|
-
if ("error" in res) {
|
|
65
|
-
throw new DaemonRpcError(res.error.message, res.error.code);
|
|
66
|
-
}
|
|
67
|
-
return res.result;
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
sock.destroy();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
openSocket() {
|
|
74
|
-
return new Promise((resolve, reject) => {
|
|
75
|
-
const sock = connect({ path: this.address });
|
|
76
|
-
const t = setTimeout(() => {
|
|
77
|
-
sock.destroy();
|
|
78
|
-
reject(new DaemonUnreachableError(`connect timeout (${this.connectTimeoutMs}ms)`));
|
|
79
|
-
}, this.connectTimeoutMs);
|
|
80
|
-
sock.once("connect", () => {
|
|
81
|
-
clearTimeout(t);
|
|
82
|
-
resolve(sock);
|
|
83
|
-
});
|
|
84
|
-
sock.once("error", (err) => {
|
|
85
|
-
clearTimeout(t);
|
|
86
|
-
// ENOENT (no socket file) / ECONNREFUSED (no listener) /
|
|
87
|
-
// EACCES (permission) → daemon-unreachable. Other errors
|
|
88
|
-
// propagate as the original error.
|
|
89
|
-
if (err.code === "ENOENT" || err.code === "ECONNREFUSED" || err.code === "EACCES") {
|
|
90
|
-
reject(new DaemonUnreachableError(`${err.code}: ${err.message}`));
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
reject(err);
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
function readOneLine(sock, timeoutMs) {
|
|
100
|
-
return new Promise((resolve, reject) => {
|
|
101
|
-
sock.setEncoding("utf8");
|
|
102
|
-
let buf = "";
|
|
103
|
-
const onData = (chunk) => {
|
|
104
|
-
buf += chunk;
|
|
105
|
-
const nl = buf.indexOf("\n");
|
|
106
|
-
if (nl >= 0) {
|
|
107
|
-
cleanup();
|
|
108
|
-
resolve(buf.slice(0, nl));
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
const onError = (err) => {
|
|
112
|
-
cleanup();
|
|
113
|
-
reject(err);
|
|
114
|
-
};
|
|
115
|
-
const onEnd = () => {
|
|
116
|
-
cleanup();
|
|
117
|
-
reject(new DaemonUnreachableError("daemon closed connection without response"));
|
|
118
|
-
};
|
|
119
|
-
const t = setTimeout(() => {
|
|
120
|
-
cleanup();
|
|
121
|
-
reject(new DaemonUnreachableError(`request timeout (${timeoutMs}ms)`));
|
|
122
|
-
}, timeoutMs);
|
|
123
|
-
const cleanup = () => {
|
|
124
|
-
clearTimeout(t);
|
|
125
|
-
sock.off("data", onData);
|
|
126
|
-
sock.off("error", onError);
|
|
127
|
-
sock.off("end", onEnd);
|
|
128
|
-
};
|
|
129
|
-
sock.on("data", onData);
|
|
130
|
-
sock.on("error", onError);
|
|
131
|
-
sock.on("end", onEnd);
|
|
132
|
-
});
|
|
133
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../../src.legacy/chat/daemon/rpc-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* chat-daemon RPC server (v0.7.1 Phase B).
|
|
3
|
-
*
|
|
4
|
-
* Runs INSIDE the daemon worker process. Listens on the platform-
|
|
5
|
-
* correct socket address (Unix socket / named pipe) and dispatches
|
|
6
|
-
* JSON-RPC method calls to the in-process ChatGateway.
|
|
7
|
-
*
|
|
8
|
-
* Connection model: stateless. Each line is one request; each response
|
|
9
|
-
* goes back on the same connection. Connections may pipeline multiple
|
|
10
|
-
* requests, and the server reads line-by-line (we keep a per-connection
|
|
11
|
-
* buffer until \n).
|
|
12
|
-
*/
|
|
13
|
-
import type { ChatGateway } from "../gateway.js";
|
|
14
|
-
export interface RpcServerOptions {
|
|
15
|
-
gateway: ChatGateway;
|
|
16
|
-
dataRoot?: string;
|
|
17
|
-
startedAt?: number;
|
|
18
|
-
/** Daemon's process version string — surfaced by `ping`. */
|
|
19
|
-
version?: string;
|
|
20
|
-
/** Pid surfaced by `ping`. Defaults to process.pid. */
|
|
21
|
-
pid?: number;
|
|
22
|
-
/** Hook for tests: callback when a request is dispatched. */
|
|
23
|
-
onRequest?: (method: string) => void;
|
|
24
|
-
}
|
|
25
|
-
export declare class RpcServer {
|
|
26
|
-
private readonly opts;
|
|
27
|
-
private server;
|
|
28
|
-
private listening;
|
|
29
|
-
private readonly address;
|
|
30
|
-
private readonly startedAt;
|
|
31
|
-
constructor(opts: RpcServerOptions);
|
|
32
|
-
listen(): Promise<void>;
|
|
33
|
-
close(): Promise<void>;
|
|
34
|
-
private handleConnection;
|
|
35
|
-
private dispatchLine;
|
|
36
|
-
private respond;
|
|
37
|
-
private handle;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=rpc-server.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-server.d.ts","sourceRoot":"","sources":["../../../src.legacy/chat/daemon/rpc-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAmBjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,qBAAa,SAAS;IAMR,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,IAAI,EAAE,gBAAgB;IAW7C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,OAAO;YAQD,MAAM;CAiGrB"}
|
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* chat-daemon RPC server (v0.7.1 Phase B).
|
|
3
|
-
*
|
|
4
|
-
* Runs INSIDE the daemon worker process. Listens on the platform-
|
|
5
|
-
* correct socket address (Unix socket / named pipe) and dispatches
|
|
6
|
-
* JSON-RPC method calls to the in-process ChatGateway.
|
|
7
|
-
*
|
|
8
|
-
* Connection model: stateless. Each line is one request; each response
|
|
9
|
-
* goes back on the same connection. Connections may pipeline multiple
|
|
10
|
-
* requests, and the server reads line-by-line (we keep a per-connection
|
|
11
|
-
* buffer until \n).
|
|
12
|
-
*/
|
|
13
|
-
import { createServer } from "node:net";
|
|
14
|
-
import { existsSync, unlinkSync } from "node:fs";
|
|
15
|
-
import { TopicGoneError } from "../adapters/telegram.js";
|
|
16
|
-
import { recordTopicGoneEvent } from "./collisions.js";
|
|
17
|
-
import { JSON_RPC_INTERNAL_ERROR, JSON_RPC_INVALID_PARAMS, JSON_RPC_INVALID_REQUEST, JSON_RPC_METHOD_NOT_FOUND, JSON_RPC_PARSE_ERROR, daemonSockAddress, } from "./protocol.js";
|
|
18
|
-
import { loadProjectChatRouting } from "./routing.js";
|
|
19
|
-
import { SubscriberRegistry } from "./subscribers.js";
|
|
20
|
-
import { clearBinding, findOwnerOfBinding, resolveOrCreateTopic } from "./workspace-topic.js";
|
|
21
|
-
export class RpcServer {
|
|
22
|
-
opts;
|
|
23
|
-
server;
|
|
24
|
-
listening = false;
|
|
25
|
-
address;
|
|
26
|
-
startedAt;
|
|
27
|
-
/**
|
|
28
|
-
* TPS.6 patch 1 (v0.5.125) — long-lived subscriber registry. The
|
|
29
|
-
* gateway.onMessage wire-up that broadcasts to this registry lands
|
|
30
|
-
* in patch 2 (v0.5.126). For patch 1, the daemon accepts
|
|
31
|
-
* subscribe/unsubscribe RPCs but does not yet push notifications.
|
|
32
|
-
*/
|
|
33
|
-
subscribers = new SubscriberRegistry();
|
|
34
|
-
constructor(opts) {
|
|
35
|
-
this.opts = opts;
|
|
36
|
-
this.address = daemonSockAddress(opts.dataRoot);
|
|
37
|
-
this.startedAt = opts.startedAt ?? Date.now();
|
|
38
|
-
this.server = createServer((socket) => this.handleConnection(socket));
|
|
39
|
-
// Treat client errors as informational; a misbehaving client must
|
|
40
|
-
// not crash the daemon.
|
|
41
|
-
this.server.on("error", () => {
|
|
42
|
-
/* swallowed at server level; per-conn errors handled below */
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
async listen() {
|
|
46
|
-
if (this.listening)
|
|
47
|
-
return;
|
|
48
|
-
// Unix-socket clean-up: a previously-aborted daemon may have left a
|
|
49
|
-
// stale socket file. Removing it is safe because the previous
|
|
50
|
-
// daemon is gone (verified by the lifecycle layer before we got
|
|
51
|
-
// here). Windows named pipes are kernel objects with no file
|
|
52
|
-
// residue, so this is a no-op there.
|
|
53
|
-
if (process.platform !== "win32" && existsSync(this.address)) {
|
|
54
|
-
try {
|
|
55
|
-
unlinkSync(this.address);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
/* race-tolerant */
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
await new Promise((resolve, reject) => {
|
|
62
|
-
this.server.once("error", reject);
|
|
63
|
-
this.server.listen(this.address, () => {
|
|
64
|
-
this.server.off("error", reject);
|
|
65
|
-
this.listening = true;
|
|
66
|
-
resolve();
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
async close() {
|
|
71
|
-
if (!this.listening)
|
|
72
|
-
return;
|
|
73
|
-
await new Promise((resolve) => {
|
|
74
|
-
this.server.close(() => resolve());
|
|
75
|
-
});
|
|
76
|
-
this.listening = false;
|
|
77
|
-
if (process.platform !== "win32" && existsSync(this.address)) {
|
|
78
|
-
try {
|
|
79
|
-
unlinkSync(this.address);
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
/* race-tolerant */
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
handleConnection(socket) {
|
|
87
|
-
let buf = "";
|
|
88
|
-
socket.setEncoding("utf8");
|
|
89
|
-
socket.on("data", (chunk) => {
|
|
90
|
-
buf += chunk;
|
|
91
|
-
let nl;
|
|
92
|
-
while ((nl = buf.indexOf("\n")) >= 0) {
|
|
93
|
-
const line = buf.slice(0, nl);
|
|
94
|
-
buf = buf.slice(nl + 1);
|
|
95
|
-
if (line.trim().length === 0)
|
|
96
|
-
continue;
|
|
97
|
-
this.dispatchLine(line, socket);
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
socket.on("error", () => {
|
|
101
|
-
// Half-open connections are common; closing here keeps the daemon
|
|
102
|
-
// tidy without surfacing an error to other clients. Subscriber
|
|
103
|
-
// eviction is handled by the registry's own socket 'error'/'close'
|
|
104
|
-
// listeners installed at register() time, so we don't need to
|
|
105
|
-
// touch the registry here.
|
|
106
|
-
try {
|
|
107
|
-
socket.destroy();
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
/* already gone */
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
dispatchLine(line, socket) {
|
|
115
|
-
let req;
|
|
116
|
-
try {
|
|
117
|
-
req = JSON.parse(line);
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
this.respond(socket, parseError());
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
if (!req || req.jsonrpc !== "2.0" || typeof req.id === "undefined" || !req.method) {
|
|
124
|
-
this.respond(socket, invalidRequest(req?.id ?? null));
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
if (this.opts.onRequest)
|
|
128
|
-
this.opts.onRequest(req.method);
|
|
129
|
-
void this.handle(req, socket).then((res) => this.respond(socket, res));
|
|
130
|
-
}
|
|
131
|
-
respond(socket, response) {
|
|
132
|
-
try {
|
|
133
|
-
socket.write(`${JSON.stringify(response)}\n`);
|
|
134
|
-
}
|
|
135
|
-
catch {
|
|
136
|
-
/* dropped — connection gone */
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* TPS.7 (v0.5.130) — async stale-topic recovery. Locates the
|
|
141
|
-
* workspace that owned the now-stale binding, clears it via
|
|
142
|
-
* `clearBinding`, and records a `TopicGoneEvent` in collisions.jsonl
|
|
143
|
-
* (which fires a debounced Telegram notification through the same
|
|
144
|
-
* surface TPS.5 collisions use).
|
|
145
|
-
*
|
|
146
|
-
* Fire-and-forget from the send-RPC catch block. NEVER throws — all
|
|
147
|
-
* failures log to stderr. The original send already failed; the
|
|
148
|
-
* caller doesn't care about recovery errors.
|
|
149
|
-
*
|
|
150
|
-
* Re-binding does NOT happen here — by design it defers to the next
|
|
151
|
-
* MCP-bridge subscribe (TPS.6 auto-boot path), which is lockfile-
|
|
152
|
-
* protected so two concurrent recoveries can't double-create topics.
|
|
153
|
-
*/
|
|
154
|
-
async handleTopicGone(err) {
|
|
155
|
-
try {
|
|
156
|
-
const workspaceUuid = await findOwnerOfBinding({
|
|
157
|
-
chatId: err.chatId,
|
|
158
|
-
topicId: err.threadId,
|
|
159
|
-
...(this.opts.dataRoot !== undefined ? { dataRoot: this.opts.dataRoot } : {}),
|
|
160
|
-
});
|
|
161
|
-
if (workspaceUuid === null) {
|
|
162
|
-
// No project claims this binding — either the user manually
|
|
163
|
-
// cleared it, a concurrent recovery beat us to it, or the
|
|
164
|
-
// binding was never tracked. Nothing to clean; nothing to
|
|
165
|
-
// notify.
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
await clearBinding({
|
|
169
|
-
workspaceUuid,
|
|
170
|
-
...(this.opts.dataRoot !== undefined ? { dataRoot: this.opts.dataRoot } : {}),
|
|
171
|
-
});
|
|
172
|
-
await recordTopicGoneEvent({
|
|
173
|
-
workspaceUuid,
|
|
174
|
-
chatId: err.chatId,
|
|
175
|
-
topicId: err.threadId,
|
|
176
|
-
underlyingDescription: err.message,
|
|
177
|
-
gateway: this.opts.gateway,
|
|
178
|
-
...(this.opts.dataRoot !== undefined ? { dataRoot: this.opts.dataRoot } : {}),
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
catch (recoveryErr) {
|
|
182
|
-
process.stderr.write(`[rpc-server] topic-gone recovery failed for chatId=${err.chatId} topicId=${err.threadId}: ${recoveryErr instanceof Error ? recoveryErr.message : String(recoveryErr)}\n`);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
async handle(req, socket) {
|
|
186
|
-
try {
|
|
187
|
-
switch (req.method) {
|
|
188
|
-
case "subscribe": {
|
|
189
|
-
const p = req.params;
|
|
190
|
-
if (!p ||
|
|
191
|
-
typeof p.session_id !== "string" ||
|
|
192
|
-
p.session_id.length === 0 ||
|
|
193
|
-
typeof p.workspace_uuid !== "string" ||
|
|
194
|
-
typeof p.workspace_path !== "string" ||
|
|
195
|
-
!Array.isArray(p.chat_ids)) {
|
|
196
|
-
return failure(req.id, JSON_RPC_INVALID_PARAMS, "subscribe: session_id, workspace_uuid, workspace_path, chat_ids[] required");
|
|
197
|
-
}
|
|
198
|
-
for (const id of p.chat_ids) {
|
|
199
|
-
if (typeof id !== "string") {
|
|
200
|
-
return failure(req.id, JSON_RPC_INVALID_PARAMS, "subscribe: chat_ids[] must be strings");
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
this.subscribers.register({
|
|
204
|
-
session_id: p.session_id,
|
|
205
|
-
workspace_uuid: p.workspace_uuid,
|
|
206
|
-
workspace_path: p.workspace_path,
|
|
207
|
-
chat_ids: p.chat_ids,
|
|
208
|
-
socket,
|
|
209
|
-
});
|
|
210
|
-
// TPS.6 patch 4 (v0.5.128) — daemon-side auto-boot. When the
|
|
211
|
-
// workspace has a configured supergroup but no auto_bound
|
|
212
|
-
// binding yet, resolve-or-create the forum topic now so the
|
|
213
|
-
// MCP bridge starts seeing per-workspace-routed inbound
|
|
214
|
-
// messages without requiring a separate `opensquid setup
|
|
215
|
-
// chat` wizard run. resolveOrCreateTopic is idempotent —
|
|
216
|
-
// existing bindings come back as {created:false} with the
|
|
217
|
-
// existing topic_id/topic_name.
|
|
218
|
-
//
|
|
219
|
-
// Skipped conditions (all degrade silently to a wildcard-
|
|
220
|
-
// routed subscription; subscribers see general topic only):
|
|
221
|
-
// - workspace_uuid is the "no-project" sentinel
|
|
222
|
-
// - chat-routing.json missing or has no
|
|
223
|
-
// telegram.report_channel (no destination)
|
|
224
|
-
// - resolveOrCreateTopic throws (logged to stderr, never
|
|
225
|
-
// blocks subscribe ack)
|
|
226
|
-
const autoBoot = await tryAutoBootTopic(p.workspace_uuid, p.workspace_path, this.opts.dataRoot);
|
|
227
|
-
if (autoBoot) {
|
|
228
|
-
return success(req.id, {
|
|
229
|
-
ok: true,
|
|
230
|
-
bound_topic_id: autoBoot.topicId,
|
|
231
|
-
bound_topic_name: autoBoot.topicName,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
return success(req.id, { ok: true });
|
|
235
|
-
}
|
|
236
|
-
case "unsubscribe": {
|
|
237
|
-
const p = req.params;
|
|
238
|
-
if (!p || typeof p.session_id !== "string" || p.session_id.length === 0) {
|
|
239
|
-
return failure(req.id, JSON_RPC_INVALID_PARAMS, "unsubscribe: session_id required");
|
|
240
|
-
}
|
|
241
|
-
this.subscribers.unregister(p.session_id);
|
|
242
|
-
return success(req.id, { ok: true });
|
|
243
|
-
}
|
|
244
|
-
case "ping":
|
|
245
|
-
return success(req.id, {
|
|
246
|
-
pong: true,
|
|
247
|
-
pid: this.opts.pid ?? process.pid,
|
|
248
|
-
version: this.opts.version ?? "unknown",
|
|
249
|
-
});
|
|
250
|
-
case "list_channels": {
|
|
251
|
-
// 0.7.4 (#147): walk active adapters and ask which are
|
|
252
|
-
// outbound-only (degraded due to 409 collision with an
|
|
253
|
-
// external poller). Only the telegram adapter currently
|
|
254
|
-
// exposes isOutboundOnly(); duck-type test so other
|
|
255
|
-
// platforms can opt in later without changing this code.
|
|
256
|
-
const platforms = this.opts.gateway.activePlatforms();
|
|
257
|
-
const outboundOnly = [];
|
|
258
|
-
for (const p of platforms) {
|
|
259
|
-
const adapter = this.opts.gateway.getAdapter(p);
|
|
260
|
-
const maybe = adapter;
|
|
261
|
-
if (typeof maybe?.isOutboundOnly === "function" && maybe.isOutboundOnly()) {
|
|
262
|
-
outboundOnly.push(p);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
return success(req.id, {
|
|
266
|
-
active_platforms: platforms,
|
|
267
|
-
uptime_ms: Date.now() - this.startedAt,
|
|
268
|
-
outbound_only_platforms: outboundOnly,
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
case "send": {
|
|
272
|
-
const p = req.params;
|
|
273
|
-
if (!p || typeof p.channel !== "string" || typeof p.text !== "string") {
|
|
274
|
-
return failure(req.id, JSON_RPC_INVALID_PARAMS, "send: channel + text required");
|
|
275
|
-
}
|
|
276
|
-
try {
|
|
277
|
-
const result = await this.opts.gateway.send({
|
|
278
|
-
channel: p.channel,
|
|
279
|
-
text: p.text,
|
|
280
|
-
replyTo: p.replyTo,
|
|
281
|
-
threadId: p.threadId,
|
|
282
|
-
});
|
|
283
|
-
return success(req.id, {
|
|
284
|
-
ok: true,
|
|
285
|
-
platform: result.platform,
|
|
286
|
-
message_id: result.messageId,
|
|
287
|
-
delivered_at: result.deliveredAt.toISOString(),
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
catch (err) {
|
|
291
|
-
// TPS.7 (v0.5.130) — typed stale-topic detection. Fire the
|
|
292
|
-
// recovery asynchronously so the caller gets the original
|
|
293
|
-
// failure (the send still failed; the daemon cleans up the
|
|
294
|
-
// stale binding in the background, and the next MCP-bridge
|
|
295
|
-
// subscribe rebinds via TPS.6 auto-boot).
|
|
296
|
-
if (err instanceof TopicGoneError) {
|
|
297
|
-
void this.handleTopicGone(err);
|
|
298
|
-
}
|
|
299
|
-
// Re-throw to the outer catch which formats the JSON-RPC
|
|
300
|
-
// failure (preserves the existing error contract).
|
|
301
|
-
throw err;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
case "create_topic": {
|
|
305
|
-
const p = req.params;
|
|
306
|
-
if (!p ||
|
|
307
|
-
p.platform !== "telegram" ||
|
|
308
|
-
typeof p.chat_id !== "string" ||
|
|
309
|
-
typeof p.name !== "string") {
|
|
310
|
-
return failure(req.id, JSON_RPC_INVALID_PARAMS, "create_topic: platform='telegram', chat_id, name required");
|
|
311
|
-
}
|
|
312
|
-
const adapter = this.opts.gateway.getAdapter(p.platform);
|
|
313
|
-
if (!adapter ||
|
|
314
|
-
typeof adapter.createTopic !== "function") {
|
|
315
|
-
return failure(req.id, JSON_RPC_INTERNAL_ERROR, `${p.platform} adapter does not support topic creation (or not active)`);
|
|
316
|
-
}
|
|
317
|
-
const adapterAny = adapter;
|
|
318
|
-
const res = await adapterAny.createTopic(p.chat_id, p.name, {
|
|
319
|
-
iconColor: p.icon_color,
|
|
320
|
-
iconCustomEmojiId: p.icon_custom_emoji_id,
|
|
321
|
-
});
|
|
322
|
-
return success(req.id, res);
|
|
323
|
-
}
|
|
324
|
-
default:
|
|
325
|
-
return failure(req.id, JSON_RPC_METHOD_NOT_FOUND, `unknown method: ${req.method}`);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
catch (err) {
|
|
329
|
-
return failure(req.id, JSON_RPC_INTERNAL_ERROR, err instanceof Error ? err.message : String(err));
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
// ---------------------------------------------------------------------
|
|
334
|
-
// JSON-RPC response helpers
|
|
335
|
-
// ---------------------------------------------------------------------
|
|
336
|
-
function success(id, result) {
|
|
337
|
-
return { jsonrpc: "2.0", id, result };
|
|
338
|
-
}
|
|
339
|
-
function failure(id, code, message) {
|
|
340
|
-
return { jsonrpc: "2.0", id, error: { code, message } };
|
|
341
|
-
}
|
|
342
|
-
function parseError() {
|
|
343
|
-
return failure(null, JSON_RPC_PARSE_ERROR, "parse error");
|
|
344
|
-
}
|
|
345
|
-
function invalidRequest(id) {
|
|
346
|
-
return failure(id, JSON_RPC_INVALID_REQUEST, "invalid jsonrpc request");
|
|
347
|
-
}
|
|
348
|
-
// ---------------------------------------------------------------------
|
|
349
|
-
// TPS.6 patch 4 (v0.5.128) — auto-boot helper
|
|
350
|
-
// ---------------------------------------------------------------------
|
|
351
|
-
/**
|
|
352
|
-
* Try to resolve-or-create a Telegram forum topic for a workspace at
|
|
353
|
-
* subscribe time. Returns null when the workspace can't be auto-bound
|
|
354
|
-
* (no project, no routing file, no report_channel, or resolve threw).
|
|
355
|
-
* Never throws — failures only log to stderr.
|
|
356
|
-
*/
|
|
357
|
-
async function tryAutoBootTopic(workspaceUuid, workspacePath, dataRoot) {
|
|
358
|
-
if (!workspaceUuid || workspaceUuid === "no-project")
|
|
359
|
-
return null;
|
|
360
|
-
let chatId;
|
|
361
|
-
try {
|
|
362
|
-
const routing = await loadProjectChatRouting(workspaceUuid, dataRoot);
|
|
363
|
-
chatId = routing?.telegram?.report_channel;
|
|
364
|
-
}
|
|
365
|
-
catch (err) {
|
|
366
|
-
process.stderr.write(`[rpc-server] auto-boot: loadProjectChatRouting failed for ${workspaceUuid}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
367
|
-
return null;
|
|
368
|
-
}
|
|
369
|
-
if (!chatId || chatId.length === 0)
|
|
370
|
-
return null;
|
|
371
|
-
try {
|
|
372
|
-
const result = await resolveOrCreateTopic({
|
|
373
|
-
workspaceUuid,
|
|
374
|
-
workspacePath,
|
|
375
|
-
chatId,
|
|
376
|
-
mode: "auto-boot",
|
|
377
|
-
...(dataRoot !== undefined ? { dataRoot } : {}),
|
|
378
|
-
});
|
|
379
|
-
return { topicId: result.topicId, topicName: result.topicName };
|
|
380
|
-
}
|
|
381
|
-
catch (err) {
|
|
382
|
-
process.stderr.write(`[rpc-server] auto-boot: resolveOrCreateTopic failed for ${workspaceUuid} (chatId=${chatId}): ${err instanceof Error ? err.message : String(err)}\n`);
|
|
383
|
-
return null;
|
|
384
|
-
}
|
|
385
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-server.js","sourceRoot":"","sources":["../../../src.legacy/chat/daemon/rpc-server.ts"],"names":[],"mappings":"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"}
|