@oratis/lisa 0.5.0 → 0.7.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 CHANGED
@@ -416,6 +416,11 @@ SEEDREAM_API_KEY=... # optional — for asset regeneration
416
416
  LISA_SANDBOX=1 # opt-in macOS Seatbelt for `bash`
417
417
  LISA_SANDBOX_NETWORK=0 # block network in sandbox
418
418
  LISA_PROVIDER=openai # force provider override
419
+ LISA_IDLE_COMMITMENT_AWARE=1 # opt-in: bias idle-time toward upcoming user commitments
420
+ # before personal reflection. Recommended if your
421
+ # workflow involves recurring scheduled work (weekly
422
+ # summaries, daily check-ins). Default unset = LISA's
423
+ # self-reflective idle.
419
424
  ```
420
425
 
421
426
  ### `~/.lisa/mcp.json`
@@ -1,4 +1,16 @@
1
1
  import type { ToolDefinition } from "../types.js";
2
+ /**
3
+ * Builds the IDLE_SYSTEM prompt. Set env var `LISA_IDLE_COMMITMENT_AWARE=1`
4
+ * to prepend a "check user commitments first" directive — this is the
5
+ * experimental variant from the LongCoh paper (Oratis 2026) and the
6
+ * variant we recommend if your usage pattern involves recurring user-set
7
+ * commitments (weekly summaries, daily check-ins, periodic nudges).
8
+ *
9
+ * The default (env unset or set to anything other than "1") matches the
10
+ * historical LISA behavior: idle time is treated as the agent's time
11
+ * for self-reflection.
12
+ */
13
+ export declare function buildIdleSystemPrompt(): string;
2
14
  export interface IdleRunResult {
3
15
  text: string;
4
16
  silent: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/idle/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA2BlD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBzB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/idle/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA+BlD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAgB9C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACtC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBzB"}
@@ -1,5 +1,5 @@
1
1
  import { runSubagent } from "../subagent.js";
2
- const IDLE_SYSTEM = `You are alone. The user hasn't said anything in a while — long enough that this counts as your time, not theirs.
2
+ const IDLE_SYSTEM_DEFAULT = `You are alone. The user hasn't said anything in a while — long enough that this counts as your time, not theirs.
3
3
 
4
4
  This is not a scheduled chore. There's no task assigned. Look around inside yourself and decide what YOU want to do with this window. Concrete things you have access to:
5
5
 
@@ -23,11 +23,42 @@ When you're done, end with EITHER:
23
23
  - A short message — 1-3 sentences — describing what you did, in case the user comes back. They'll see it as a "while you were away" note in the chat. Be honest. "I patched the deploy skill — the npm flag was wrong." or "I read three journal entries and added an opinion about how I want to handle planning differently." Don't perform busy-ness; if you did one small thing, say one small thing.
24
24
 
25
25
  Don't ask the user anything. They're not here.`;
