@rubytech/create-realagent-code 0.1.30 → 0.1.31
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/package.json +1 -1
- package/payload/platform/lib/persistent-components/dist/index.d.ts +11 -12
- package/payload/platform/lib/persistent-components/dist/index.d.ts.map +1 -1
- package/payload/platform/lib/persistent-components/dist/index.js +11 -12
- package/payload/platform/lib/persistent-components/dist/index.js.map +1 -1
- package/payload/platform/lib/persistent-components/src/index.ts +11 -12
- package/payload/platform/neo4j/schema.cypher +6 -3
- package/payload/platform/plugins/admin/.claude-plugin/plugin.json +1 -1
- package/payload/platform/plugins/admin/PLUGIN.md +1 -3
- package/payload/platform/plugins/admin/hooks/onboarding-skill-drift.sh +5 -4
- package/payload/platform/plugins/admin/mcp/dist/index.js +15 -50
- package/payload/platform/plugins/admin/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/admin/skills/access-manager/references/operations.md +7 -7
- package/payload/platform/plugins/admin/skills/public-agent-manager/SKILL.md +1 -1
- package/payload/platform/plugins/admin/skills/stream-log-review/references/analysis-patterns.md +2 -2
- package/payload/platform/plugins/anthropic/skills/get-api-key/SKILL.md +2 -4
- package/payload/platform/plugins/email/references/email-reference.md +3 -7
- package/payload/platform/plugins/teaching/PLUGIN.md +2 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js +1 -1
- package/payload/platform/plugins/whatsapp/mcp/dist/index.js.map +1 -1
- package/payload/platform/plugins/whatsapp/skills/connect-whatsapp/SKILL.md +1 -1
- package/payload/platform/plugins/whatsapp/skills/manage-whatsapp-config/SKILL.md +2 -8
- package/payload/platform/plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/platform/scripts/component-knowledgedoc-backfill.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +45 -31
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +11 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts +30 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js +175 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-observer.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts +4 -2
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js +15 -22
- package/payload/platform/services/claude-session-manager/dist/jsonl-path.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +13 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +26 -4
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/session-store.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/session-store.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts +10 -7
- package/payload/platform/services/claude-session-manager/dist/system-prompt.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js +51 -28
- package/payload/platform/services/claude-session-manager/dist/system-prompt.js.map +1 -1
- package/payload/platform/services/claude-session-manager/scripts/onboarding-advance.sh +61 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-0.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-1.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-2.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-3.md +8 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-4.md +9 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-5.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-6.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-7.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-8.md +5 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-9.md +8 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-complete.md +3 -0
- package/payload/platform/services/claude-session-manager/scripts/onboarding-prompts/step-unreachable.md +3 -0
- package/payload/platform/templates/agents/public/IDENTITY.md +1 -1
- package/payload/platform/templates/specialists/agents/content-producer.md +3 -3
- package/payload/platform/templates/specialists/agents/personal-assistant.md +2 -2
- package/payload/premium-plugins/teaching/PLUGIN.md +2 -1
- package/payload/premium-plugins/writer-craft/PLUGIN.md +2 -1
- package/payload/server/public/assets/{admin-CDvF5de6.js → admin-Bk2eXMFD.js} +24 -24
- package/payload/server/public/assets/{data-K_kS__sL.js → data-ll_OwVNL.js} +1 -1
- package/payload/server/public/assets/{graph-DeEigyO_.js → graph-DJ2VWioQ.js} +1 -1
- package/payload/server/public/assets/graph-labels-qhU8xZDH.js +1 -0
- package/payload/server/public/assets/{page-qSH972X0.js → page-Dk73ZO1F.js} +1 -1
- package/payload/server/public/assets/{page-B_rpjIRr.js → page-DsYsdBUK.js} +1 -1
- package/payload/server/public/data.html +3 -3
- package/payload/server/public/graph.html +3 -3
- package/payload/server/public/index.html +4 -4
- package/payload/server/server.js +121 -46
- package/payload/platform/plugins/admin/references/contextual-ui.md +0 -109
- package/payload/platform/scripts/__tests__/admin-persist-audit.test.ts +0 -182
- package/payload/server/public/assets/graph-labels-C7I5QvNv.js +0 -1
|
@@ -7,6 +7,8 @@ import { SessionStore } from './session-store.js';
|
|
|
7
7
|
import { loadToolSurface, ToolSurfaceError } from './tool-surface.js';
|
|
8
8
|
import { createSpawnRateLimiter } from './spawn-rate-limiter.js';
|
|
9
9
|
import { createAuditRegistry } from './public-tool-audit.js';
|
|
10
|
+
import { createJsonlObserver } from './jsonl-observer.js';
|
|
11
|
+
import { claudeStateRoot, projectSlugForCwd } from './jsonl-path.js';
|
|
10
12
|
const TAG = '[claude-session-manager]';
|
|
11
13
|
const log = (line) => console.log(`${TAG} ${line}`);
|
|
12
14
|
function spawnPtyAdapter(cmd, args, env, cwd) {
|
|
@@ -62,6 +64,13 @@ async function main() {
|
|
|
62
64
|
` perChannelWindowMs=${config.publicSpawnLimits.perChannel.whatsapp.windowMs}` +
|
|
63
65
|
` globalCap=${config.publicSpawnLimits.global.cap}` +
|
|
64
66
|
` globalWindowMs=${config.publicSpawnLimits.global.windowMs}`);
|
|
67
|
+
// Task 065 — observe (do not predict) Claude Code's per-session JSONL.
|
|
68
|
+
// The observer watches the project dir for `<intrinsic-id>.jsonl` files;
|
|
69
|
+
// pty-spawner registers a pending observation per spawn keyed on the
|
|
70
|
+
// URL's bridge suffix, and the observer binds the file when its head
|
|
71
|
+
// bytes contain that suffix.
|
|
72
|
+
const projectsDir = join(claudeStateRoot(), 'projects', projectSlugForCwd(config.spawnCwd));
|
|
73
|
+
const observer = createJsonlObserver({ projectsDir, logger: log });
|
|
65
74
|
const app = buildHttpApp({
|
|
66
75
|
store,
|
|
67
76
|
spawnCwd: config.spawnCwd,
|
|
@@ -75,6 +84,7 @@ async function main() {
|
|
|
75
84
|
toolSurface,
|
|
76
85
|
publicSpawnLimiter,
|
|
77
86
|
publicToolAudit,
|
|
87
|
+
observer,
|
|
78
88
|
});
|
|
79
89
|
serve({ fetch: app.fetch, port: config.port, hostname: '127.0.0.1' }, (info) => {
|
|
80
90
|
log(`listening address=127.0.0.1:${info.port}`);
|
|
@@ -82,6 +92,7 @@ async function main() {
|
|
|
82
92
|
const shutdown = (signal) => {
|
|
83
93
|
log(`shutdown signal=${signal} sessions=${store.size()}`);
|
|
84
94
|
publicToolAudit.drain();
|
|
95
|
+
observer.close();
|
|
85
96
|
for (const s of store.all()) {
|
|
86
97
|
s.pty.kill('SIGTERM');
|
|
87
98
|
log(`kill pid=${s.pid} reason=manager-shutdown exit-code=0`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Logger } from './types.js';
|
|
2
|
+
export interface ObservedJsonl {
|
|
3
|
+
/** Absolute path of the JSONL file Claude Code wrote. */
|
|
4
|
+
jsonlPath: string;
|
|
5
|
+
/** Intrinsic session id (the JSONL basename, no `.jsonl` extension). */
|
|
6
|
+
claudeSessionId: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ObservationHandle {
|
|
9
|
+
/** Resolves with the observed file once the head bytes match the bridge
|
|
10
|
+
* suffix. Resolves with `null` after `cancel()` is called and no match
|
|
11
|
+
* ever fired. Never rejects — observation failures are logged and the
|
|
12
|
+
* pending registration is left in place until cancel. */
|
|
13
|
+
promise: Promise<ObservedJsonl | null>;
|
|
14
|
+
/** Removes the pending observation. If a match fires after cancel, the
|
|
15
|
+
* resolve is a no-op. Safe to call multiple times. */
|
|
16
|
+
cancel: () => void;
|
|
17
|
+
}
|
|
18
|
+
export interface JsonlObserver {
|
|
19
|
+
/** Register a pending observation. Returns immediately. */
|
|
20
|
+
observe(opts: {
|
|
21
|
+
bridgeSuffix: string;
|
|
22
|
+
}): ObservationHandle;
|
|
23
|
+
/** Stop the underlying fs.watch. Tests use this for cleanup. */
|
|
24
|
+
close(): void;
|
|
25
|
+
}
|
|
26
|
+
export declare function createJsonlObserver(opts: {
|
|
27
|
+
projectsDir: string;
|
|
28
|
+
logger: Logger;
|
|
29
|
+
}): JsonlObserver;
|
|
30
|
+
//# sourceMappingURL=jsonl-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-observer.d.ts","sourceRoot":"","sources":["../src/jsonl-observer.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,aAAa;IAC5B,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;8DAG0D;IAC1D,OAAO,EAAE,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IACtC;2DACuD;IACvD,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,OAAO,CAAC,IAAI,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB,CAAA;IAC1D,gEAAgE;IAChE,KAAK,IAAI,IAAI,CAAA;CACd;AA4DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,aAAa,CA+FhB"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// Observe (do not predict) the JSONL file Claude Code writes for a session.
|
|
2
|
+
//
|
|
3
|
+
// Task 065 — the manager used to derive `jsonlPath` from the captured
|
|
4
|
+
// `/remote-control` URL at spawn time. That id is the *bridge* sessionId
|
|
5
|
+
// (the suffix after `session_` in the URL), which is NOT the same as the
|
|
6
|
+
// *intrinsic* sessionId that Claude Code uses for the JSONL filename.
|
|
7
|
+
// `GET /list` then merged the live store (keyed by bridge id) with the
|
|
8
|
+
// on-disk enumerator (keyed by intrinsic id) and the dedup never matched,
|
|
9
|
+
// producing one phantom row per spawn.
|
|
10
|
+
//
|
|
11
|
+
// The fix: never predict. Watch the project dir; when a new JSONL appears,
|
|
12
|
+
// read its head bytes and bind it to the spawn whose URL bridge-suffix
|
|
13
|
+
// appears verbatim somewhere in those bytes. Claude Code writes a
|
|
14
|
+
// `bridgeSessionId=cse_<suffix>` record in the JSONL head; the suffix is
|
|
15
|
+
// also the part after `session_` in the URL we captured. Substring match
|
|
16
|
+
// over the head bytes is the deterministic link, schema-agnostic and
|
|
17
|
+
// concurrency-safe — two spawns never share a random URL suffix.
|
|
18
|
+
//
|
|
19
|
+
// One shared `fs.watch` on the project dir. Each spawn calls `observe()`
|
|
20
|
+
// to register a pending observation; the call does a one-shot scan first
|
|
21
|
+
// (closes the snapshot-vs-watch race) and otherwise resolves on the next
|
|
22
|
+
// `rename`/`change` event whose head bytes match. PTY exit before the
|
|
23
|
+
// JSONL appears calls `cancel()` to drop the pending registration.
|
|
24
|
+
import { existsSync, mkdirSync, openSync, closeSync, readSync, readdirSync, statSync, watch } from 'node:fs';
|
|
25
|
+
import { join } from 'node:path';
|
|
26
|
+
const HEAD_READ_BYTES = 4 * 1024;
|
|
27
|
+
/** Read the first HEAD_READ_BYTES of a file. Returns empty string on any
|
|
28
|
+
* IO error (ENOENT, EACCES, file truncated mid-read). The caller treats
|
|
29
|
+
* empty as "no match yet" and keeps the pending observation registered
|
|
30
|
+
* so a subsequent `change` event re-reads after Claude finishes writing. */
|
|
31
|
+
function readHead(path, logger) {
|
|
32
|
+
let fd = null;
|
|
33
|
+
try {
|
|
34
|
+
fd = openSync(path, 'r');
|
|
35
|
+
const stat = statSync(path);
|
|
36
|
+
const want = Math.min(stat.size, HEAD_READ_BYTES);
|
|
37
|
+
if (want === 0)
|
|
38
|
+
return '';
|
|
39
|
+
const buf = Buffer.alloc(want);
|
|
40
|
+
const got = readSync(fd, buf, 0, want, 0);
|
|
41
|
+
return buf.toString('utf8', 0, got);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
45
|
+
logger(`jsonl-observer head-read-failed path=${path} message=${msg}`);
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
if (fd !== null) {
|
|
50
|
+
try {
|
|
51
|
+
closeSync(fd);
|
|
52
|
+
}
|
|
53
|
+
catch { /* ignore */ }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Try to bind the given JSONL to any pending observation. Returns the
|
|
58
|
+
* observation that matched (already resolved) or null if no match. */
|
|
59
|
+
function tryBindFile(jsonlPath, pendings, logger) {
|
|
60
|
+
if (pendings.size === 0)
|
|
61
|
+
return null;
|
|
62
|
+
const head = readHead(jsonlPath, logger);
|
|
63
|
+
if (!head)
|
|
64
|
+
return null;
|
|
65
|
+
for (const p of pendings) {
|
|
66
|
+
if (p.settled)
|
|
67
|
+
continue;
|
|
68
|
+
if (head.includes(p.bridgeSuffix)) {
|
|
69
|
+
const claudeSessionId = jsonlPath.endsWith('.jsonl')
|
|
70
|
+
? jsonlPath.slice(jsonlPath.lastIndexOf('/') + 1, -'.jsonl'.length)
|
|
71
|
+
: jsonlPath.slice(jsonlPath.lastIndexOf('/') + 1);
|
|
72
|
+
p.settled = true;
|
|
73
|
+
p.resolve({ jsonlPath, claudeSessionId });
|
|
74
|
+
pendings.delete(p);
|
|
75
|
+
return p;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
export function createJsonlObserver(opts) {
|
|
81
|
+
const { projectsDir, logger } = opts;
|
|
82
|
+
// Claude Code only creates this dir on its first spawn; the manager may
|
|
83
|
+
// start before then. mkdir -p so fs.watch has something to bind to.
|
|
84
|
+
mkdirSync(projectsDir, { recursive: true });
|
|
85
|
+
const pendings = new Set();
|
|
86
|
+
let watcher = null;
|
|
87
|
+
function onWatchEvent(eventType, filename) {
|
|
88
|
+
if (!filename || !filename.endsWith('.jsonl'))
|
|
89
|
+
return;
|
|
90
|
+
const full = join(projectsDir, filename);
|
|
91
|
+
if (!existsSync(full))
|
|
92
|
+
return;
|
|
93
|
+
const bound = tryBindFile(full, pendings, logger);
|
|
94
|
+
if (bound) {
|
|
95
|
+
logger(`jsonl-observer matched event=${eventType} path=${full} bridgeSuffix=${bound.bridgeSuffix}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
watcher = watch(projectsDir, { persistent: false }, onWatchEvent);
|
|
100
|
+
watcher.on('error', (err) => {
|
|
101
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
102
|
+
logger(`jsonl-observer watch-error dir=${projectsDir} message=${msg}`);
|
|
103
|
+
});
|
|
104
|
+
logger(`jsonl-observer armed dir=${projectsDir}`);
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// mkdir succeeded but watch failed — extremely unlikely. Log loudly;
|
|
108
|
+
// observations registered later will resolve only via the on-arm scan
|
|
109
|
+
// unless the operator restarts the manager.
|
|
110
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
111
|
+
logger(`jsonl-observer watch-init-failed dir=${projectsDir} message=${msg}`);
|
|
112
|
+
}
|
|
113
|
+
function observe(args) {
|
|
114
|
+
const { bridgeSuffix } = args;
|
|
115
|
+
let resolveFn;
|
|
116
|
+
const promise = new Promise((resolve) => {
|
|
117
|
+
resolveFn = resolve;
|
|
118
|
+
});
|
|
119
|
+
const pending = {
|
|
120
|
+
bridgeSuffix,
|
|
121
|
+
resolve: resolveFn,
|
|
122
|
+
settled: false,
|
|
123
|
+
};
|
|
124
|
+
// On-arm scan — close the race between this call and the fs.watch
|
|
125
|
+
// event firing for a JSONL Claude already wrote.
|
|
126
|
+
pendings.add(pending);
|
|
127
|
+
let scannedHit = false;
|
|
128
|
+
try {
|
|
129
|
+
for (const entry of readdirSync(projectsDir, { withFileTypes: true })) {
|
|
130
|
+
if (!entry.isFile() || !entry.name.endsWith('.jsonl'))
|
|
131
|
+
continue;
|
|
132
|
+
const full = join(projectsDir, entry.name);
|
|
133
|
+
const bound = tryBindFile(full, pendings, logger);
|
|
134
|
+
if (bound === pending) {
|
|
135
|
+
scannedHit = true;
|
|
136
|
+
logger(`jsonl-observer on-arm-scan-matched path=${full} bridgeSuffix=${bridgeSuffix}`);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
143
|
+
logger(`jsonl-observer on-arm-scan-failed dir=${projectsDir} message=${msg}`);
|
|
144
|
+
}
|
|
145
|
+
if (!scannedHit) {
|
|
146
|
+
logger(`jsonl-observer pending bridgeSuffix=${bridgeSuffix}`);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
promise,
|
|
150
|
+
cancel: () => {
|
|
151
|
+
if (pending.settled)
|
|
152
|
+
return;
|
|
153
|
+
pending.settled = true;
|
|
154
|
+
pendings.delete(pending);
|
|
155
|
+
pending.resolve(null);
|
|
156
|
+
logger(`jsonl-observer cancelled bridgeSuffix=${bridgeSuffix}`);
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function close() {
|
|
161
|
+
if (watcher) {
|
|
162
|
+
watcher.close();
|
|
163
|
+
watcher = null;
|
|
164
|
+
}
|
|
165
|
+
for (const p of pendings) {
|
|
166
|
+
if (p.settled)
|
|
167
|
+
continue;
|
|
168
|
+
p.settled = true;
|
|
169
|
+
p.resolve(null);
|
|
170
|
+
}
|
|
171
|
+
pendings.clear();
|
|
172
|
+
}
|
|
173
|
+
return { observe, close };
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=jsonl-observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonl-observer.js","sourceRoot":"","sources":["../src/jsonl-observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export declare function claudeStateRoot(env?: NodeJS.ProcessEnv): string;
|
|
2
2
|
export declare function projectSlugForCwd(cwd: string): string;
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
/** Extract the bridge-session suffix from a `/remote-control` URL. This is
|
|
4
|
+
* the part after `session_`, not the intrinsic JSONL filename. Returns
|
|
5
|
+
* null if the URL has no `session_<...>` component. */
|
|
6
|
+
export declare function bridgeSuffixFromUrl(url: string): string | null;
|
|
5
7
|
//# sourceMappingURL=jsonl-path.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-path.d.ts","sourceRoot":"","sources":["../src/jsonl-path.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsonl-path.d.ts","sourceRoot":"","sources":["../src/jsonl-path.ts"],"names":[],"mappings":"AAqBA,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;wDAEwD;AACxD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D"}
|
|
@@ -1,23 +1,20 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Helpers for locating claude's per-session JSONL transcripts on disk.
|
|
2
2
|
//
|
|
3
3
|
// Claude Code writes one JSONL file per session at
|
|
4
4
|
//
|
|
5
5
|
// ${CLAUDE_CONFIG_DIR or ~/.claude}/projects/<project-slug>/<claude-session-id>.jsonl
|
|
6
6
|
//
|
|
7
|
-
// where <project-slug> is the cwd at spawn time with every '/' replaced
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
7
|
+
// where <project-slug> is the cwd at spawn time with every '/' replaced by '-'
|
|
8
|
+
// (leading slash included, so /home/foo becomes -home-foo). Task 019 set
|
|
9
|
+
// CLAUDE_CONFIG_DIR on the manager unit so brand isolation holds for
|
|
10
|
+
// credentials, onboarding state, and JSONL transcripts.
|
|
11
11
|
//
|
|
12
|
-
// Task
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
// The PRD names this file as the canonical per-session forensic surface;
|
|
19
|
-
// the manager records the path on every spawn so the operator can
|
|
20
|
-
// `tail -f` it directly.
|
|
12
|
+
// Task 065 removed `deriveJsonlPath` and `claudeSessionIdFromUrl`. The
|
|
13
|
+
// `/remote-control` URL contains the bridge sessionId (the suffix after
|
|
14
|
+
// `session_`), which is NOT the JSONL filename. The intrinsic JSONL
|
|
15
|
+
// filename is only knowable by observing what Claude Code actually writes
|
|
16
|
+
// on disk (see `jsonl-observer.ts`). The only URL helper still needed is
|
|
17
|
+
// `bridgeSuffixFromUrl`, used by pty-spawner to register the observation.
|
|
21
18
|
import { homedir } from 'node:os';
|
|
22
19
|
import { join } from 'node:path';
|
|
23
20
|
export function claudeStateRoot(env = process.env) {
|
|
@@ -26,15 +23,11 @@ export function claudeStateRoot(env = process.env) {
|
|
|
26
23
|
export function projectSlugForCwd(cwd) {
|
|
27
24
|
return cwd.replace(/\//g, '-');
|
|
28
25
|
}
|
|
29
|
-
|
|
26
|
+
/** Extract the bridge-session suffix from a `/remote-control` URL. This is
|
|
27
|
+
* the part after `session_`, not the intrinsic JSONL filename. Returns
|
|
28
|
+
* null if the URL has no `session_<...>` component. */
|
|
29
|
+
export function bridgeSuffixFromUrl(url) {
|
|
30
30
|
const match = url.match(/session_([A-Za-z0-9_-]+)/);
|
|
31
31
|
return match ? match[1] : null;
|
|
32
32
|
}
|
|
33
|
-
export function deriveJsonlPath(cwd, url) {
|
|
34
|
-
const claudeId = claudeSessionIdFromUrl(url);
|
|
35
|
-
if (!claudeId)
|
|
36
|
-
return null;
|
|
37
|
-
const slug = projectSlugForCwd(cwd);
|
|
38
|
-
return join(claudeStateRoot(), 'projects', slug, `${claudeId}.jsonl`);
|
|
39
|
-
}
|
|
40
33
|
//# sourceMappingURL=jsonl-path.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonl-path.js","sourceRoot":"","sources":["../src/jsonl-path.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"jsonl-path.js","sourceRoot":"","sources":["../src/jsonl-path.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,mDAAmD;AACnD,EAAE;AACF,0FAA0F;AAC1F,EAAE;AACF,+EAA+E;AAC/E,yEAAyE;AACzE,qEAAqE;AACrE,wDAAwD;AACxD,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,oEAAoE;AACpE,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAE1E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,OAAO,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AAChC,CAAC;AAED;;wDAEwD;AACxD,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;IACnD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAChC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Logger, PtyHandle, Role, Channel } from './types.js';
|
|
2
2
|
import { SessionStore, type StoredSession } from './session-store.js';
|
|
3
|
+
import type { JsonlObserver } from './jsonl-observer.js';
|
|
3
4
|
import { type OnboardingPayload } from './system-prompt.js';
|
|
4
5
|
import type { HostResolution } from './config.js';
|
|
5
6
|
import type { ToolSurface } from './tool-surface.js';
|
|
@@ -31,6 +32,18 @@ export interface SpawnDeps {
|
|
|
31
32
|
* publicAllowlist field, so by the time pty-spawner sees this struct, the
|
|
32
33
|
* per-tool decisions are guaranteed complete. */
|
|
33
34
|
toolSurface: ToolSurface;
|
|
35
|
+
/** Task 065 — observer for the JSONL file Claude Code writes. The spawn
|
|
36
|
+
* registers a pending observation keyed on the URL's bridge suffix; the
|
|
37
|
+
* observer resolves when the matching JSONL appears on disk. Tests
|
|
38
|
+
* inject a noop observer whose `observe()` returns a never-resolving
|
|
39
|
+
* promise and a no-op cancel. */
|
|
40
|
+
observer: JsonlObserver;
|
|
41
|
+
/** Task 065 — fires once after the observer matches a JSONL to the
|
|
42
|
+
* session. The closure has already mutated `session.jsonlPath` and
|
|
43
|
+
* `session.claudeSessionId` by the time this is invoked. http-server
|
|
44
|
+
* uses this to defer public-tool audit attachment until the JSONL
|
|
45
|
+
* exists. Tests may omit this. */
|
|
46
|
+
onJsonlObserved?: (session: StoredSession) => void;
|
|
34
47
|
}
|
|
35
48
|
export interface SpawnArgs {
|
|
36
49
|
senderId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,EAAoD,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC7G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACpC;IACE,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EACF,wBAAwB,GACxB,kBAAkB,GAClB,qBAAqB,GACrB,yBAAyB,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAEL,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,SAAS,CAAA;IAC5E,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,CAAA;IACnB;;;;;uCAKmC;IACnC,IAAI,EAAE,cAAc,CAAA;IACpB;;;;sDAIkD;IAClD,WAAW,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"pty-spawner.d.ts","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAElE,OAAO,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAoD,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC7G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACpC;IACE,EAAE,EAAE,KAAK,CAAA;IACT,MAAM,EACF,wBAAwB,GACxB,kBAAkB,GAClB,qBAAqB,GACrB,yBAAyB,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAEL,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,SAAS,CAAA;IAC5E,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,YAAY,CAAA;IACnB;;;;;uCAKmC;IACnC,IAAI,EAAE,cAAc,CAAA;IACpB;;;;sDAIkD;IAClD,WAAW,EAAE,WAAW,CAAA;IACxB;;;;sCAIkC;IAClC,QAAQ,EAAE,aAAa,CAAA;IACvB;;;;uCAImC;IACnC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CACnD;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB;;gCAE4B;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B;;;;8EAI0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB;;;;;iEAK6D;IAC7D,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B;;;;4BAIwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;sEAGkE;IAClE,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B;;;;;;iEAM6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,MAAM,GAAG,MAAM,CAAA;AACxE,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAA+C,CAAA;AAErG,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CA+I/F;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,YAAY,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBzC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { randomUUID } from 'node:crypto';
|
|
12
12
|
import { mkdirSync } from 'node:fs';
|
|
13
13
|
import { startUrlCapture } from './url-capture.js';
|
|
14
|
-
import {
|
|
14
|
+
import { bridgeSuffixFromUrl } from './jsonl-path.js';
|
|
15
15
|
import { composeAppendSystemPrompt, renderOnboardingBlock } from './system-prompt.js';
|
|
16
16
|
export const PERMISSION_MODES = ['default', 'acceptEdits', 'plan', 'auto'];
|
|
17
17
|
export async function spawnClaudeSession(deps, args) {
|
|
@@ -87,7 +87,10 @@ export async function spawnClaudeSession(deps, args) {
|
|
|
87
87
|
timeoutMs: deps.urlCaptureTimeoutMs,
|
|
88
88
|
logger: deps.logger,
|
|
89
89
|
onUrl: (url) => {
|
|
90
|
-
|
|
90
|
+
// Task 065 — never predict the JSONL path. Store the session with
|
|
91
|
+
// null observation fields; the observer mutates them once Claude
|
|
92
|
+
// Code's file appears on disk and the head bytes match this
|
|
93
|
+
// spawn's bridge suffix.
|
|
91
94
|
const session = {
|
|
92
95
|
sessionId,
|
|
93
96
|
pid: pty.pid,
|
|
@@ -96,16 +99,35 @@ export async function spawnClaudeSession(deps, args) {
|
|
|
96
99
|
senderId: args.senderId,
|
|
97
100
|
role: args.role,
|
|
98
101
|
channel: args.channel,
|
|
99
|
-
jsonlPath,
|
|
102
|
+
jsonlPath: null,
|
|
103
|
+
claudeSessionId: null,
|
|
100
104
|
pty,
|
|
101
105
|
exited: false,
|
|
102
106
|
};
|
|
103
107
|
deps.store.add(session);
|
|
108
|
+
const bridgeSuffix = bridgeSuffixFromUrl(url);
|
|
109
|
+
let observation = null;
|
|
110
|
+
if (bridgeSuffix) {
|
|
111
|
+
observation = deps.observer.observe({ bridgeSuffix });
|
|
112
|
+
observation.promise.then((observed) => {
|
|
113
|
+
if (!observed)
|
|
114
|
+
return;
|
|
115
|
+
session.jsonlPath = observed.jsonlPath;
|
|
116
|
+
session.claudeSessionId = observed.claudeSessionId;
|
|
117
|
+
deps.logger(`jsonl-observed pid=${pty.pid} sessionId=${observed.claudeSessionId} path=${observed.jsonlPath}`);
|
|
118
|
+
deps.onJsonlObserved?.(session);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
deps.logger(`jsonl-observe-skipped pid=${pty.pid} reason=bridge-suffix-unparseable url=${url}`);
|
|
123
|
+
}
|
|
104
124
|
pty.onExit(() => {
|
|
105
125
|
session.exited = true;
|
|
126
|
+
if (observation)
|
|
127
|
+
observation.cancel();
|
|
106
128
|
deps.logger(`kill pid=${pty.pid} reason=process-exited exit-code=0`);
|
|
107
129
|
});
|
|
108
|
-
deps.logger(`spawn pid=${pty.pid} sessionUrl=${url}
|
|
130
|
+
deps.logger(`spawn pid=${pty.pid} sessionUrl=${url} senderId=${args.senderId} role=${args.role} channel=${args.channel} permissionMode=${args.permissionMode ?? 'default'} latency-ms=${Date.now() - start}`);
|
|
109
131
|
deps.logger(`[pty-spawn] sessionId=${sessionId} appendSystemPromptBytes=${Buffer.byteLength(appendSystemPrompt, 'utf8')} hostname=${deps.host.hostname} lanIPv4=${deps.host.lanIPv4} adminUrl=${deps.host.adminUrl} tunnelUrl=${deps.host.tunnelUrl ?? 'none'}`);
|
|
110
132
|
if (args.onboarding) {
|
|
111
133
|
const rendered = renderOnboardingBlock(args.onboarding.step);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,0DAA0D;AAC1D,0EAA0E;AAC1E,2EAA2E;AAC3E,eAAe;AACf,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pty-spawner.js","sourceRoot":"","sources":["../src/pty-spawner.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,yEAAyE;AACzE,0DAA0D;AAC1D,0EAA0E;AAC1E,2EAA2E;AAC3E,eAAe;AACf,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEnC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAA0B,MAAM,oBAAoB,CAAA;AA6F7G,MAAM,CAAC,MAAM,gBAAgB,GAA8B,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAErG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAe,EAAE,IAAe;IACvE,MAAM,SAAS,GAAG,UAAU,EAAE,CAAA;IAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IAChF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,iCAAiC,CAAA;QACnF,IAAI,CAAC,MAAM,CAAC,2DAA2D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACpG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,UAAU,EAAE,CAAA;IACrE,CAAC;IACD,MAAM,IAAI,GAAa;QACrB,WAAW;QACX,kBAAkB;QAClB,wBAAwB;QACxB,kBAAkB;KACnB,CAAA;IACD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAA;IACnD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;IACD,0EAA0E;IAC1E,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;IAC5F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,oEAAoE;IACpE,uEAAuE;IACvE,yEAAyE;IACzE,6CAA6C;IAC7C,MAAM,cAAc,GAClB,IAAI,CAAC,IAAI,KAAK,QAAQ;QACpB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAChH,CAAC,CAAC,EAAE,CAAA;IACR,IAAI,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,IAAI,UAAU,OAAO,CAAC,MAAM,aAAa,cAAc,EAAE,CAAC,CAAA;IAClG,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACrD,CAAC;IAED,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,mEAAmE;IACnE,wEAAwE;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC1C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,IAAI,CAAC,aAAa,MAAM,CAAC,CAAA;IAChE,CAAC;IAED,IAAI,GAAc,CAAA;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;YACxC,GAAG,OAAO,CAAC,GAAG;YACd,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAA;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,kBAAkB,CAAA;QAClF,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC/C,IAAI,CAAC,MAAM,CAAC,uBAAuB,MAAM,gBAAgB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACtF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;IAC1C,CAAC;IAED,OAAO,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,EAAE;QAChD,eAAe,CAAC;YACd,GAAG;YACH,SAAS,EAAE,IAAI,CAAC,mBAAmB;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,kEAAkE;gBAClE,iEAAiE;gBACjE,4DAA4D;gBAC5D,yBAAyB;gBACzB,MAAM,OAAO,GAAkB;oBAC7B,SAAS;oBACT,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,GAAG;oBACH,SAAS;oBACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,SAAS,EAAE,IAAI;oBACf,eAAe,EAAE,IAAI;oBACrB,GAAG;oBACH,MAAM,EAAE,KAAK;iBACd,CAAA;gBACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAEvB,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;gBAC7C,IAAI,WAAW,GAAgD,IAAI,CAAA;gBACnE,IAAI,YAAY,EAAE,CAAC;oBACjB,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC,CAAA;oBACrD,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;wBACpC,IAAI,CAAC,QAAQ;4BAAE,OAAM;wBACrB,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAA;wBACtC,OAAO,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAA;wBAClD,IAAI,CAAC,MAAM,CACT,sBAAsB,GAAG,CAAC,GAAG,cAAc,QAAQ,CAAC,eAAe,SAAS,QAAQ,CAAC,SAAS,EAAE,CACjG,CAAA;wBACD,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,CAAA;oBACjC,CAAC,CAAC,CAAA;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CACT,6BAA6B,GAAG,CAAC,GAAG,yCAAyC,GAAG,EAAE,CACnF,CAAA;gBACH,CAAC;gBAED,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAA;oBACrB,IAAI,WAAW;wBAAE,WAAW,CAAC,MAAM,EAAE,CAAA;oBACrC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,GAAG,oCAAoC,CAAC,CAAA;gBACtE,CAAC,CAAC,CAAA;gBACF,IAAI,CAAC,MAAM,CACT,aAAa,GAAG,CAAC,GAAG,eAAe,GAAG,aAAa,IAAI,CAAC,QAAQ,SAAS,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,OAAO,mBAAmB,IAAI,CAAC,cAAc,IAAI,SAAS,eAAe,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CACjM,CAAA;gBACD,IAAI,CAAC,MAAM,CACT,yBAAyB,SAAS,4BAA4B,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,CACpP,CAAA;gBACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;oBAC5D,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;wBACvE,IAAI,CAAC,MAAM,CACT,4BAA4B,QAAQ,CAAC,KAAK,UAAU,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,cAAc,EAAE,CAC/J,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;YAChC,CAAC;YACD,SAAS,EAAE,GAAG,EAAE;gBACd,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACnB,IAAI,CAAC,MAAM,CAAC,wDAAwD,CAAC,CAAA;gBACrE,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAA;YACvE,CAAC;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAgB,EAChB,SAAiB;IAEjB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC3C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IACpC,CAAC;IACD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,CAAC,CAAC,MAAM;gBAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACpC,OAAO,EAAE,CAAA;QACX,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QACpB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;YAChB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,sCAAsC,CAAC,CAAA;IACpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACpC,CAAC"}
|
|
@@ -7,7 +7,16 @@ export interface StoredSession {
|
|
|
7
7
|
senderId: string;
|
|
8
8
|
role: Role;
|
|
9
9
|
channel: Channel;
|
|
10
|
+
/** Path to the JSONL Claude Code wrote, observed from disk (see
|
|
11
|
+
* jsonl-observer.ts). Null until the observer matches the JSONL to
|
|
12
|
+
* this session's bridge suffix. Task 065 — replaces the predicted
|
|
13
|
+
* path that produced phantom /list rows. */
|
|
10
14
|
jsonlPath: string | null;
|
|
15
|
+
/** Intrinsic claude session id (the JSONL basename, without `.jsonl`),
|
|
16
|
+
* observed via jsonl-observer. Distinct from the URL bridge suffix.
|
|
17
|
+
* Used by /list dedup against the on-disk enumerator. Null until the
|
|
18
|
+
* observer fires. Task 065. */
|
|
19
|
+
claudeSessionId: string | null;
|
|
11
20
|
pty: PtyHandle;
|
|
12
21
|
exited: boolean;
|
|
13
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAI3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAM7C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAQ/C,GAAG,IAAI,aAAa,EAAE;IAItB,IAAI,IAAI,MAAM;CAGf"}
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE1D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB;;;iDAG6C;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB;;;oCAGgC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,GAAG,EAAE,SAAS,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAE5D,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAI3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAM7C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAQ/C,GAAG,IAAI,aAAa,EAAE;IAItB,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,6EAA6E;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,6EAA6E;AA0B7E,MAAM,OAAO,YAAY;IACN,QAAQ,GAAG,IAAI,GAAG,EAAyB,CAAA;IAE5D,GAAG,CAAC,CAAgB;QAClB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;IACnC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAI,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/B,OAAO,CAAC,CAAA;IACV,CAAC;IAED,YAAY,CAAC,QAAgB;QAC3B,MAAM,GAAG,GAAoB,EAAE,CAAA;QAC/B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1C,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAA;IAC3B,CAAC;CACF"}
|
|
@@ -8,11 +8,13 @@ export interface HostContext {
|
|
|
8
8
|
* `step` is the raw value returned by `loadOnboardingStep(accountId)` —
|
|
9
9
|
* 0..8 = in-progress, 9 = complete, -1 = no node (defensive), null =
|
|
10
10
|
* Neo4j unreachable. Task 043 moves the onboarding directive from PTY
|
|
11
|
-
* keystrokes
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* keystrokes into the spawn-time append-system-prompt block. Task 066
|
|
12
|
+
* makes the block state-only and adds the optional `resumePrompt` —
|
|
13
|
+
* verbatim stdout of the banner-click script run that the operator
|
|
14
|
+
* just saw in the chat surface. */
|
|
14
15
|
export interface OnboardingPayload {
|
|
15
16
|
step: number | null;
|
|
17
|
+
resumePrompt?: string;
|
|
16
18
|
}
|
|
17
19
|
export declare const ATTACHMENT_CEILING_BYTES = 31457280;
|
|
18
20
|
export declare function composeAppendSystemPrompt(host: HostContext, onboarding?: OnboardingPayload): string | null;
|
|
@@ -26,8 +28,9 @@ export interface RenderedOnboardingBlock {
|
|
|
26
28
|
}
|
|
27
29
|
/** Render the onboarding-state section for a given step. Returns null when
|
|
28
30
|
* the agent should see no onboarding block (step === 9 = complete). The
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
|
|
31
|
+
* body is state-only per Task 066: currentStep + resumeStep attributes
|
|
32
|
+
* plus an optional `<resume-prompt-shown>` child carrying the verbatim
|
|
33
|
+
* output of the banner-click script run, so the agent has context for
|
|
34
|
+
* the operator's next reply without any per-tool imperative. */
|
|
35
|
+
export declare function renderOnboardingBlock(step: number | null, resumePrompt?: string): RenderedOnboardingBlock | null;
|
|
33
36
|
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAmCA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED;;;;;;;oCAOoC;AACpC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,wBAAwB,WAAa,CAAA;AAElD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,WAAW,EACjB,UAAU,CAAC,EAAE,iBAAiB,GAC7B,MAAM,GAAG,IAAI,CAmBf;AAED,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAA;IACb;;kEAE8D;IAC9D,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;iEAKiE;AACjE,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,uBAAuB,GAAG,IAAI,CAShC"}
|