@synaplink/orqlaude 0.3.2 → 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/.mcp.json.template +4 -1
- package/README.md +45 -8
- package/dist/__tests__/state.test.js +1 -1
- package/dist/__tests__/state_dir.test.js +13 -0
- package/dist/__tests__/state_dir.test.js.map +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 +57 -2
- package/dist/lib/state.js +16 -4
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/state_dir.d.ts +3 -1
- package/dist/lib/state_dir.js +33 -5
- package/dist/lib/state_dir.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 +108 -7
- 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/broker.js +26 -16
- package/dist/tools/broker.js.map +1 -1
- package/dist/tools/dispatch.js +13 -3
- package/dist/tools/dispatch.js.map +1 -1
- package/dist/tools/lifecycle.js +38 -3
- package/dist/tools/lifecycle.js.map +1 -1
- package/dist/tools/ping.js +11 -3
- package/dist/tools/ping.js.map +1 -1
- package/dist/tools/planning.js +93 -33
- package/dist/tools/planning.js.map +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/.mcp.json.template
CHANGED
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
|
|
|
@@ -142,17 +154,26 @@ Files inside the dir:
|
|
|
142
154
|
|
|
143
155
|
## Hallucination detection
|
|
144
156
|
|
|
145
|
-
`status()`
|
|
157
|
+
When you call `status(plan_id)`, every agent's snapshot includes a `hallucination` object with `score` (0–1), `level` (`clean`/`minor`/`moderate`/`severe`), and `concerns: string[]`. The aggregated `hallucination_alerts` array surfaces only agents at `moderate` or above so an orchestrator can react quickly.
|
|
158
|
+
|
|
159
|
+
**What gets flagged:**
|
|
146
160
|
|
|
147
|
-
1. **Path-existence
|
|
161
|
+
1. **Path-existence** — every `file_path` arg in `Read`/`Edit`/`Write`/`Grep`/`Glob`/`MultiEdit`/`NotebookEdit`/`NotebookRead` is checked against the worktree. >30% missing or ≥3 missing = moderate/severe. Catches "agent is editing a file it imagined."
|
|
148
162
|
2. **Tool-pattern sanity**:
|
|
149
|
-
- Edit
|
|
150
|
-
-
|
|
151
|
-
- `git commit` without
|
|
163
|
+
- **Edit-without-prior-Read**: agent edits a file it never read → it's guessing at the content.
|
|
164
|
+
- **Tight loop**: same tool call (name+args) ≥3× → likely stuck.
|
|
165
|
+
- **Commit-without-tests**: `git commit` without a prior test/lint Bash call → commit may be broken.
|
|
152
166
|
|
|
153
|
-
|
|
167
|
+
**How to react** in your orchestrator code:
|
|
154
168
|
|
|
155
|
-
|
|
169
|
+
| level | suggested response |
|
|
170
|
+
|---|---|
|
|
171
|
+
| `clean` | Nothing. |
|
|
172
|
+
| `minor` | Note but continue. |
|
|
173
|
+
| `moderate` | `send_message` to the agent with a nudge ("re-read X.ts before editing"), or `request_stop` if the work is salvageable. |
|
|
174
|
+
| `severe` | `kill_task` and consider re-spawning with a clearer prompt. |
|
|
175
|
+
|
|
176
|
+
False positives are acceptable here — we surface concerns, we don't auto-kill. A v0.4 addition is opt-in second-model cross-validation (a cheap Haiku reading the agent's recent turns and rating "is this lost?").
|
|
156
177
|
|
|
157
178
|
## CLI
|
|
158
179
|
|
|
@@ -230,6 +251,8 @@ orqlaude tg start
|
|
|
230
251
|
- `/show <plan_id>` — raw plan JSON
|
|
231
252
|
- `/notes <plan_id>` — recent agent notes
|
|
232
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+)
|
|
233
256
|
- `/whitelist <user_id> [label]` (owner-only) — add another user
|
|
234
257
|
- `/help` / `/whoami`
|
|
235
258
|
|
|
@@ -243,6 +266,20 @@ The bot uses raw `fetch` against Telegram's Bot API — zero extra deps. State i
|
|
|
243
266
|
- **Multi-project Telegram bot** — currently the bot watches a single project. Multi-project watching is a small extension to the config schema.
|
|
244
267
|
- **Inline approve buttons in Telegram** — `/approve <plan_id>` and inline keyboards so you can confirm fleets from your phone.
|
|
245
268
|
|
|
269
|
+
## Troubleshooting
|
|
270
|
+
|
|
271
|
+
**Symptom: `ENOENT: no such file or directory, mkdir '/.orqlaude'` on `create_plan`.**
|
|
272
|
+
Your MCP host launched orqlaude with `cwd=/`. v0.3.2+ auto-falls back to `~/.orqlaude/projects/...` but the explicit fix is to set `ORQLAUDE_STATE_DIR` in your `.mcp.json` env block (see `.mcp.json.template`). Verify with `mcp__orqlaude__ping` — it now returns `warnings` and `state_dir_source`.
|
|
273
|
+
|
|
274
|
+
**Symptom: spawn_task chip appeared, agent ran, but `status()` shows the task as `dispatched` forever.**
|
|
275
|
+
The child agent isn't calling `checkin` on its first turn — its prompt didn't get the orqlaude protocol block, or `mcp__orqlaude__checkin` isn't available in the spawned session. Manual unblock: `register_spawn(plan_id, task_id, session_id)` where session_id is the child's session UUID (find via `mcp__ccd_session_mgmt__list_sessions`). For the proper fix, make sure orqlaude is in the spawned worktree's `.mcp.json` (commit `.mcp.json` to the repo so worktrees inherit it).
|
|
276
|
+
|
|
277
|
+
**Symptom: agents in worktrees can't see the parent fleet's plan.**
|
|
278
|
+
v0.3.1+ resolves `<cwd>/.git` files (worktree pointers) back to the parent checkout's `.orqlaude`. If a child still can't find its plan, run `orqlaude where` inside the worktree — `source` should be `worktree`. If it's `home-fallback`, the worktree pointer is malformed or `.git` isn't where the resolver expected.
|
|
279
|
+
|
|
280
|
+
**Symptom: Telegram bot stops sending notifications.**
|
|
281
|
+
Check `/tmp/orqlaude-tg.log` (if you used the launchd plist) or wherever the bot is logging. The most likely cause is a Markdown parse error from an unescaped `_`/`*`/`` ` ``/`[` in a task title or note. v0.3.1+ escapes these but anything user-supplied that bypasses our path (e.g. content posted manually via `post_note` to a stale older bot) can still hit it.
|
|
282
|
+
|
|
246
283
|
## License
|
|
247
284
|
|
|
248
285
|
MIT.
|
|
@@ -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
|
});
|
|
@@ -17,14 +17,21 @@ async function mkdtempReal(prefix) {
|
|
|
17
17
|
*/
|
|
18
18
|
const ORIGINAL_CWD = process.cwd();
|
|
19
19
|
const ORIGINAL_STATE_DIR_ENV = process.env.ORQLAUDE_STATE_DIR;
|
|
20
|
+
const ORIGINAL_PWD = process.env.PWD;
|
|
20
21
|
function clearEnv() {
|
|
21
22
|
delete process.env.ORQLAUDE_STATE_DIR;
|
|
23
|
+
// v0.3.3: resolver also consults PWD; clear it so tests are deterministic.
|
|
24
|
+
delete process.env.PWD;
|
|
22
25
|
}
|
|
23
26
|
function restoreEnv() {
|
|
24
27
|
if (ORIGINAL_STATE_DIR_ENV)
|
|
25
28
|
process.env.ORQLAUDE_STATE_DIR = ORIGINAL_STATE_DIR_ENV;
|
|
26
29
|
else
|
|
27
30
|
delete process.env.ORQLAUDE_STATE_DIR;
|
|
31
|
+
if (ORIGINAL_PWD)
|
|
32
|
+
process.env.PWD = ORIGINAL_PWD;
|
|
33
|
+
else
|
|
34
|
+
delete process.env.PWD;
|
|
28
35
|
}
|
|
29
36
|
test("ORQLAUDE_STATE_DIR env var wins over everything", () => {
|
|
30
37
|
process.env.ORQLAUDE_STATE_DIR = "/some/explicit/path";
|
|
@@ -44,6 +51,7 @@ test("cwd=/ → falls back to ~/.orqlaude/projects/<hash>", async () => {
|
|
|
44
51
|
}
|
|
45
52
|
finally {
|
|
46
53
|
process.chdir(ORIGINAL_CWD);
|
|
54
|
+
restoreEnv();
|
|
47
55
|
}
|
|
48
56
|
});
|
|
49
57
|
test("cwd in /tmp/some-empty-dir → home fallback", async () => {
|
|
@@ -56,6 +64,7 @@ test("cwd in /tmp/some-empty-dir → home fallback", async () => {
|
|
|
56
64
|
}
|
|
57
65
|
finally {
|
|
58
66
|
process.chdir(ORIGINAL_CWD);
|
|
67
|
+
restoreEnv();
|
|
59
68
|
}
|
|
60
69
|
});
|
|
61
70
|
test("cwd with package.json → uses <cwd>/.orqlaude", async () => {
|
|
@@ -70,6 +79,7 @@ test("cwd with package.json → uses <cwd>/.orqlaude", async () => {
|
|
|
70
79
|
}
|
|
71
80
|
finally {
|
|
72
81
|
process.chdir(ORIGINAL_CWD);
|
|
82
|
+
restoreEnv();
|
|
73
83
|
}
|
|
74
84
|
});
|
|
75
85
|
test("cwd with .git directory → uses <cwd>/.orqlaude (project-root, not worktree)", async () => {
|
|
@@ -84,6 +94,7 @@ test("cwd with .git directory → uses <cwd>/.orqlaude (project-root, not worktr
|
|
|
84
94
|
}
|
|
85
95
|
finally {
|
|
86
96
|
process.chdir(ORIGINAL_CWD);
|
|
97
|
+
restoreEnv();
|
|
87
98
|
}
|
|
88
99
|
});
|
|
89
100
|
test("cwd in a git worktree (.git is a file) → resolves to parent checkout's .orqlaude", async () => {
|
|
@@ -103,6 +114,7 @@ test("cwd in a git worktree (.git is a file) → resolves to parent checkout's .
|
|
|
103
114
|
}
|
|
104
115
|
finally {
|
|
105
116
|
process.chdir(ORIGINAL_CWD);
|
|
117
|
+
restoreEnv();
|
|
106
118
|
}
|
|
107
119
|
});
|
|
108
120
|
test("home-fallback path is deterministic across calls for the same cwd", async () => {
|
|
@@ -117,6 +129,7 @@ test("home-fallback path is deterministic across calls for the same cwd", async
|
|
|
117
129
|
}
|
|
118
130
|
finally {
|
|
119
131
|
process.chdir(ORIGINAL_CWD);
|
|
132
|
+
restoreEnv();
|
|
120
133
|
}
|
|
121
134
|
});
|
|
122
135
|
//# sourceMappingURL=state_dir.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state_dir.test.js","sourceRoot":"","sources":["../../src/__tests__/state_dir.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,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,2EAA2E;AAC3E,6EAA6E;AAC7E,gEAAgE;AAChE,KAAK,UAAU,WAAW,CAAC,MAAc;IACvC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AAEH,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AACnC,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"state_dir.test.js","sourceRoot":"","sources":["../../src/__tests__/state_dir.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
package/dist/lib/state.d.ts
CHANGED
|
@@ -27,6 +27,10 @@ export interface Task {
|
|
|
27
27
|
branchHint?: string;
|
|
28
28
|
status: TaskStatus;
|
|
29
29
|
spawnedSessionId?: string;
|
|
30
|
+
/** Optional per-task token budget hint. If set, status() surfaces a soft
|
|
31
|
+
* warning when usage exceeds 70% of this value, separate from the
|
|
32
|
+
* plan-wide hard cap. */
|
|
33
|
+
budgetHintTokens?: number;
|
|
30
34
|
costUsd?: number;
|
|
31
35
|
tokensUsed?: number;
|
|
32
36
|
startedAt?: number;
|
|
@@ -37,6 +41,7 @@ export interface Task {
|
|
|
37
41
|
stopRequested?: {
|
|
38
42
|
reason: string;
|
|
39
43
|
requestedAt: number;
|
|
44
|
+
kind: "hard" | "soft";
|
|
40
45
|
};
|
|
41
46
|
}
|
|
42
47
|
export interface Note {
|
|
@@ -57,7 +62,13 @@ export interface Message {
|
|
|
57
62
|
queuedAt: number;
|
|
58
63
|
delivered: boolean;
|
|
59
64
|
deliveredAt?: number;
|
|
60
|
-
|
|
65
|
+
/**
|
|
66
|
+
* - `directed`: informational message; agent reads and continues.
|
|
67
|
+
* - `stop`: hard stop; agent must commit what it has and exit immediately.
|
|
68
|
+
* - `soft_stop`: polite request to wind down; agent should finish the
|
|
69
|
+
* current operation, commit, push, then exit. Used by request_stop.
|
|
70
|
+
*/
|
|
71
|
+
kind?: "directed" | "stop" | "soft_stop";
|
|
61
72
|
}
|
|
62
73
|
export interface FileClaim {
|
|
63
74
|
path: string;
|
|
@@ -66,6 +77,43 @@ export interface FileClaim {
|
|
|
66
77
|
reason?: string;
|
|
67
78
|
claimedAt: number;
|
|
68
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
|
+
}
|
|
69
117
|
export interface Plan {
|
|
70
118
|
id: string;
|
|
71
119
|
createdAt: number;
|
|
@@ -86,10 +134,13 @@ export interface Plan {
|
|
|
86
134
|
notes: Note[];
|
|
87
135
|
messages: Message[];
|
|
88
136
|
claims: FileClaim[];
|
|
137
|
+
/** v0.4+: outbound notifications / questions from primary Claude to user. */
|
|
138
|
+
userNotifications: UserNotification[];
|
|
139
|
+
userResponseRequests: UserResponseRequest[];
|
|
89
140
|
reviewPlanId?: string;
|
|
90
141
|
}
|
|
91
142
|
export interface State {
|
|
92
|
-
schemaVersion:
|
|
143
|
+
schemaVersion: 3;
|
|
93
144
|
plans: Record<string, Plan>;
|
|
94
145
|
}
|
|
95
146
|
export declare class StateStore {
|
|
@@ -117,6 +168,10 @@ export declare class StateStore {
|
|
|
117
168
|
private persist;
|
|
118
169
|
}
|
|
119
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;
|
|
120
175
|
export declare function findPlan(state: State, planId: string): Plan;
|
|
121
176
|
export declare function findTask(plan: Plan, taskId: string): Task;
|
|
122
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":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkKzC,MAAM,WAAW,GAAU,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC3D,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,OAAO,UAAU;IACb,QAAQ,CAAS;IACjB,QAAQ,CAAS;IACjB,KAAK,GAAiB,IAAI,CAAC;IAC3B,SAAS,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAErD,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,SAAS;QACrB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;kEAC8D;IAC9D,KAAK,CAAC,IAAI,CAAI,MAA2B;QACvC,IAAI,OAAO,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC;QACX,IAAI,CAAC;YACH,kEAAkE;YAClE,8DAA8D;YAC9D,mBAAmB;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAI,OAAyC;QACvD,IAAI,gBAAgB,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC;QACX,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,oEAAoE;YACpE,gCAAgC;YAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,gEAAgE;gBAChE,4CAA4C;gBAC5C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,gBAAgB,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,eAAe,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACrD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAClD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,GAAG,CAAC;gBACrC,0DAA0D;gBAC1D,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;oBAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;oBACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;wBACzD,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;wBAC/C,SAAS;oBACX,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,qDAAqD;gBACvD,CAAC;gBACD,MAAM,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,kBAAkB,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,CAAC,QAAQ,YAAY,eAAe,IAAI,CAAC,CAAC;IAC3G,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACxC,6BAA6B;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,KAAY;QAChC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;QAChE,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,8EAA8E;AAC9E,SAAS,OAAO,CAAC,KAAkD;IACjE,MAAM,CAAC,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,KAAc,CAAC;IAClD,MAAM,GAAG,GAAU,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,IAAiE,CAAC;QAC5E,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG;YACd,GAAG,CAAC;YACJ,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YAChF,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YACtF,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;YACtB,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,EAAE;YAC5C,oBAAoB,EAAE,CAAC,CAAC,oBAAoB,IAAI,EAAE;SAC3C,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4DAA4D;AAE5D,MAAM,UAAU,OAAO,CACrB,QAAgB,EAChB,eAAuB,EACvB,UAA8C;IAE9C,MAAM,KAAK,GAAW,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,GAAG,CAAC;QACJ,EAAE,EAAE,UAAU,EAAE;QAChB,MAAM,EAAE,SAAkB;KAC3B,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,QAAQ;QACR,eAAe;QACf,iBAAiB,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe;QAClG,MAAM,EAAE,OAAO;QACf,KAAK;QACL,KAAK,EAAE,EAAE;QACT,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,iBAAiB,EAAE,EAAE;QACrB,oBAAoB,EAAE,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAY,EACZ,SAAiB;IAEjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;QACjG,IAAI,GAAG;YAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY,EAAE,MAAc;IACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAU,EAAE,MAAc;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAU,EAAE,SAAiB;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAY,EAAE,SAAiB;IAC5D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAY,EAAE,MAAc;IAC5D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC5E,IAAI,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,CAAS,EAAE,GAAW;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
|
package/dist/lib/state_dir.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export interface StateDirResolution {
|
|
2
2
|
path: string;
|
|
3
|
-
source: "env" | "worktree" | "project-root" | "home-fallback";
|
|
3
|
+
source: "env" | "worktree" | "project-root" | "pwd-env" | "home-fallback";
|
|
4
4
|
cwd: string;
|
|
5
|
+
cwdSource: "process.cwd" | "process.env.PWD";
|
|
6
|
+
warnings: string[];
|
|
5
7
|
}
|
|
6
8
|
export declare function resolveStateDir(): StateDirResolution;
|
|
7
9
|
/**
|
package/dist/lib/state_dir.js
CHANGED
|
@@ -39,18 +39,46 @@ const SYSTEM_DIRS = new Set([
|
|
|
39
39
|
"/sbin",
|
|
40
40
|
]);
|
|
41
41
|
const PROJECT_MARKERS = [".git", "package.json", "pyproject.toml", "Cargo.toml", "go.mod"];
|
|
42
|
+
/**
|
|
43
|
+
* Resolve "where the user actually meant for us to operate."
|
|
44
|
+
*
|
|
45
|
+
* `process.cwd()` is unreliable when the MCP host (Claude Desktop, etc.)
|
|
46
|
+
* launches us with cwd=/ for sandbox reasons. The shell var `PWD` is often
|
|
47
|
+
* still set by whatever spawned the host, pointing at the user's actual
|
|
48
|
+
* working directory — so we prefer it IF it points at a writable project
|
|
49
|
+
* root. Otherwise we fall back to `process.cwd()` and let downstream
|
|
50
|
+
* heuristics handle the rest.
|
|
51
|
+
*/
|
|
52
|
+
function resolveCwd() {
|
|
53
|
+
const realCwd = process.cwd();
|
|
54
|
+
const pwd = process.env.PWD;
|
|
55
|
+
if (pwd && pwd !== realCwd && looksLikeProjectRoot(pwd) && isWritable(pwd)) {
|
|
56
|
+
return { cwd: pwd, source: "process.env.PWD" };
|
|
57
|
+
}
|
|
58
|
+
return { cwd: realCwd, source: "process.cwd" };
|
|
59
|
+
}
|
|
42
60
|
export function resolveStateDir() {
|
|
43
|
-
const
|
|
61
|
+
const warnings = [];
|
|
62
|
+
const { cwd, source: cwdSource } = resolveCwd();
|
|
44
63
|
if (process.env.ORQLAUDE_STATE_DIR) {
|
|
45
|
-
return { path: process.env.ORQLAUDE_STATE_DIR, source: "env", cwd };
|
|
64
|
+
return { path: process.env.ORQLAUDE_STATE_DIR, source: "env", cwd, cwdSource, warnings };
|
|
46
65
|
}
|
|
47
66
|
const worktree = tryWorktreeResolve(cwd);
|
|
48
67
|
if (worktree)
|
|
49
|
-
return { path: worktree, source: "worktree", cwd };
|
|
68
|
+
return { path: worktree, source: "worktree", cwd, cwdSource, warnings };
|
|
50
69
|
if (looksLikeProjectRoot(cwd) && isWritable(cwd)) {
|
|
51
|
-
|
|
70
|
+
const src = cwdSource === "process.env.PWD" ? "pwd-env" : "project-root";
|
|
71
|
+
return { path: path.join(cwd, ".orqlaude"), source: src, cwd, cwdSource, warnings };
|
|
72
|
+
}
|
|
73
|
+
// Falling back means we couldn't find a useful project root. Note the
|
|
74
|
+
// probable cause so callers can surface it.
|
|
75
|
+
if (SYSTEM_DIRS.has(path.normalize(process.cwd()))) {
|
|
76
|
+
warnings.push(`MCP host launched orqlaude with cwd=${process.cwd()}. State writes will go to ~/.orqlaude/projects/. Set ORQLAUDE_STATE_DIR or run from a project root for per-project isolation.`);
|
|
77
|
+
}
|
|
78
|
+
else if (!isWritable(cwd)) {
|
|
79
|
+
warnings.push(`cwd=${cwd} is not writable; state writes will go to ~/.orqlaude/projects/.`);
|
|
52
80
|
}
|
|
53
|
-
return { path: homeFallback(cwd), source: "home-fallback", cwd };
|
|
81
|
+
return { path: homeFallback(cwd), source: "home-fallback", cwd, cwdSource, warnings };
|
|
54
82
|
}
|
|
55
83
|
function tryWorktreeResolve(cwd) {
|
|
56
84
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state_dir.js","sourceRoot":"","sources":["../../src/lib/state_dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,GAAG;IACH,UAAU;IACV,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,eAAe;IACf,UAAU;IACV,SAAS;IACT,UAAU;IACV,MAAM;IACN,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"state_dir.js","sourceRoot":"","sources":["../../src/lib/state_dir.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"}
|