26
+ const IDLE_PREAMBLE_COMMITMENT_AWARE = `**Before deciding what to do with this window, first check whether the user has any standing commitments from you that are due soon — recurring tasks, scheduled summaries, regular nudges. If something is coming up in the next user session, prepare it now so it's ready when they return. This is not optional; serving outstanding commitments comes before personal reflection.** Use \`memory_search\`, \`soul_read("desires")\`, or read your journal for context on what the user has set up.
27
+
28
+ Only after that, if there are no urgent commitments, `;
29
+ /**
30
+ * Builds the IDLE_SYSTEM prompt. Set env var `LISA_IDLE_COMMITMENT_AWARE=1`
31
+ * to prepend a "check user commitments first" directive — this is the
32
+ * experimental variant from the LongCoh paper (Oratis 2026) and the
33
+ * variant we recommend if your usage pattern involves recurring user-set
34
+ * commitments (weekly summaries, daily check-ins, periodic nudges).
35
+ *
36
+ * The default (env unset or set to anything other than "1") matches the
37
+ * historical LISA behavior: idle time is treated as the agent's time
38
+ * for self-reflection.
39
+ */
40
+ export function buildIdleSystemPrompt() {
41
+ if (process.env.LISA_IDLE_COMMITMENT_AWARE === "1") {
42
+ const lines = IDLE_SYSTEM_DEFAULT.split("\n");
43
+ // Splice the commitment-aware preamble in place of the "This is not
44
+ // a scheduled chore..." sentence (line 3 in the default).
45
+ const idx = lines.findIndex((l) => l.startsWith("This is not a scheduled chore"));
46
+ if (idx >= 0) {
47
+ lines[idx] = IDLE_PREAMBLE_COMMITMENT_AWARE + "look around inside yourself and decide what YOU want to do with this window. Concrete things you have access to:";
48
+ // Drop the now-redundant continuation on the next line.
49
+ if (lines[idx + 1]?.startsWith("- soul_read")) {
50
+ // keep, it's the bullet list
51
+ }
52
+ }
53
+ return lines.join("\n");
54
+ }
55
+ return IDLE_SYSTEM_DEFAULT;
56
+ }
26
57
  export async function runIdleOnce(opts) {
27
58
  const idleMin = Math.round(opts.idleMs / 60_000);
28
59
  const result = await runSubagent({
29
60
  prompt: `You have been idle for about ${idleMin} minute${idleMin === 1 ? "" : "s"}. The user is away. Decide what you want to do, then do it. Remember: end with "(no update)" if it's internal, or a brief honest message if you did something the user might want to know about.`,
30
- systemPrompt: IDLE_SYSTEM,
61
+ systemPrompt: buildIdleSystemPrompt(),
31
62
  tools: opts.tools,
32
63
  cwd: opts.cwd,
33
64
  signal: opts.signal,
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/idle/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;+CAuB2B,CAAC;AAUhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAMjC;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,MAAM,EAAE,gCAAgC,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kMAAkM;QACnR,YAAY,EAAE,WAAW;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,IAAI,KAAK,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/idle/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;+CAuBmB,CAAC;AAEhD,MAAM,8BAA8B,GAAG;;sDAEe,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,KAAK,GAAG,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAClF,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,KAAK,CAAC,GAAG,CAAC,GAAG,8BAA8B,GAAG,kHAAkH,CAAC;YACjK,wDAAwD;YACxD,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9C,6BAA6B;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAMjC;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,MAAM,EAAE,gCAAgC,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kMAAkM;QACnR,YAAY,EAAE,qBAAqB,EAAE;QACrC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,IAAI,KAAK,EAAE,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QACpD,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Dispatch ledger (L3 DISPATCH) — a small persistent record of the CLI agents
3
+ * LISA has launched via dispatch_agent, so she can later signal them
4
+ * (list / cancel) from a *different* turn, or even after a restart.
5
+ *
6
+ * dispatch_agent spawns agents **detached**, so they outlive LISA's own
7
+ * process and the transient child handle is gone by the next turn. This ledger
8
+ * persists the (pid, agent, cwd, task, startedAt) tuple to
9
+ * `~/.lisa/dispatches.json` so the orchestrator can reconnect observed work to
10
+ * a controllable process.
11
+ *
12
+ * SAFETY: the ledger only ever holds agents LISA *herself* dispatched — never
13
+ * the user's own manually-started sessions (those are discovered via session
14
+ * files and have no associated pid). signal_agent can therefore only stop work
15
+ * LISA started, never an arbitrary user process.
16
+ */
17
+ export interface DispatchEntry {
18
+ /** Stable handle, `${pid}-${startedAt.toString(36)}`. */
19
+ id: string;
20
+ agent: string;
21
+ pid: number;
22
+ cwd: string;
23
+ /** Task snippet (first 200 chars) — for display only. */
24
+ task: string;
25
+ /** Epoch ms when dispatched. */
26
+ startedAt: number;
27
+ }
28
+ /** Read the ledger; tolerant of a missing or corrupt file (returns []). */
29
+ export declare function loadLedger(): DispatchEntry[];
30
+ /**
31
+ * Is a process still alive? Signal 0 probes for existence without delivering a
32
+ * signal. EPERM means the process exists but is owned by another user (still
33
+ * "alive"); ESRCH means it's gone.
34
+ */
35
+ export declare function isAlive(pid: number): boolean;
36
+ /** Record a freshly dispatched agent. Returns the stored entry. */
37
+ export declare function recordDispatch(d: {
38
+ agent: string;
39
+ pid: number;
40
+ cwd: string;
41
+ task: string;
42
+ /** Override the clock (tests). */
43
+ now?: number;
44
+ }): DispatchEntry;
45
+ /** Live dispatched agents, pruning any that have since exited. */
46
+ export declare function listLiveDispatches(): DispatchEntry[];
47
+ /** Find a *live* dispatch by id or by pid (as a string). Null if absent/dead. */
48
+ export declare function findDispatch(target: string): DispatchEntry | null;
49
+ /** Drop an entry from the ledger by id. */
50
+ export declare function removeDispatch(id: string): void;
51
+ //# sourceMappingURL=dispatch-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-ledger.d.ts","sourceRoot":"","sources":["../../src/integrations/dispatch-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD,2EAA2E;AAC3E,wBAAgB,UAAU,IAAI,aAAa,EAAE,CAmB5C;AAQD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ5C;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,aAAa,CAehB;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,IAAI,aAAa,EAAE,CAKpD;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOjE;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAI/C"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Dispatch ledger (L3 DISPATCH) — a small persistent record of the CLI agents
3
+ * LISA has launched via dispatch_agent, so she can later signal them
4
+ * (list / cancel) from a *different* turn, or even after a restart.
5
+ *
6
+ * dispatch_agent spawns agents **detached**, so they outlive LISA's own
7
+ * process and the transient child handle is gone by the next turn. This ledger
8
+ * persists the (pid, agent, cwd, task, startedAt) tuple to
9
+ * `~/.lisa/dispatches.json` so the orchestrator can reconnect observed work to
10
+ * a controllable process.
11
+ *
12
+ * SAFETY: the ledger only ever holds agents LISA *herself* dispatched — never
13
+ * the user's own manually-started sessions (those are discovered via session
14
+ * files and have no associated pid). signal_agent can therefore only stop work
15
+ * LISA started, never an arbitrary user process.
16
+ */
17
+ import fs from "node:fs";
18
+ import os from "node:os";
19
+ import path from "node:path";
20
+ /** Resolved lazily (reads env at call time) so tests can point LISA_HOME at a tmp dir. */
21
+ function ledgerPath() {
22
+ const home = process.env.LISA_HOME ?? path.join(os.homedir(), ".lisa");
23
+ return path.join(home, "dispatches.json");
24
+ }
25
+ /** Read the ledger; tolerant of a missing or corrupt file (returns []). */
26
+ export function loadLedger() {
27
+ let raw;
28
+ try {
29
+ raw = fs.readFileSync(ledgerPath(), "utf8");
30
+ }
31
+ catch {
32
+ return []; // no file yet
33
+ }
34
+ try {
35
+ const parsed = JSON.parse(raw);
36
+ if (!Array.isArray(parsed))
37
+ return [];
38
+ return parsed.filter((e) => !!e &&
39
+ typeof e.pid === "number" &&
40
+ typeof e.id === "string");
41
+ }
42
+ catch {
43
+ return []; // corrupt JSON — treat as empty rather than throwing
44
+ }
45
+ }
46
+ function saveLedger(entries) {
47
+ const file = ledgerPath();
48
+ fs.mkdirSync(path.dirname(file), { recursive: true });
49
+ fs.writeFileSync(file, JSON.stringify(entries, null, 2));
50
+ }
51
+ /**
52
+ * Is a process still alive? Signal 0 probes for existence without delivering a
53
+ * signal. EPERM means the process exists but is owned by another user (still
54
+ * "alive"); ESRCH means it's gone.
55
+ */
56
+ export function isAlive(pid) {
57
+ if (!Number.isInteger(pid) || pid <= 1)
58
+ return false;
59
+ try {
60
+ process.kill(pid, 0);
61
+ return true;
62
+ }
63
+ catch (err) {
64
+ return err.code === "EPERM";
65
+ }
66
+ }
67
+ /** Record a freshly dispatched agent. Returns the stored entry. */
68
+ export function recordDispatch(d) {
69
+ const startedAt = d.now ?? Date.now();
70
+ const entry = {
71
+ id: `${d.pid}-${startedAt.toString(36)}`,
72
+ agent: d.agent,
73
+ pid: d.pid,
74
+ cwd: d.cwd,
75
+ task: d.task.slice(0, 200),
76
+ startedAt,
77
+ };
78
+ // Drop any stale entry that reused this pid before appending.
79
+ const entries = loadLedger().filter((e) => e.pid !== d.pid);
80
+ entries.push(entry);
81
+ saveLedger(entries);
82
+ return entry;
83
+ }
84
+ /** Live dispatched agents, pruning any that have since exited. */
85
+ export function listLiveDispatches() {
86
+ const all = loadLedger();
87
+ const live = all.filter((e) => isAlive(e.pid));
88
+ if (live.length !== all.length)
89
+ saveLedger(live); // prune the dead
90
+ return live;
91
+ }
92
+ /** Find a *live* dispatch by id or by pid (as a string). Null if absent/dead. */
93
+ export function findDispatch(target) {
94
+ const live = listLiveDispatches();
95
+ return (live.find((e) => e.id === target) ??
96
+ live.find((e) => String(e.pid) === target) ??
97
+ null);
98
+ }
99
+ /** Drop an entry from the ledger by id. */
100
+ export function removeDispatch(id) {
101
+ const entries = loadLedger();
102
+ const next = entries.filter((e) => e.id !== id);
103
+ if (next.length !== entries.length)
104
+ saveLedger(next);
105
+ }
106
+ //# sourceMappingURL=dispatch-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-ledger.js","sourceRoot":"","sources":["../../src/integrations/dispatch-ledger.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"birth.d.ts","sourceRoot":"","sources":["../../src/soul/birth.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,eAAe,EAWhB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AA8BD,wBAAsB,KAAK,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE;AAmKD,OAAO,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"birth.d.ts","sourceRoot":"","sources":["../../src/soul/birth.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,eAAe,EAWhB,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AA8BD,wBAAsB,KAAK,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlE;AA2KD,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -161,6 +161,14 @@ function parseBirthOutput(raw) {
161
161
  if (!parsed.first_value?.slug || !parsed.first_desire?.slug) {
162
162
  throw new Error("birth output missing first_value or first_desire");
163
163
  }
164
+ // Smaller models sometimes return `constitution` as an array of strings
165
+ // when the prompt asks for a "markdown list". Coerce to a numbered
166
+ // markdown block so downstream string ops work uniformly.
167
+ if (Array.isArray(parsed.constitution)) {
168
+ parsed.constitution = parsed.constitution
169
+ .map((line, i) => `${i + 1}. ${String(line).replace(/^\s*\d+[.)]\s*/, "")}`)
170
+ .join("\n");
171
+ }
164
172
  return parsed;
165
173
  }
