@synaplink/orqlaude 0.3.3 → 0.4.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/README.md +15 -1
- package/dist/__tests__/state.test.js +1 -1
- package/dist/__tests__/userio.test.d.ts +1 -0
- package/dist/__tests__/userio.test.js +101 -0
- package/dist/__tests__/userio.test.js.map +1 -0
- package/dist/lib/state.d.ts +45 -1
- package/dist/lib/state.js +16 -4
- package/dist/lib/state.js.map +1 -1
- package/dist/server.js +3 -1
- package/dist/server.js.map +1 -1
- package/dist/telegram/api.d.ts +20 -0
- package/dist/telegram/api.js +38 -2
- package/dist/telegram/api.js.map +1 -1
- package/dist/telegram/bot.js +6 -1
- package/dist/telegram/bot.js.map +1 -1
- package/dist/telegram/commands.d.ts +5 -1
- package/dist/telegram/commands.js +107 -6
- package/dist/telegram/commands.js.map +1 -1
- package/dist/telegram/notifier.d.ts +3 -11
- package/dist/telegram/notifier.js +103 -24
- package/dist/telegram/notifier.js.map +1 -1
- package/dist/tools/ping.js +1 -1
- package/dist/tools/userio.d.ts +4 -0
- package/dist/tools/userio.js +116 -0
- package/dist/tools/userio.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -99,11 +99,23 @@ Restart your Claude Code session. The `mcp__orqlaude__*` tools will appear.
|
|
|
99
99
|
| `resume_plan(plan_id)` | Pick up an in-flight plan after a Desktop-app restart or new session. Refreshes per-task status from JSONL, returns a "do this next" hint. |
|
|
100
100
|
| `list_plans(include_collected?)` | All plans known to orqlaude in this project, active first. |
|
|
101
101
|
|
|
102
|
+
### Broker-to-user (v0.4+)
|
|
103
|
+
|
|
104
|
+
These let primary Claude push messages to and pull answers from the **user** (via Telegram if configured, with a `/respond` text fallback).
|
|
105
|
+
|
|
106
|
+
| Tool | Purpose |
|
|
107
|
+
|---|---|
|
|
108
|
+
| `notify_user(plan_id, text, urgency?, task_id?)` | One-way push to user's Telegram. urgency = `low`/`normal`/`high` (affects emoji). Returns immediately. |
|
|
109
|
+
| `request_user_response(plan_id, prompt, options?[], timeout_sec?, task_id?)` | Ask the user a question. With `options`, Telegram shows inline-keyboard buttons; without, user replies via `/respond <short_id> <text>`. Returns `request_id` + `short_id`. Defaults to a 10-minute timeout. |
|
|
110
|
+
| `poll_user_response(request_id)` | Returns `status: pending\|answered\|timed_out\|cancelled` + `response` once available. Safe to poll repeatedly. |
|
|
111
|
+
|
|
112
|
+
Without a running `orqlaude tg start`, `notify_user` queues silently and `request_user_response` will always `timed_out` — fall back to `AskUserQuestion` if Telegram is unavailable.
|
|
113
|
+
|
|
102
114
|
### Health
|
|
103
115
|
|
|
104
116
|
| Tool | Purpose |
|
|
105
117
|
|---|---|
|
|
106
|
-
| `ping(echo?)` | Returns version, cwd, node, pid. |
|
|
118
|
+
| `ping(echo?)` | Returns version, cwd, state_dir, state_dir_source, warnings[], node, pid. First call after install to verify wiring + state-dir resolution. |
|
|
107
119
|
|
|
108
120
|
## End-to-end walkthrough
|
|
109
121
|
|
|
@@ -239,6 +251,8 @@ orqlaude tg start
|
|
|
239
251
|
- `/show <plan_id>` — raw plan JSON
|
|
240
252
|
- `/notes <plan_id>` — recent agent notes
|
|
241
253
|
- `/kill <plan_id> <task_id> <reason>` — STOP a runaway agent
|
|
254
|
+
- `/respond <short_id> <text>` — answer a `request_user_response` question (v0.4+)
|
|
255
|
+
- Tap inline-keyboard buttons on any `request_user_response` with options (v0.4+)
|
|
242
256
|
- `/whitelist <user_id> [label]` (owner-only) — add another user
|
|
243
257
|
- `/help` / `/whoami`
|
|
244
258
|
|
|
@@ -117,7 +117,7 @@ test("schema v1 migrates to v2 with token caps synthesized", async () => {
|
|
|
117
117
|
// Reload via a new store (the test store already cached empty).
|
|
118
118
|
const fresh = new StateStore(dir);
|
|
119
119
|
const migrated = await fresh.read((s) => s);
|
|
120
|
-
assert.equal(migrated.schemaVersion,
|
|
120
|
+
assert.equal(migrated.schemaVersion, 3);
|
|
121
121
|
assert.equal(migrated.plans["p1"].budgetCapTokens, 4 * 25_000);
|
|
122
122
|
assert.deepEqual(migrated.plans["p1"].claims, []);
|
|
123
123
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import { StateStore, newPlan, findUserResponseRequest } from "../lib/state.js";
|
|
7
|
+
/**
|
|
8
|
+
* Regression tests for the v0.4 user-IO state additions.
|
|
9
|
+
*/
|
|
10
|
+
async function tmpStore() {
|
|
11
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), "orqlaude-userio-"));
|
|
12
|
+
return { store: new StateStore(dir), dir };
|
|
13
|
+
}
|
|
14
|
+
test("v2→v3 migration synthesizes empty userNotifications + userResponseRequests", async () => {
|
|
15
|
+
const { dir } = await tmpStore();
|
|
16
|
+
const v2 = {
|
|
17
|
+
schemaVersion: 2,
|
|
18
|
+
plans: {
|
|
19
|
+
"p1": {
|
|
20
|
+
id: "p1",
|
|
21
|
+
createdAt: 1,
|
|
22
|
+
rootTask: "x",
|
|
23
|
+
budgetCapTokens: 100_000,
|
|
24
|
+
perAgentCapTokens: 50_000,
|
|
25
|
+
status: "draft",
|
|
26
|
+
tasks: [],
|
|
27
|
+
notes: [],
|
|
28
|
+
messages: [],
|
|
29
|
+
claims: [],
|
|
30
|
+
// Missing the v0.4 fields
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
await fs.writeFile(path.join(dir, "orqlaude-state.json"), JSON.stringify(v2));
|
|
35
|
+
const fresh = new StateStore(dir);
|
|
36
|
+
const out = await fresh.read((s) => s.plans["p1"]);
|
|
37
|
+
assert.deepEqual(out.userNotifications, []);
|
|
38
|
+
assert.deepEqual(out.userResponseRequests, []);
|
|
39
|
+
});
|
|
40
|
+
test("newPlan initializes user-IO arrays empty", async () => {
|
|
41
|
+
const { store } = await tmpStore();
|
|
42
|
+
const plan = await store.update((s) => {
|
|
43
|
+
const p = newPlan("root", 100_000, [{ title: "T", prompt: "p", tldr: "tl" }]);
|
|
44
|
+
s.plans[p.id] = p;
|
|
45
|
+
return p;
|
|
46
|
+
});
|
|
47
|
+
assert.deepEqual(plan.userNotifications, []);
|
|
48
|
+
assert.deepEqual(plan.userResponseRequests, []);
|
|
49
|
+
});
|
|
50
|
+
test("findUserResponseRequest finds by full id and short id", async () => {
|
|
51
|
+
const { store } = await tmpStore();
|
|
52
|
+
await store.update((s) => {
|
|
53
|
+
const p = newPlan("root", 100_000, [{ title: "T", prompt: "p", tldr: "tl" }]);
|
|
54
|
+
p.userResponseRequests.push({
|
|
55
|
+
id: "abcdef12-3456-7890-abcd-ef1234567890",
|
|
56
|
+
shortId: "abcdef12",
|
|
57
|
+
prompt: "test",
|
|
58
|
+
createdAt: Date.now(),
|
|
59
|
+
timeoutAt: Date.now() + 60_000,
|
|
60
|
+
delivered: false,
|
|
61
|
+
});
|
|
62
|
+
s.plans[p.id] = p;
|
|
63
|
+
});
|
|
64
|
+
const r1 = await store.read((s) => findUserResponseRequest(s, "abcdef12-3456-7890-abcd-ef1234567890"));
|
|
65
|
+
assert.ok(r1, "full id lookup");
|
|
66
|
+
const r2 = await store.read((s) => findUserResponseRequest(s, "abcdef12"));
|
|
67
|
+
assert.ok(r2, "short id lookup");
|
|
68
|
+
assert.equal(r1.req.id, r2.req.id);
|
|
69
|
+
});
|
|
70
|
+
test("response request lifecycle: pending → answered", async () => {
|
|
71
|
+
const { store } = await tmpStore();
|
|
72
|
+
let planId = "";
|
|
73
|
+
let requestId = "";
|
|
74
|
+
await store.update((s) => {
|
|
75
|
+
const p = newPlan("root", 100_000, [{ title: "T", prompt: "p", tldr: "tl" }]);
|
|
76
|
+
planId = p.id;
|
|
77
|
+
requestId = "11111111-2222-3333-4444-555555555555";
|
|
78
|
+
p.userResponseRequests.push({
|
|
79
|
+
id: requestId,
|
|
80
|
+
shortId: "11111111",
|
|
81
|
+
prompt: "are we good?",
|
|
82
|
+
options: ["yes", "no"],
|
|
83
|
+
createdAt: Date.now(),
|
|
84
|
+
timeoutAt: Date.now() + 60_000,
|
|
85
|
+
delivered: false,
|
|
86
|
+
});
|
|
87
|
+
s.plans[p.id] = p;
|
|
88
|
+
});
|
|
89
|
+
// Pending
|
|
90
|
+
let req = await store.read((s) => findUserResponseRequest(s, "11111111").req);
|
|
91
|
+
assert.equal(req.response, undefined);
|
|
92
|
+
// Simulate the bot writing the answer
|
|
93
|
+
await store.update((s) => {
|
|
94
|
+
const found = findUserResponseRequest(s, "11111111");
|
|
95
|
+
found.req.response = "yes";
|
|
96
|
+
found.req.respondedAt = Date.now();
|
|
97
|
+
});
|
|
98
|
+
req = await store.read((s) => findUserResponseRequest(s, "11111111").req);
|
|
99
|
+
assert.equal(req.response, "yes");
|
|
100
|
+
});
|
|
101
|
+
//# sourceMappingURL=userio.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userio.test.js","sourceRoot":"","sources":["../../src/__tests__/userio.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,OAAO,EAAY,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAEzF;;GAEG;AAEH,KAAK,UAAU,QAAQ;IACrB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AAC7C,CAAC;AAED,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC5F,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IACjC,MAAM,EAAE,GAAQ;QACd,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE;YACL,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI;gBACR,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,GAAG;gBACb,eAAe,EAAE,OAAO;gBACxB,iBAAiB,EAAE,MAAM;gBACzB,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,EAAE;gBACV,0BAA0B;aAC3B;SACF;KACF,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACpC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IACnC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC1B,EAAE,EAAE,sCAAsC;YAC1C,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC,CAAC;IACvG,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAChC,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,EAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC;IACnC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9E,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QACd,SAAS,GAAG,sCAAsC,CAAC;QACnD,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAC1B,EAAE,EAAE,SAAS;YACb,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;YACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,UAAU;IACV,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAE,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtC,sCAAsC;IACtC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,KAAK,GAAG,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAE,CAAC;QACtD,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC3B,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,UAAU,CAAE,CAAC,GAAG,CAAC,CAAC;IAC3E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC"}
|
package/dist/lib/state.d.ts
CHANGED
|
@@ -77,6 +77,43 @@ export interface FileClaim {
|
|
|
77
77
|
reason?: string;
|
|
78
78
|
claimedAt: number;
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Outbound message from primary Claude to the user. Pushed to Telegram by
|
|
82
|
+
* the notifier on its next tick. Lives on the plan so it can be filtered by
|
|
83
|
+
* which fleet it belongs to.
|
|
84
|
+
*/
|
|
85
|
+
export interface UserNotification {
|
|
86
|
+
id: string;
|
|
87
|
+
taskId?: string;
|
|
88
|
+
text: string;
|
|
89
|
+
urgency: "low" | "normal" | "high";
|
|
90
|
+
createdAt: number;
|
|
91
|
+
delivered: boolean;
|
|
92
|
+
deliveredAt?: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Outbound question from primary Claude to the user, with an awaited
|
|
96
|
+
* response. The notifier pushes to Telegram (with an inline keyboard if
|
|
97
|
+
* `options` is set). The bot writes the user's choice/text back here on
|
|
98
|
+
* callback_query. Primary Claude polls via `poll_user_response`.
|
|
99
|
+
*/
|
|
100
|
+
export interface UserResponseRequest {
|
|
101
|
+
id: string;
|
|
102
|
+
shortId: string;
|
|
103
|
+
taskId?: string;
|
|
104
|
+
prompt: string;
|
|
105
|
+
options?: string[];
|
|
106
|
+
createdAt: number;
|
|
107
|
+
timeoutAt: number;
|
|
108
|
+
delivered: boolean;
|
|
109
|
+
deliveredAt?: number;
|
|
110
|
+
/** Telegram message_id of the question, so the bot can edit it on response. */
|
|
111
|
+
telegramMessageId?: number;
|
|
112
|
+
telegramChatId?: number;
|
|
113
|
+
response?: string;
|
|
114
|
+
respondedAt?: number;
|
|
115
|
+
cancelled?: boolean;
|
|
116
|
+
}
|
|
80
117
|
export interface Plan {
|
|
81
118
|
id: string;
|
|
82
119
|
createdAt: number;
|
|
@@ -97,10 +134,13 @@ export interface Plan {
|
|
|
97
134
|
notes: Note[];
|
|
98
135
|
messages: Message[];
|
|
99
136
|
claims: FileClaim[];
|
|
137
|
+
/** v0.4+: outbound notifications / questions from primary Claude to user. */
|
|
138
|
+
userNotifications: UserNotification[];
|
|
139
|
+
userResponseRequests: UserResponseRequest[];
|
|
100
140
|
reviewPlanId?: string;
|
|
101
141
|
}
|
|
102
142
|
export interface State {
|
|
103
|
-
schemaVersion:
|
|
143
|
+
schemaVersion: 3;
|
|
104
144
|
plans: Record<string, Plan>;
|
|
105
145
|
}
|
|
106
146
|
export declare class StateStore {
|
|
@@ -128,6 +168,10 @@ export declare class StateStore {
|
|
|
128
168
|
private persist;
|
|
129
169
|
}
|
|
130
170
|
export declare function newPlan(rootTask: string, budgetCapTokens: number, tasksInput: Array<Omit<Task, "id" | "status">>): Plan;
|
|
171
|
+
export declare function findUserResponseRequest(state: State, requestId: string): {
|
|
172
|
+
plan: Plan;
|
|
173
|
+
req: UserResponseRequest;
|
|
174
|
+
} | undefined;
|
|
131
175
|
export declare function findPlan(state: State, planId: string): Plan;
|
|
132
176
|
export declare function findTask(plan: Plan, taskId: string): Task;
|
|
133
177
|
export declare function findTaskBySession(plan: Plan, sessionId: string): Task | undefined;
|
package/dist/lib/state.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
const EMPTY_STATE = { schemaVersion:
|
|
4
|
+
const EMPTY_STATE = { schemaVersion: 3, plans: {} };
|
|
5
5
|
const LOCK_TIMEOUT_MS = 5_000;
|
|
6
6
|
const LOCK_RETRY_BASE_MS = 30;
|
|
7
7
|
export class StateStore {
|
|
@@ -143,12 +143,12 @@ function isProcessAlive(pid) {
|
|
|
143
143
|
function sleep(ms) {
|
|
144
144
|
return new Promise((res) => setTimeout(res, ms));
|
|
145
145
|
}
|
|
146
|
-
/** Forward-compatible migration from earlier schemas. */
|
|
146
|
+
/** Forward-compatible migration from earlier schemas. v1 → v3 in one pass. */
|
|
147
147
|
function migrate(input) {
|
|
148
148
|
const v = input.schemaVersion ?? 1;
|
|
149
|
-
if (v ===
|
|
149
|
+
if (v === 3 && input.plans)
|
|
150
150
|
return input;
|
|
151
|
-
const out = { schemaVersion:
|
|
151
|
+
const out = { schemaVersion: 3, plans: {} };
|
|
152
152
|
for (const [id, plan] of Object.entries(input.plans ?? {})) {
|
|
153
153
|
const p = plan;
|
|
154
154
|
out.plans[id] = {
|
|
@@ -159,6 +159,8 @@ function migrate(input) {
|
|
|
159
159
|
notes: p.notes ?? [],
|
|
160
160
|
messages: p.messages ?? [],
|
|
161
161
|
claims: p.claims ?? [],
|
|
162
|
+
userNotifications: p.userNotifications ?? [],
|
|
163
|
+
userResponseRequests: p.userResponseRequests ?? [],
|
|
162
164
|
};
|
|
163
165
|
}
|
|
164
166
|
return out;
|
|
@@ -181,8 +183,18 @@ export function newPlan(rootTask, budgetCapTokens, tasksInput) {
|
|
|
181
183
|
notes: [],
|
|
182
184
|
messages: [],
|
|
183
185
|
claims: [],
|
|
186
|
+
userNotifications: [],
|
|
187
|
+
userResponseRequests: [],
|
|
184
188
|
};
|
|
185
189
|
}
|
|
190
|
+
export function findUserResponseRequest(state, requestId) {
|
|
191
|
+
for (const plan of Object.values(state.plans)) {
|
|
192
|
+
const req = plan.userResponseRequests.find((r) => r.id === requestId || r.shortId === requestId);
|
|
193
|
+
if (req)
|
|
194
|
+
return { plan, req };
|
|
195
|
+
}
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
186
198
|
export function findPlan(state, planId) {
|
|
187
199
|
const plan = state.plans[planId];
|
|
188
200
|
if (!plan)
|
package/dist/lib/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/lib/state.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -10,6 +10,7 @@ import { registerDispatch } from "./tools/dispatch.js";
|
|
|
10
10
|
import { registerBroker } from "./tools/broker.js";
|
|
11
11
|
import { registerLifecycle } from "./tools/lifecycle.js";
|
|
12
12
|
import { registerReview } from "./tools/review.js";
|
|
13
|
+
import { registerUserIo } from "./tools/userio.js";
|
|
13
14
|
/**
|
|
14
15
|
* orqlaude — multi-agent orchestrator for Claude Code.
|
|
15
16
|
*
|
|
@@ -22,7 +23,7 @@ const store = new StateStore(stateDir);
|
|
|
22
23
|
const audit = new AuditLog(stateDir);
|
|
23
24
|
const server = new McpServer({
|
|
24
25
|
name: "orqlaude",
|
|
25
|
-
version: "0.
|
|
26
|
+
version: "0.4.0",
|
|
26
27
|
});
|
|
27
28
|
registerPing(server);
|
|
28
29
|
registerPlanning(server, store, audit);
|
|
@@ -30,6 +31,7 @@ registerDispatch(server, store, audit);
|
|
|
30
31
|
registerBroker(server, store, audit);
|
|
31
32
|
registerLifecycle(server, store, audit);
|
|
32
33
|
registerReview(server, store, audit);
|
|
34
|
+
registerUserIo(server, store, audit);
|
|
33
35
|
const transport = new StdioServerTransport();
|
|
34
36
|
await server.connect(transport);
|
|
35
37
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,wBAAwB,EAAE,CAAC;AAC5D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAErC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,YAAY,CAAC,MAAM,CAAC,CAAC;AACrB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACrC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACxC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAErC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,wBAAwB,EAAE,CAAC;AAC5D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAErC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,YAAY,CAAC,MAAM,CAAC,CAAC;AACrB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACrC,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACxC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACrC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAErC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
package/dist/telegram/api.d.ts
CHANGED
|
@@ -24,9 +24,20 @@ export interface TelegramMessage {
|
|
|
24
24
|
date: number;
|
|
25
25
|
text?: string;
|
|
26
26
|
}
|
|
27
|
+
export interface TelegramCallbackQuery {
|
|
28
|
+
id: string;
|
|
29
|
+
from: TelegramUser;
|
|
30
|
+
data?: string;
|
|
31
|
+
message?: TelegramMessage;
|
|
32
|
+
}
|
|
27
33
|
export interface TelegramUpdate {
|
|
28
34
|
update_id: number;
|
|
29
35
|
message?: TelegramMessage;
|
|
36
|
+
callback_query?: TelegramCallbackQuery;
|
|
37
|
+
}
|
|
38
|
+
export interface InlineKeyboardButton {
|
|
39
|
+
text: string;
|
|
40
|
+
callback_data: string;
|
|
30
41
|
}
|
|
31
42
|
export declare class TelegramApi {
|
|
32
43
|
private readonly token;
|
|
@@ -36,6 +47,15 @@ export declare class TelegramApi {
|
|
|
36
47
|
getUpdates(offset: number, timeoutSec?: number): Promise<TelegramUpdate[]>;
|
|
37
48
|
sendMessage(chatId: number, text: string, opts?: {
|
|
38
49
|
parseMode?: "Markdown" | "HTML";
|
|
50
|
+
inlineKeyboard?: InlineKeyboardButton[][];
|
|
51
|
+
}): Promise<{
|
|
52
|
+
message_id: number;
|
|
53
|
+
}>;
|
|
54
|
+
/** Acknowledge a callback_query so the Telegram client stops the spinner. */
|
|
55
|
+
answerCallbackQuery(callbackQueryId: string, text?: string): Promise<void>;
|
|
56
|
+
/** Edit a previously-sent message — used to mark questions as answered. */
|
|
57
|
+
editMessageText(chatId: number, messageId: number, text: string, opts?: {
|
|
58
|
+
parseMode?: "Markdown" | "HTML";
|
|
39
59
|
}): Promise<void>;
|
|
40
60
|
/** Verify the token works by hitting getMe. Returns the bot's username. */
|
|
41
61
|
getMe(): Promise<{
|
package/dist/telegram/api.js
CHANGED
|
@@ -30,19 +30,55 @@ export class TelegramApi {
|
|
|
30
30
|
return body.result;
|
|
31
31
|
}
|
|
32
32
|
async sendMessage(chatId, text, opts = {}) {
|
|
33
|
+
const body = {
|
|
34
|
+
chat_id: chatId,
|
|
35
|
+
text,
|
|
36
|
+
parse_mode: opts.parseMode,
|
|
37
|
+
disable_web_page_preview: true,
|
|
38
|
+
};
|
|
39
|
+
if (opts.inlineKeyboard) {
|
|
40
|
+
body.reply_markup = { inline_keyboard: opts.inlineKeyboard };
|
|
41
|
+
}
|
|
33
42
|
const res = await fetch(this.endpoint("sendMessage"), {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { "content-type": "application/json" },
|
|
45
|
+
body: JSON.stringify(body),
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
const text = await res.text();
|
|
49
|
+
throw new Error(`sendMessage ${res.status}: ${text}`);
|
|
50
|
+
}
|
|
51
|
+
const parsed = (await res.json());
|
|
52
|
+
return { message_id: parsed.result.message_id };
|
|
53
|
+
}
|
|
54
|
+
/** Acknowledge a callback_query so the Telegram client stops the spinner. */
|
|
55
|
+
async answerCallbackQuery(callbackQueryId, text) {
|
|
56
|
+
const res = await fetch(this.endpoint("answerCallbackQuery"), {
|
|
57
|
+
method: "POST",
|
|
58
|
+
headers: { "content-type": "application/json" },
|
|
59
|
+
body: JSON.stringify({ callback_query_id: callbackQueryId, text }),
|
|
60
|
+
});
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
// Non-fatal: log but don't throw. Telegram will eventually time out the
|
|
63
|
+
// spinner on the client side.
|
|
64
|
+
process.stderr.write(`[orqlaude tg] answerCallbackQuery ${res.status}: ${await res.text()}\n`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Edit a previously-sent message — used to mark questions as answered. */
|
|
68
|
+
async editMessageText(chatId, messageId, text, opts = {}) {
|
|
69
|
+
const res = await fetch(this.endpoint("editMessageText"), {
|
|
34
70
|
method: "POST",
|
|
35
71
|
headers: { "content-type": "application/json" },
|
|
36
72
|
body: JSON.stringify({
|
|
37
73
|
chat_id: chatId,
|
|
74
|
+
message_id: messageId,
|
|
38
75
|
text,
|
|
39
76
|
parse_mode: opts.parseMode,
|
|
40
77
|
disable_web_page_preview: true,
|
|
41
78
|
}),
|
|
42
79
|
});
|
|
43
80
|
if (!res.ok) {
|
|
44
|
-
|
|
45
|
-
throw new Error(`sendMessage ${res.status}: ${body}`);
|
|
81
|
+
process.stderr.write(`[orqlaude tg] editMessageText ${res.status}: ${await res.text()}\n`);
|
|
46
82
|
}
|
|
47
83
|
}
|
|
48
84
|
/** Verify the token works by hitting getMe. Returns the bot's username. */
|
package/dist/telegram/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/telegram/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,IAAI,GAAG,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/telegram/api.ts"],"names":[],"mappings":"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"}
|
package/dist/telegram/bot.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TelegramApi } from "./api.js";
|
|
2
2
|
import { loadConfig } from "./config.js";
|
|
3
|
-
import { handleCommand } from "./commands.js";
|
|
3
|
+
import { handleCommand, handleCallbackQuery } from "./commands.js";
|
|
4
4
|
import { Notifier } from "./notifier.js";
|
|
5
5
|
/**
|
|
6
6
|
* Bot main loop.
|
|
@@ -58,6 +58,11 @@ export async function runBot(projectDir) {
|
|
|
58
58
|
process.stderr.write(`[command] ${err.message}\n`);
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
|
+
else if (u.callback_query) {
|
|
62
|
+
await handleCallbackQuery(api, u.callback_query, projectDir).catch((err) => {
|
|
63
|
+
process.stderr.write(`[callback] ${err.message}\n`);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
}
|
|
63
68
|
catch (err) {
|
package/dist/telegram/bot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/telegram/bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TelegramApi } from "./api.js";
|
|
2
|
-
import type { TelegramMessage } from "./api.js";
|
|
2
|
+
import type { TelegramMessage, TelegramCallbackQuery } from "./api.js";
|
|
3
3
|
/**
|
|
4
4
|
* Telegram command handlers.
|
|
5
5
|
*
|
|
@@ -20,3 +20,7 @@ import type { TelegramMessage } from "./api.js";
|
|
|
20
20
|
* config schema is forward-compatible for multi-project later.
|
|
21
21
|
*/
|
|
22
22
|
export declare function handleCommand(api: TelegramApi, msg: TelegramMessage, projectDir: string): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Inline-keyboard tap handler. callback_data format: `orq:resp:<shortId>:<optionIdx>`.
|
|
25
|
+
*/
|
|
26
|
+
export declare function handleCallbackQuery(api: TelegramApi, q: TelegramCallbackQuery, projectDir: string): Promise<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { StateStore } from "../lib/state.js";
|
|
1
|
+
import { StateStore, findUserResponseRequest } from "../lib/state.js";
|
|
2
2
|
import { snapshotSession } from "../lib/jsonl_tail.js";
|
|
3
3
|
import { loadConfig, saveConfig, isAuthorized } from "./config.js";
|
|
4
|
+
import path from "node:path";
|
|
4
5
|
/**
|
|
5
6
|
* Telegram command handlers.
|
|
6
7
|
*
|
|
@@ -73,7 +74,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
73
74
|
if (text.startsWith("/status")) {
|
|
74
75
|
const planId = text.split(/\s+/)[1];
|
|
75
76
|
if (!planId)
|
|
76
|
-
return api.sendMessage(chatId, "usage: /status <plan_id>");
|
|
77
|
+
return void await api.sendMessage(chatId, "usage: /status <plan_id>");
|
|
77
78
|
try {
|
|
78
79
|
const plan = await stateStore.read((s) => requirePlan(s.plans, planId));
|
|
79
80
|
await api.sendMessage(chatId, await renderStatus(plan, projectDir), { parseMode: "Markdown" });
|
|
@@ -86,7 +87,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
86
87
|
if (text.startsWith("/show")) {
|
|
87
88
|
const planId = text.split(/\s+/)[1];
|
|
88
89
|
if (!planId)
|
|
89
|
-
return api.sendMessage(chatId, "usage: /show <plan_id>");
|
|
90
|
+
return void await api.sendMessage(chatId, "usage: /show <plan_id>");
|
|
90
91
|
try {
|
|
91
92
|
const plan = await stateStore.read((s) => requirePlan(s.plans, planId));
|
|
92
93
|
const json = JSON.stringify(plan, null, 2);
|
|
@@ -100,7 +101,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
100
101
|
if (text.startsWith("/notes")) {
|
|
101
102
|
const planId = text.split(/\s+/)[1];
|
|
102
103
|
if (!planId)
|
|
103
|
-
return api.sendMessage(chatId, "usage: /notes <plan_id>");
|
|
104
|
+
return void await api.sendMessage(chatId, "usage: /notes <plan_id>");
|
|
104
105
|
try {
|
|
105
106
|
const plan = await stateStore.read((s) => requirePlan(s.plans, planId));
|
|
106
107
|
const recent = plan.notes.slice(-10);
|
|
@@ -128,7 +129,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
128
129
|
const [, planId, taskId, ...reasonParts] = parts;
|
|
129
130
|
const reason = reasonParts.join(" ") || "killed from Telegram";
|
|
130
131
|
if (!planId || !taskId)
|
|
131
|
-
return api.sendMessage(chatId, "usage: /kill <plan_id> <task_id> <reason>");
|
|
132
|
+
return void await api.sendMessage(chatId, "usage: /kill <plan_id> <task_id> <reason>");
|
|
132
133
|
try {
|
|
133
134
|
await stateStore.update((s) => {
|
|
134
135
|
const plan = requirePlan(s.plans, planId);
|
|
@@ -165,7 +166,7 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
165
166
|
const [, target, ...rest] = text.split(/\s+/);
|
|
166
167
|
const targetId = Number(target);
|
|
167
168
|
if (!Number.isFinite(targetId))
|
|
168
|
-
return api.sendMessage(chatId, "usage: /whitelist <user_id> [label]");
|
|
169
|
+
return void await api.sendMessage(chatId, "usage: /whitelist <user_id> [label]");
|
|
169
170
|
const label = rest.join(" ") || undefined;
|
|
170
171
|
if (!cfg.whitelist.some((w) => w.userId === targetId)) {
|
|
171
172
|
cfg.whitelist.push({ userId: targetId, chatId: targetId, label });
|
|
@@ -174,11 +175,111 @@ export async function handleCommand(api, msg, projectDir) {
|
|
|
174
175
|
await api.sendMessage(chatId, `✓ Whitelisted ${targetId}${label ? ` (${label})` : ""}.`);
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
178
|
+
// /respond <short_id> <text> — user replies to a request_user_response
|
|
179
|
+
if (text.startsWith("/respond")) {
|
|
180
|
+
const m = text.match(/^\/respond\s+(\S+)\s+([\s\S]+)$/);
|
|
181
|
+
if (!m)
|
|
182
|
+
return void await api.sendMessage(chatId, "usage: /respond <short_id> <your answer>");
|
|
183
|
+
const [, shortId, answer] = m;
|
|
184
|
+
const store = new StateStore(path.join(projectDir, ".orqlaude"));
|
|
185
|
+
let edited = null;
|
|
186
|
+
const status = await store.update((state) => {
|
|
187
|
+
const found = findUserResponseRequest(state, shortId);
|
|
188
|
+
if (!found)
|
|
189
|
+
return "not_found";
|
|
190
|
+
const { req } = found;
|
|
191
|
+
if (req.response !== undefined)
|
|
192
|
+
return "already_answered";
|
|
193
|
+
if (req.cancelled)
|
|
194
|
+
return "cancelled";
|
|
195
|
+
if (Date.now() > req.timeoutAt)
|
|
196
|
+
return "timed_out";
|
|
197
|
+
req.response = answer;
|
|
198
|
+
req.respondedAt = Date.now();
|
|
199
|
+
if (req.telegramMessageId && req.telegramChatId) {
|
|
200
|
+
edited = { messageId: req.telegramMessageId, chatId: req.telegramChatId };
|
|
201
|
+
}
|
|
202
|
+
return "ok";
|
|
203
|
+
});
|
|
204
|
+
if (status === "ok") {
|
|
205
|
+
await api.sendMessage(chatId, `✓ Response recorded for ${shortId}.`);
|
|
206
|
+
if (edited) {
|
|
207
|
+
await api.editMessageText(edited.chatId, edited.messageId, `✓ Answered (${shortId}): ${truncateForEdit(answer, 150)}`, { parseMode: "Markdown" });
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (status === "not_found") {
|
|
211
|
+
await api.sendMessage(chatId, `no request with short_id ${shortId}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
await api.sendMessage(chatId, `request ${shortId}: ${status}`);
|
|
215
|
+
}
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
177
218
|
// Default: unknown command
|
|
178
219
|
if (text.startsWith("/")) {
|
|
179
220
|
await api.sendMessage(chatId, `unknown command. /help for the list.`);
|
|
180
221
|
}
|
|
181
222
|
}
|
|
223
|
+
/**
|
|
224
|
+
* Inline-keyboard tap handler. callback_data format: `orq:resp:<shortId>:<optionIdx>`.
|
|
225
|
+
*/
|
|
226
|
+
export async function handleCallbackQuery(api, q, projectDir) {
|
|
227
|
+
const cfg = await loadConfig();
|
|
228
|
+
const userId = q.from?.id;
|
|
229
|
+
if (!userId || !isAuthorized(cfg, userId)) {
|
|
230
|
+
await api.answerCallbackQuery(q.id, "Unauthorized.");
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const data = q.data ?? "";
|
|
234
|
+
const m = data.match(/^orq:resp:([^:]+):(\d+)$/);
|
|
235
|
+
if (!m) {
|
|
236
|
+
await api.answerCallbackQuery(q.id, "unknown action");
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const [, shortId, idxStr] = m;
|
|
240
|
+
const idx = Number(idxStr);
|
|
241
|
+
const store = new StateStore(path.join(projectDir, ".orqlaude"));
|
|
242
|
+
let answer = null;
|
|
243
|
+
let edited = null;
|
|
244
|
+
const status = await store.update((state) => {
|
|
245
|
+
const found = findUserResponseRequest(state, shortId);
|
|
246
|
+
if (!found)
|
|
247
|
+
return "not_found";
|
|
248
|
+
const { req } = found;
|
|
249
|
+
if (req.response !== undefined)
|
|
250
|
+
return "already_answered";
|
|
251
|
+
if (req.cancelled)
|
|
252
|
+
return "cancelled";
|
|
253
|
+
if (Date.now() > req.timeoutAt)
|
|
254
|
+
return "timed_out";
|
|
255
|
+
if (!req.options || idx >= req.options.length)
|
|
256
|
+
return "bad_option";
|
|
257
|
+
answer = req.options[idx];
|
|
258
|
+
req.response = answer;
|
|
259
|
+
req.respondedAt = Date.now();
|
|
260
|
+
if (req.telegramMessageId && req.telegramChatId) {
|
|
261
|
+
edited = { messageId: req.telegramMessageId, chatId: req.telegramChatId };
|
|
262
|
+
}
|
|
263
|
+
return "ok";
|
|
264
|
+
});
|
|
265
|
+
if (status === "ok" && answer !== null) {
|
|
266
|
+
await api.answerCallbackQuery(q.id, `✓ ${answer}`);
|
|
267
|
+
if (edited) {
|
|
268
|
+
await api.editMessageText(edited.chatId, edited.messageId, `✓ Answered (${shortId}): *${escapeMdLocal(answer)}*`, { parseMode: "Markdown" });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
await api.answerCallbackQuery(q.id, status);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function escapeMdLocal(s) {
|
|
276
|
+
return s.replace(/([_*`\[])/g, "\\$1");
|
|
277
|
+
}
|
|
278
|
+
function truncateForEdit(s, n) {
|
|
279
|
+
if (s.length <= n)
|
|
280
|
+
return s;
|
|
281
|
+
return s.slice(0, n - 1) + "…";
|
|
282
|
+
}
|
|
182
283
|
function requirePlan(plans, planId) {
|
|
183
284
|
const full = plans[planId] ?? Object.values(plans).find((p) => p.id.startsWith(planId));
|
|
184
285
|
if (!full)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/telegram/commands.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/telegram/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,16 +13,8 @@ export declare class Notifier {
|
|
|
13
13
|
tick(): Promise<void>;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
* Escape
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* `_ * ` ` [`. Without escaping these in user-supplied strings, an innocuous
|
|
20
|
-
* branch name like `feature/foo_bar` or a note containing a single `*` makes
|
|
21
|
-
* sendMessage 400 → notifier swallows the error → cursor already advanced →
|
|
22
|
-
* notification permanently lost.
|
|
23
|
-
*
|
|
24
|
-
* URL text (e.g. PR links) is appended raw and not run through this escaper,
|
|
25
|
-
* because backslashing chars in URLs breaks them. Keep URL fragments out of
|
|
26
|
-
* this function's input.
|
|
16
|
+
* Escape Telegram MarkdownV1 reserved chars in user-supplied strings:
|
|
17
|
+
* `_ * ` [`. Backslashing parens / hyphens / dots etc. is unnecessary in
|
|
18
|
+
* V1 (those are syntax only in V2 / MarkdownV2).
|
|
27
19
|
*/
|
|
28
20
|
export declare function escapeMd(s: string): string;
|
|
@@ -7,7 +7,10 @@ const EMPTY_CURSOR = {
|
|
|
7
7
|
taskStatus: {},
|
|
8
8
|
planStatus: {},
|
|
9
9
|
alertedHallucinations: [],
|
|
10
|
+
notifiedUserNotificationIds: [],
|
|
11
|
+
notifiedUserRequestIds: [],
|
|
10
12
|
};
|
|
13
|
+
const URGENCY_EMOJI = { low: "💬", normal: "📢", high: "🚨" };
|
|
11
14
|
export class Notifier {
|
|
12
15
|
projectDir;
|
|
13
16
|
cfg;
|
|
@@ -58,31 +61,38 @@ export class Notifier {
|
|
|
58
61
|
cursor.taskStatus[task.id] = task.status;
|
|
59
62
|
if (plan.notes.length > 0)
|
|
60
63
|
cursor.lastNoteId = plan.notes[plan.notes.length - 1].id;
|
|
64
|
+
for (const n of plan.userNotifications)
|
|
65
|
+
cursor.notifiedUserNotificationIds.push(n.id);
|
|
66
|
+
for (const r of plan.userResponseRequests)
|
|
67
|
+
cursor.notifiedUserRequestIds.push(r.id);
|
|
61
68
|
}
|
|
62
69
|
cursor.initialized = true;
|
|
63
70
|
await this.saveCursor();
|
|
64
71
|
return;
|
|
65
72
|
}
|
|
66
|
-
|
|
73
|
+
// Plain text messages (no inline keyboard).
|
|
74
|
+
const plainMessages = [];
|
|
75
|
+
const questionPushes = [];
|
|
67
76
|
for (const plan of plans) {
|
|
77
|
+
// ---- plan/task status transitions ----
|
|
68
78
|
const prevStatus = cursor.planStatus[plan.id];
|
|
69
79
|
if (prevStatus !== plan.status) {
|
|
70
80
|
if (!prevStatus && plan.status === "draft") {
|
|
71
|
-
|
|
81
|
+
plainMessages.push(`📋 *New plan* \`${plan.id.slice(0, 8)}\` — ${plan.tasks.length} task(s)\n${escapeMd(truncate(plan.rootTask, 100))}`);
|
|
72
82
|
}
|
|
73
83
|
else if (plan.status === "approved" && prevStatus !== "approved") {
|
|
74
|
-
|
|
84
|
+
plainMessages.push(`✅ *Approved* \`${plan.id.slice(0, 8)}\` — spawning ${plan.tasks.length} agents`);
|
|
75
85
|
}
|
|
76
86
|
else if (plan.status === "collected") {
|
|
77
87
|
const total = plan.tasks.length;
|
|
78
88
|
const done = plan.tasks.filter((t) => t.status === "done").length;
|
|
79
|
-
|
|
89
|
+
plainMessages.push(`🎉 *Collected* \`${plan.id.slice(0, 8)}\` — ${done}/${total} tasks done`);
|
|
80
90
|
}
|
|
81
91
|
else if (plan.status === "cancelled_overbudget") {
|
|
82
|
-
|
|
92
|
+
plainMessages.push(`💸 *Auto-cancelled* \`${plan.id.slice(0, 8)}\` — fleet exceeded token budget`);
|
|
83
93
|
}
|
|
84
94
|
else if (plan.status === "cancelled") {
|
|
85
|
-
|
|
95
|
+
plainMessages.push(`❌ *Cancelled* \`${plan.id.slice(0, 8)}\``);
|
|
86
96
|
}
|
|
87
97
|
cursor.planStatus[plan.id] = plan.status;
|
|
88
98
|
}
|
|
@@ -91,18 +101,18 @@ export class Notifier {
|
|
|
91
101
|
if (prev !== task.status) {
|
|
92
102
|
if (task.status === "done") {
|
|
93
103
|
const prSuffix = task.prUrl ? `\n${task.prUrl}` : "";
|
|
94
|
-
|
|
104
|
+
plainMessages.push(`✓ *${escapeMd(truncate(task.title, 60))}* — done${prSuffix}`);
|
|
95
105
|
}
|
|
96
106
|
else if (task.status === "failed") {
|
|
97
|
-
|
|
107
|
+
plainMessages.push(`❌ *${escapeMd(truncate(task.title, 60))}* — failed${task.exitReason ? `\n${escapeMd(task.exitReason)}` : ""}`);
|
|
98
108
|
}
|
|
99
109
|
else if (task.status === "cancelled") {
|
|
100
|
-
|
|
110
|
+
plainMessages.push(`🛑 *${escapeMd(truncate(task.title, 60))}* — cancelled`);
|
|
101
111
|
}
|
|
102
112
|
cursor.taskStatus[task.id] = task.status;
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
|
-
//
|
|
115
|
+
// ---- agent notes ----
|
|
106
116
|
let foundLast = cursor.lastNoteId === null;
|
|
107
117
|
for (const note of plan.notes) {
|
|
108
118
|
if (!foundLast) {
|
|
@@ -112,14 +122,44 @@ export class Notifier {
|
|
|
112
122
|
}
|
|
113
123
|
const taskTitle = plan.tasks.find((t) => t.id === note.taskId)?.title ?? note.taskId.slice(0, 8);
|
|
114
124
|
const blocking = note.blocking ? " 🟡 blocking" : "";
|
|
115
|
-
|
|
125
|
+
plainMessages.push(`📝 *${escapeMd(truncate(taskTitle, 50))}*${blocking}\n${escapeMd(truncate(note.text, 300))}${note.prUrl ? `\n${note.prUrl}` : ""}`);
|
|
116
126
|
cursor.lastNoteId = note.id;
|
|
117
127
|
}
|
|
128
|
+
// ---- v0.4: user notifications ----
|
|
129
|
+
for (const n of plan.userNotifications) {
|
|
130
|
+
if (cursor.notifiedUserNotificationIds.includes(n.id))
|
|
131
|
+
continue;
|
|
132
|
+
const emoji = URGENCY_EMOJI[n.urgency] ?? URGENCY_EMOJI.normal;
|
|
133
|
+
plainMessages.push(`${emoji} ${escapeMd(n.text)}`);
|
|
134
|
+
cursor.notifiedUserNotificationIds.push(n.id);
|
|
135
|
+
}
|
|
136
|
+
// ---- v0.4: user response requests ----
|
|
137
|
+
for (const r of plan.userResponseRequests) {
|
|
138
|
+
if (cursor.notifiedUserRequestIds.includes(r.id))
|
|
139
|
+
continue;
|
|
140
|
+
if (r.cancelled || r.response !== undefined) {
|
|
141
|
+
// Already resolved before we got to it; just record so we don't re-send.
|
|
142
|
+
cursor.notifiedUserRequestIds.push(r.id);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const headline = `❓ *Question from orqlaude* \\(${r.shortId}\\)\n${escapeMd(r.prompt)}`;
|
|
146
|
+
const trailer = r.options
|
|
147
|
+
? ""
|
|
148
|
+
: `\n\nReply with: \`/respond ${r.shortId} <your answer>\``;
|
|
149
|
+
const text = headline + trailer;
|
|
150
|
+
const inlineKeyboard = r.options
|
|
151
|
+
? buildInlineKeyboard(r.shortId, r.options)
|
|
152
|
+
: undefined;
|
|
153
|
+
questionPushes.push({ req: r, text, inlineKeyboard });
|
|
154
|
+
cursor.notifiedUserRequestIds.push(r.id);
|
|
155
|
+
}
|
|
118
156
|
}
|
|
119
|
-
//
|
|
157
|
+
// Persist cursor BEFORE we attempt sends — so a failed network call
|
|
158
|
+
// doesn't cause re-spam on retry.
|
|
120
159
|
await this.saveCursor();
|
|
160
|
+
// Send plain notifications to every whitelisted chat.
|
|
121
161
|
for (const entry of this.cfg.whitelist) {
|
|
122
|
-
for (const msg of
|
|
162
|
+
for (const msg of plainMessages) {
|
|
123
163
|
try {
|
|
124
164
|
await this.api.sendMessage(entry.chatId, msg, { parseMode: "Markdown" });
|
|
125
165
|
}
|
|
@@ -128,20 +168,59 @@ export class Notifier {
|
|
|
128
168
|
}
|
|
129
169
|
}
|
|
130
170
|
}
|
|
171
|
+
// Send question pushes. Persist message_id back into state so the bot
|
|
172
|
+
// can edit on response.
|
|
173
|
+
for (const qp of questionPushes) {
|
|
174
|
+
for (const entry of this.cfg.whitelist) {
|
|
175
|
+
try {
|
|
176
|
+
const { message_id } = await this.api.sendMessage(entry.chatId, qp.text, {
|
|
177
|
+
parseMode: "Markdown",
|
|
178
|
+
inlineKeyboard: qp.inlineKeyboard,
|
|
179
|
+
});
|
|
180
|
+
// Save message_id + chat_id of FIRST whitelisted recipient so the
|
|
181
|
+
// bot can edit the question into a "✓ answered" form on response.
|
|
182
|
+
if (qp.req.telegramMessageId === undefined) {
|
|
183
|
+
await store.update((state) => {
|
|
184
|
+
for (const plan of Object.values(state.plans)) {
|
|
185
|
+
const r = plan.userResponseRequests.find((x) => x.id === qp.req.id);
|
|
186
|
+
if (r) {
|
|
187
|
+
r.telegramMessageId = message_id;
|
|
188
|
+
r.telegramChatId = entry.chatId;
|
|
189
|
+
r.delivered = true;
|
|
190
|
+
r.deliveredAt = Date.now();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
process.stderr.write(`[orqlaude tg notifier] question send to ${entry.chatId} failed: ${err.message}\n`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function buildInlineKeyboard(shortId, options) {
|
|
204
|
+
// Two columns max; one row per pair. callback_data format:
|
|
205
|
+
// orq:resp:<shortId>:<optionIdx>
|
|
206
|
+
// Telegram's callback_data is capped at 64 bytes; shortId (8) + prefix (~10)
|
|
207
|
+
// + index (1-2) is well under.
|
|
208
|
+
const rows = [];
|
|
209
|
+
for (let i = 0; i < options.length; i += 2) {
|
|
210
|
+
const row = [
|
|
211
|
+
{ text: options[i], callback_data: `orq:resp:${shortId}:${i}` },
|
|
212
|
+
];
|
|
213
|
+
if (i + 1 < options.length) {
|
|
214
|
+
row.push({ text: options[i + 1], callback_data: `orq:resp:${shortId}:${i + 1}` });
|
|
215
|
+
}
|
|
216
|
+
rows.push(row);
|
|
131
217
|
}
|
|
218
|
+
return rows;
|
|
132
219
|
}
|
|
133
220
|
/**
|
|
134
|
-
* Escape
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* `_ * ` ` [`. Without escaping these in user-supplied strings, an innocuous
|
|
138
|
-
* branch name like `feature/foo_bar` or a note containing a single `*` makes
|
|
139
|
-
* sendMessage 400 → notifier swallows the error → cursor already advanced →
|
|
140
|
-
* notification permanently lost.
|
|
141
|
-
*
|
|
142
|
-
* URL text (e.g. PR links) is appended raw and not run through this escaper,
|
|
143
|
-
* because backslashing chars in URLs breaks them. Keep URL fragments out of
|
|
144
|
-
* this function's input.
|
|
221
|
+
* Escape Telegram MarkdownV1 reserved chars in user-supplied strings:
|
|
222
|
+
* `_ * ` [`. Backslashing parens / hyphens / dots etc. is unnecessary in
|
|
223
|
+
* V1 (those are syntax only in V2 / MarkdownV2).
|
|
145
224
|
*/
|
|
146
225
|
export function escapeMd(s) {
|
|
147
226
|
return s.replace(/([_*`\[])/g, "\\$1");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/telegram/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/telegram/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAuC,MAAM,iBAAiB,CAAC;AA6BlF,MAAM,YAAY,GAAmB;IACnC,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,IAAI;IAChB,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,qBAAqB,EAAE,EAAE;IACzB,2BAA2B,EAAE,EAAE;IAC/B,sBAAsB,EAAE,EAAE;CAC3B,CAAC;AAEF,MAAM,aAAa,GAA2B,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAEtF,MAAM,OAAO,QAAQ;IAIC;IAA4B;IAA6B;IAHrE,UAAU,CAAS;IACnB,MAAM,GAA0B,IAAI,CAAC;IAE7C,YAAoB,UAAkB,EAAU,GAAmB,EAAU,GAAgB;QAAzE,eAAU,GAAV,UAAU,CAAQ;QAAU,QAAG,GAAH,GAAG,CAAgB;QAAU,QAAG,GAAH,GAAG,CAAa;QAC3F,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,YAAY,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,EAAE,CAAC;QACrF,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;;gBACxD,MAAM,GAAG,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC,MAAO,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QAClE,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QACtE,MAAM,KAAK,GAAW,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtE,iEAAiE;QACjE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;oBAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBACxE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,iBAAiB;oBAAE,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACtF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,oBAAoB;oBAAE,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,4CAA4C;QAC5C,MAAM,aAAa,GAAa,EAAE,CAAC;QAQnC,MAAM,cAAc,GAAmB,EAAE,CAAC;QAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,yCAAyC;YACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC3C,aAAa,CAAC,IAAI,CAChB,mBAAmB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,aAAa,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,CACrH,CAAC;gBACJ,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;oBACnE,aAAa,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;gBACvG,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;oBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;oBAClE,aAAa,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,KAAK,aAAa,CAAC,CAAC;gBAChG,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,sBAAsB,EAAE,CAAC;oBAClD,aAAa,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,kCAAkC,CAAC,CAAC;gBACrG,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACvC,aAAa,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACjE,CAAC;gBACD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3C,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACxC,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;wBAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACrD,aAAa,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;oBACpF,CAAC;yBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACpC,aAAa,CAAC,IAAI,CAChB,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/G,CAAC;oBACJ,CAAC;yBAAM,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;wBACvC,aAAa,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;oBAC/E,CAAC;oBACD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,wBAAwB;YACxB,IAAI,SAAS,GAAG,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,UAAU;wBAAE,SAAS,GAAG,IAAI,CAAC;oBACpD,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,aAAa,CAAC,IAAI,CAChB,OAAO,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACpI,CAAC;gBACF,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;YAC9B,CAAC;YAED,qCAAqC;YACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvC,IAAI,MAAM,CAAC,2BAA2B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAChE,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC;gBAC/D,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnD,MAAM,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,yCAAyC;YACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC1C,IAAI,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC3D,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC5C,yEAAyE;oBACzE,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzC,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,GAAG,iCAAiC,CAAC,CAAC,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxF,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO;oBACvB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,8BAA8B,CAAC,CAAC,OAAO,kBAAkB,CAAC;gBAC9D,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;gBAChC,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO;oBAC9B,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;oBAC3C,CAAC,CAAC,SAAS,CAAC;gBACd,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;gBACtD,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,kCAAkC;QAClC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,sDAAsD;QACtD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3E,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,MAAM,YAAa,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC7G,CAAC;YACH,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,wBAAwB;QACxB,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE;wBACvE,SAAS,EAAE,UAAU;wBACrB,cAAc,EAAE,EAAE,CAAC,cAAc;qBAClC,CAAC,CAAC;oBACH,kEAAkE;oBAClE,kEAAkE;oBAClE,IAAI,EAAE,CAAC,GAAG,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;wBAC3C,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;4BAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gCAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gCACpE,IAAI,CAAC,EAAE,CAAC;oCACN,CAAC,CAAC,iBAAiB,GAAG,UAAU,CAAC;oCACjC,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;oCAChC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;oCACnB,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gCAC7B,CAAC;4BACH,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,KAAK,CAAC,MAAM,YAAa,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;gBACtH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,OAAe,EAAE,OAAiB;IAC7D,2DAA2D;IAC3D,mCAAmC;IACnC,6EAA6E;IAC7E,+BAA+B;IAC/B,MAAM,IAAI,GAA6B,EAAE,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAA2B;YAClC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,OAAO,IAAI,CAAC,EAAE,EAAE;SAChE,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AACjC,CAAC"}
|
package/dist/tools/ping.js
CHANGED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StateStore } from "../lib/state.js";
|
|
3
|
+
import type { AuditLog } from "../lib/audit.js";
|
|
4
|
+
export declare function registerUserIo(server: McpServer, store: StateStore, audit: AuditLog): void;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { findPlan, findUserResponseRequest } from "../lib/state.js";
|
|
4
|
+
/**
|
|
5
|
+
* Broker-to-user tools (v0.4+).
|
|
6
|
+
*
|
|
7
|
+
* The other broker tools (send_message / post_note) only connect primary
|
|
8
|
+
* Claude to spawned children. These three close the gap to the user:
|
|
9
|
+
*
|
|
10
|
+
* notify_user one-way push (Telegram), no response expected
|
|
11
|
+
* request_user_response push + await; user taps a button or replies
|
|
12
|
+
* poll_user_response primary Claude polls for the answer
|
|
13
|
+
*
|
|
14
|
+
* Implementation: writes to plan.userNotifications / plan.userResponseRequests.
|
|
15
|
+
* The Telegram notifier (separate process, `orqlaude tg start`) detects new
|
|
16
|
+
* entries on its 5-second tick and pushes them. The bot listens for callback_query
|
|
17
|
+
* updates and writes the response back into state.
|
|
18
|
+
*/
|
|
19
|
+
const URGENCY = z.enum(["low", "normal", "high"]);
|
|
20
|
+
export function registerUserIo(server, store, audit) {
|
|
21
|
+
// ---- notify_user ----------------------------------------------------------
|
|
22
|
+
server.tool("notify_user", "PRIMARY CLAUDE → USER (Telegram). One-way push of an arbitrary message to the user's whitelisted Telegram chats. The notifier picks it up on its next 5-second tick. Use for mid-fleet status updates the user might want to know about (e.g. 'reviewer agent flagged 3 BLOCKERs', 'agent 2 finished early', 'budget at 80%'). Doesn't await a response — pair with request_user_response if you need one.", {
|
|
23
|
+
plan_id: z.string().describe("Plan id this notification belongs to (for filtering / context)."),
|
|
24
|
+
text: z.string().min(1).max(2000).describe("The message text. Will be Markdown-escaped before send. Keep concise."),
|
|
25
|
+
urgency: URGENCY.default("normal").describe("Affects emoji prefix in the Telegram message. low → 💬, normal → 📢, high → 🚨."),
|
|
26
|
+
task_id: z.string().optional().describe("Optional: attribute the notification to a specific task in the plan."),
|
|
27
|
+
}, audit.wrap("notify_user", async ({ plan_id, text, urgency, task_id }) => {
|
|
28
|
+
const result = await store.update((state) => {
|
|
29
|
+
const plan = findPlan(state, plan_id);
|
|
30
|
+
const note = {
|
|
31
|
+
id: randomUUID(),
|
|
32
|
+
taskId: task_id,
|
|
33
|
+
text,
|
|
34
|
+
urgency,
|
|
35
|
+
createdAt: Date.now(),
|
|
36
|
+
delivered: false,
|
|
37
|
+
};
|
|
38
|
+
plan.userNotifications.push(note);
|
|
39
|
+
return {
|
|
40
|
+
plan_id,
|
|
41
|
+
notification_id: note.id,
|
|
42
|
+
queued: true,
|
|
43
|
+
delivered_via_telegram: "pending — depends on `orqlaude tg start` running with at least one whitelisted user.",
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
47
|
+
}, ({ plan_id }) => ({ planId: plan_id })));
|
|
48
|
+
// ---- request_user_response -----------------------------------------------
|
|
49
|
+
server.tool("request_user_response", "PRIMARY CLAUDE asks the user a question via Telegram and awaits the response. If `options` is provided, the message has inline-keyboard buttons; otherwise the user is told to reply with `/respond <short_id> <text>`. Returns a `request_id` — poll it via `poll_user_response`. Times out after `timeout_sec` (default 600s = 10 min); if no response, status returns `timed_out`.", {
|
|
50
|
+
plan_id: z.string(),
|
|
51
|
+
prompt: z.string().min(1).max(2000).describe("The question to ask the user."),
|
|
52
|
+
options: z.array(z.string().min(1).max(32)).max(8).optional().describe("Optional list of button labels (≤8, each ≤32 chars). If provided, Telegram shows an inline keyboard. If omitted, freeform reply expected."),
|
|
53
|
+
timeout_sec: z.number().int().positive().max(3600).default(600).describe("Max seconds to wait. After this, poll returns `timed_out`. Default 600 (10 min); cap 3600 (1h)."),
|
|
54
|
+
task_id: z.string().optional(),
|
|
55
|
+
}, audit.wrap("request_user_response", async ({ plan_id, prompt, options, timeout_sec, task_id }) => {
|
|
56
|
+
const result = await store.update((state) => {
|
|
57
|
+
const plan = findPlan(state, plan_id);
|
|
58
|
+
const id = randomUUID();
|
|
59
|
+
const shortId = id.slice(0, 8);
|
|
60
|
+
const req = {
|
|
61
|
+
id,
|
|
62
|
+
shortId,
|
|
63
|
+
taskId: task_id,
|
|
64
|
+
prompt,
|
|
65
|
+
options,
|
|
66
|
+
createdAt: Date.now(),
|
|
67
|
+
timeoutAt: Date.now() + timeout_sec * 1000,
|
|
68
|
+
delivered: false,
|
|
69
|
+
};
|
|
70
|
+
plan.userResponseRequests.push(req);
|
|
71
|
+
return {
|
|
72
|
+
plan_id,
|
|
73
|
+
request_id: id,
|
|
74
|
+
short_id: shortId,
|
|
75
|
+
timeout_at: req.timeoutAt,
|
|
76
|
+
has_options: Boolean(options && options.length > 0),
|
|
77
|
+
next_step: "Poll `poll_user_response(request_id)` periodically. It returns status=`pending` until the user answers (or timeout). If no Telegram bot is running, the user can't respond — fall back to AskUserQuestion.",
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
81
|
+
}, ({ plan_id }) => ({ planId: plan_id })));
|
|
82
|
+
// ---- poll_user_response ---------------------------------------------------
|
|
83
|
+
server.tool("poll_user_response", "Poll a previously-issued `request_user_response`. Returns `status: pending | answered | timed_out | cancelled` and the `response` text when answered. Safe to call repeatedly; no side effects.", {
|
|
84
|
+
request_id: z.string().describe("Either the full UUID or the 8-char short_id returned by request_user_response."),
|
|
85
|
+
}, audit.wrap("poll_user_response", async ({ request_id }) => {
|
|
86
|
+
const result = await store.read((state) => {
|
|
87
|
+
const found = findUserResponseRequest(state, request_id);
|
|
88
|
+
if (!found) {
|
|
89
|
+
return { request_id, status: "unknown", note: "No request with that id or short_id." };
|
|
90
|
+
}
|
|
91
|
+
const { req } = found;
|
|
92
|
+
if (req.cancelled)
|
|
93
|
+
return { request_id: req.id, status: "cancelled" };
|
|
94
|
+
if (req.response !== undefined) {
|
|
95
|
+
return {
|
|
96
|
+
request_id: req.id,
|
|
97
|
+
status: "answered",
|
|
98
|
+
response: req.response,
|
|
99
|
+
responded_at: req.respondedAt,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (Date.now() > req.timeoutAt) {
|
|
103
|
+
return { request_id: req.id, status: "timed_out", timeout_at: req.timeoutAt };
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
request_id: req.id,
|
|
107
|
+
status: "pending",
|
|
108
|
+
delivered: req.delivered,
|
|
109
|
+
timeout_at: req.timeoutAt,
|
|
110
|
+
remaining_sec: Math.max(0, Math.round((req.timeoutAt - Date.now()) / 1000)),
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=userio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userio.js","sourceRoot":"","sources":["../../src/tools/userio.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synaplink/orqlaude",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Multi-agent orchestrator for Claude Code. One primary session decomposes a complex task, gets a single budget approval, then dispatches N parallel agents via the Desktop app's native spawn_task. Tracks cost/status via JSONL tails; brokers messages between agents; detects hallucination; manages PRs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|