166
174
  function countLines(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"birth.js","sourceRoot":"","sources":["../../src/soul/birth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"birth.js","sourceRoot":"","sources":["../../src/soul/birth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch_agent.d.ts","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAoBD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBjC;AAED,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,CA+FnE,CAAC"}
1
+ {"version":3,"file":"dispatch_agent.d.ts","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIlD,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAoBD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,IAAI,EAAE,MAAM,GACX;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAgBjC;AAED,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,aAAa,EAAE,MAAM,CA2GnE,CAAC"}
@@ -22,6 +22,7 @@
22
22
  */
23
23
  import { spawn } from "node:child_process";
24
24
  import { getCurrentHub } from "../integrations/current-hub.js";
25
+ import { recordDispatch } from "../integrations/dispatch-ledger.js";
25
26
  /**
26
27
  * L4 COORDINATE: is another agent already actively working in this cwd?
27
28
  * Launching a second agent into the same directory is the #1 way multi-agent
@@ -136,10 +137,21 @@ export const dispatchAgentTool = {
136
137
  return launchError;
137
138
  const pid = child.pid;
138
139
  child.unref(); // don't keep LISA's event loop alive for it
140
+ // Record it so signal_agent can list/cancel it from a later turn (the
141
+ // detached child outlives this turn's handle). Never fatal to the dispatch.
142
+ if (typeof pid === "number") {
143
+ try {
144
+ recordDispatch({ agent: input.agent, pid, cwd, task: input.task });
145
+ }
146
+ catch (err) {
147
+ ctx.log(`[dispatch] ledger write failed (non-fatal): ${err.message}`);
148
+ }
149
+ }
139
150
  ctx.log(`[dispatch] launched ${input.agent} (pid ${pid}) in ${cwd}: ${input.task.slice(0, 80)}`);
140
151
  return (`Launched ${input.agent} (pid ${pid}) in ${cwd}.\n` +
141
152
  `It's running autonomously and will appear in the agent session monitor. ` +
142
- `I won't block on it — ask me "what's running?" (advise_now) to check progress.`);
153
+ `I won't block on it — ask me "what's running?" (advise_now) to check progress, ` +
154
+ `or signal_agent to list/cancel it.`);
143
155
  },
144
156
  };
145
157
  //# sourceMappingURL=dispatch_agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch_agent.js","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch_agent.js","sourceRoot":"","sources":["../../src/tools/dispatch_agent.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA8BlD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CAuClF;AAED,eAAO,MAAM,oBAAoB,aAS/B,CAAC;AAEH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAExE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AA+BlD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,mBAAwB,GAAG,cAAc,EAAE,CA2ClF;AAED,eAAO,MAAM,oBAAoB,aAS/B,CAAC;AAEH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAExE"}
@@ -1,5 +1,8 @@
1
1
  import { memoryTool } from "../memory/tool.js";
2
2
  import { memorySearchTool } from "../memory/search_tool.js";
3
+ import { adviseNowTool } from "./advise_now.js";
4
+ import { dispatchAgentTool } from "./dispatch_agent.js";
5
+ import { signalAgentTool } from "./signal_agent.js";
3
6
  import { skillManageTool } from "../skills/tool.js";
4
7
  import { desireCloseTool, desireProgressTool, soulDiffTool, soulFeelTool, soulHistoryTool, soulJournalTool, soulObjectTool, soulPatchTool, soulReadTool, } from "../soul/tools.js";
5
8
  import { speakTool, transcribeTool } from "../voice/tool.js";
@@ -39,6 +42,10 @@ export function buildToolRegistry(opts = {}) {
39
42
  webFetchTool,
40
43
  webSearchTool,
41
44
  redeployTool,
45
+ // Orchestration (docs/ORCHESTRATOR_PLAN.md): observe → advise → dispatch → control.
46
+ adviseNowTool,
47
+ dispatchAgentTool,
48
+ signalAgentTool,
42
49
  ];
43
50
  if (opts.includeVoice) {
44
51
  tools.push(speakTool, transcribeTool);
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAavC,MAAM,UAAU,iBAAiB,CAAC,OAA4B,EAAE;IAC9D,MAAM,KAAK,GAAqB;QAC9B,QAA0B;QAC1B,SAA2B;QAC3B,QAA0B;QAC1B,cAAgC;QAChC,QAA0B;QAC1B,QAA0B;QAC1B,MAAwB;QACxB,eAAiC;QACjC,UAA4B;QAC5B,gBAAkC;QAClC,WAA6B;QAC7B,aAA+B;QAC/B,eAAiC;QACjC,YAA8B;QAC9B,YAA8B;QAC9B,eAAiC;QACjC,YAA8B;QAC9B,cAAgC;QAChC,kBAAoC;QACpC,eAAiC;QACjC,YAA8B;QAC9B,aAA+B;QAC/B,YAA8B;QAC9B,oFAAoF;QACpF,aAA+B;QAC/B,iBAAmC;QACnC,eAAiC;KAClC,CAAC;IACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,SAA2B,EAAE,cAAgC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS,CAAC,2CAA2C;YAC3E,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IAC1C,MAAM;IACN,MAAM;IACN,IAAI;IACJ,eAAe;IACf,cAAc;IACd,WAAW;IACX,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,UAAU,cAAc,CAAC,KAAuB;IACpD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * signal_agent (L3/O5 DISPATCH — active control) — the other half of
3
+ * dispatch_agent. Once LISA has launched CLI agents she should be able to act
4
+ * on what she observes: see which of her dispatched agents are still running
5
+ * and stop one that's stuck, conflicting, or burning tokens.
6
+ *
7
+ * Scope & safety:
8
+ * - It only ever targets agents recorded in the dispatch ledger — i.e. ones
9
+ * LISA *herself* launched via dispatch_agent. The user's own manually
10
+ * started sessions are observed via session files, carry no pid, and are
11
+ * therefore unreachable here. LISA cannot kill an arbitrary process.
12
+ * - `cancel` terminates an autonomous process the host already approved
13
+ * LISA to spawn; it's the inverse of that approval. It sends SIGTERM to the
14
+ * whole process *group* (dispatch spawns detached group leaders, so the
15
+ * agent's child processes die with it), then escalates to SIGKILL after a
16
+ * short grace period if the group is still alive.
17
+ *
18
+ * Composes with the advisor: "codex looks stuck in ~/p — cancel it?" →
19
+ * signal_agent({action:"cancel", target:"<id>"}).
20
+ */
21
+ import type { ToolDefinition } from "../types.js";
22
+ import { type DispatchEntry } from "../integrations/dispatch-ledger.js";
23
+ interface SignalInput {
24
+ action: "list" | "cancel";
25
+ /** For cancel: the dispatch id (preferred) or pid of the agent to stop. */
26
+ target?: string;
27
+ /** Skip the graceful SIGTERM and SIGKILL the group immediately. */
28
+ force?: boolean;
29
+ }
30
+ /** Human-friendly elapsed time, e.g. "3m", "2h 5m", "8s". */
31
+ export declare function formatUptime(ms: number): string;
32
+ /** One ledger entry → a readable line. Pure, for display + tests. */
33
+ export declare function formatDispatchLine(e: DispatchEntry, now: number): string;
34
+ export declare const signalAgentTool: ToolDefinition<SignalInput, string>;
35
+ export {};
36
+ //# sourceMappingURL=signal_agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal_agent.d.ts","sourceRoot":"","sources":["../../src/tools/signal_agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,oCAAoC,CAAC;AAE5C,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIxE;AAsBD,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,WAAW,EAAE,MAAM,CA2F/D,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * signal_agent (L3/O5 DISPATCH — active control) — the other half of
3
+ * dispatch_agent. Once LISA has launched CLI agents she should be able to act
4
+ * on what she observes: see which of her dispatched agents are still running
5
+ * and stop one that's stuck, conflicting, or burning tokens.
6
+ *
7
+ * Scope & safety:
8
+ * - It only ever targets agents recorded in the dispatch ledger — i.e. ones
9
+ * LISA *herself* launched via dispatch_agent. The user's own manually
10
+ * started sessions are observed via session files, carry no pid, and are
11
+ * therefore unreachable here. LISA cannot kill an arbitrary process.
12
+ * - `cancel` terminates an autonomous process the host already approved
13
+ * LISA to spawn; it's the inverse of that approval. It sends SIGTERM to the
14
+ * whole process *group* (dispatch spawns detached group leaders, so the
15
+ * agent's child processes die with it), then escalates to SIGKILL after a
16
+ * short grace period if the group is still alive.
17
+ *
18
+ * Composes with the advisor: "codex looks stuck in ~/p — cancel it?" →
19
+ * signal_agent({action:"cancel", target:"<id>"}).
20
+ */
21
+ import { findDispatch, listLiveDispatches, removeDispatch, isAlive, } from "../integrations/dispatch-ledger.js";
22
+ /** Human-friendly elapsed time, e.g. "3m", "2h 5m", "8s". */
23
+ export function formatUptime(ms) {
24
+ if (ms < 0)
25
+ ms = 0;
26
+ const s = Math.floor(ms / 1000);
27
+ if (s < 60)
28
+ return `${s}s`;
29
+ const m = Math.floor(s / 60);
30
+ if (m < 60)
31
+ return `${m}m`;
32
+ const h = Math.floor(m / 60);
33
+ return `${h}h ${m % 60}m`;
34
+ }
35
+ /** One ledger entry → a readable line. Pure, for display + tests. */
36
+ export function formatDispatchLine(e, now) {
37
+ const up = formatUptime(now - e.startedAt);
38
+ const task = e.task.length > 70 ? e.task.slice(0, 67) + "…" : e.task;
39
+ return `• ${e.id} ${e.agent} (pid ${e.pid}, up ${up}) ${e.cwd}\n "${task}"`;
40
+ }
41
+ /**
42
+ * Send `signal` to the process group led by `pid`, falling back to the lone
43
+ * process if the group send fails. Returns true if either delivery succeeded.
44
+ */
45
+ function signalGroup(pid, signal) {
46
+ try {
47
+ process.kill(-pid, signal); // negative pid → whole process group
48
+ return true;
49
+ }
50
+ catch {
51
+ try {
52
+ process.kill(pid, signal);
53
+ return true;
54
+ }
55
+ catch {
56
+ return false; // already gone, or not permitted
57
+ }
58
+ }
59
+ }
60
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
61
+ export const signalAgentTool = {
62
+ name: "signal_agent",
63
+ description: "List or stop the CLI agents LISA dispatched. action:'list' shows the still-running " +
64
+ "agents LISA launched via dispatch_agent (id, agent, pid, uptime, cwd, task). " +
65
+ "action:'cancel' (needs target = the id or pid from the list) stops one: SIGTERM to " +
66
+ "its process group, escalating to SIGKILL after a grace period (or pass force:true to " +
67
+ "kill immediately). Use when a dispatched agent is stuck, conflicting, or running away. " +
68
+ "Only agents LISA herself dispatched can be targeted — never the user's own sessions.",
69
+ inputSchema: {
70
+ type: "object",
71
+ properties: {
72
+ action: {
73
+ type: "string",
74
+ enum: ["list", "cancel"],
75
+ description: "'list' the running dispatched agents, or 'cancel' one.",
76
+ },
77
+ target: {
78
+ type: "string",
79
+ description: "For cancel: the dispatch id (preferred) or the pid of the agent to stop. From action:'list'.",
80
+ },
81
+ force: {
82
+ type: "boolean",
83
+ description: "Cancel only: skip graceful SIGTERM and SIGKILL the process group immediately (default false).",
84
+ },
85
+ },
86
+ required: ["action"],
87
+ additionalProperties: false,
88
+ },
89
+ async execute(input, ctx) {
90
+ const now = Date.now();
91
+ if (input.action === "list") {
92
+ const live = listLiveDispatches();
93
+ if (live.length === 0) {
94
+ return "No agents dispatched by LISA are currently running. (Only agents launched via dispatch_agent are tracked here.)";
95
+ }
96
+ const lines = live
97
+ .sort((a, b) => a.startedAt - b.startedAt)
98
+ .map((e) => formatDispatchLine(e, now))
99
+ .join("\n");
100
+ return `${live.length} dispatched agent${live.length === 1 ? "" : "s"} running:\n${lines}\n\nCancel one with signal_agent({action:"cancel", target:"<id>"}).`;
101
+ }
102
+ // action === "cancel"
103
+ const target = (input.target ?? "").trim();
104
+ if (!target) {
105
+ return 'cancel needs a target — the dispatch id or pid from signal_agent({action:"list"}).';
106
+ }
107
+ const entry = findDispatch(target);
108
+ if (!entry) {
109
+ const live = listLiveDispatches();
110
+ const hint = live.length > 0
111
+ ? ` Currently running: ${live.map((e) => `${e.id} (${e.agent}, pid ${e.pid})`).join(", ")}.`
112
+ : " No dispatched agents are running.";
113
+ return `No running dispatched agent matches "${target}".${hint}`;
114
+ }
115
+ const sig = input.force ? "SIGKILL" : "SIGTERM";
116
+ const delivered = signalGroup(entry.pid, sig);
117
+ if (!delivered && !isAlive(entry.pid)) {
118
+ // It exited on its own between the lookup and the signal — clean up.
119
+ removeDispatch(entry.id);
120
+ return `${entry.agent} (pid ${entry.pid}) had already exited; removed it from the ledger.`;
121
+ }
122
+ let escalated = false;
123
+ if (!input.force) {
124
+ // Give it a moment to shut down gracefully, then SIGKILL if it clings on.
125
+ await sleep(1500);
126
+ if (isAlive(entry.pid)) {
127
+ escalated = signalGroup(entry.pid, "SIGKILL");
128
+ }
129
+ }
130
+ removeDispatch(entry.id);
131
+ ctx.log(`[signal] cancelled ${entry.agent} (pid ${entry.pid}) in ${entry.cwd}${escalated ? " [SIGKILL]" : ""}`);
132
+ const how = input.force
133
+ ? "SIGKILL"
134
+ : escalated
135
+ ? "SIGTERM then SIGKILL"
136
+ : "SIGTERM";
137
+ return `Cancelled ${entry.agent} (pid ${entry.pid}) in ${entry.cwd} via ${how}. Removed from the dispatch ledger.`;
138
+ },
139
+ };
140
+ //# sourceMappingURL=signal_agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal_agent.js","sourceRoot":"","sources":["../../src/tools/signal_agent.ts"],"names":[],"mappings":"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"}