teamshare-bridge 0.27.5 → 0.28.2
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/dist/bridge/daemon.js +57 -2
- package/dist/bridge/daemon.js.map +1 -1
- package/dist/bridge/wake-handler.d.ts +16 -0
- package/dist/bridge/wake-handler.js +67 -37
- package/dist/bridge/wake-handler.js.map +1 -1
- package/dist/bridge/wake-outbox.d.ts +28 -0
- package/dist/bridge/wake-outbox.js +45 -1
- package/dist/bridge/wake-outbox.js.map +1 -1
- package/dist/bridge/wake-routing.js +13 -3
- package/dist/bridge/wake-routing.js.map +1 -1
- package/dist/cli/commands/build.js +5 -0
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/chat.js +8 -0
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/run.js +9 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/lib/api-content.d.ts +11 -0
- package/dist/lib/api-content.js.map +1 -1
- package/dist/lib/api-types.d.ts +2 -0
- package/dist/lib/browser/browse-harness.js +31 -6
- package/dist/lib/browser/browse-harness.js.map +1 -1
- package/dist/lib/chat/board-reply.d.ts +5 -0
- package/dist/lib/chat/board-reply.js +12 -0
- package/dist/lib/chat/board-reply.js.map +1 -1
- package/dist/lib/chat/chat-reply.d.ts +54 -0
- package/dist/lib/chat/chat-reply.js +141 -9
- package/dist/lib/chat/chat-reply.js.map +1 -1
- package/dist/lib/chat/doc-reply.d.ts +5 -0
- package/dist/lib/chat/doc-reply.js +63 -18
- package/dist/lib/chat/doc-reply.js.map +1 -1
- package/dist/lib/git/git-branch.d.ts +37 -0
- package/dist/lib/git/git-branch.js +56 -6
- package/dist/lib/git/git-branch.js.map +1 -1
- package/dist/lib/git/git-finalize.d.ts +5 -0
- package/dist/lib/git/git-finalize.js +62 -3
- package/dist/lib/git/git-finalize.js.map +1 -1
- package/dist/lib/git/git-prepare.d.ts +5 -0
- package/dist/lib/git/git-prepare.js +12 -2
- package/dist/lib/git/git-prepare.js.map +1 -1
- package/dist/lib/harness/harness-adapter.d.ts +21 -0
- package/dist/lib/harness/harness-adapter.js.map +1 -1
- package/dist/lib/harness/prompt-file.d.ts +56 -0
- package/dist/lib/harness/prompt-file.js +120 -13
- package/dist/lib/harness/prompt-file.js.map +1 -1
- package/dist/lib/harness/session-store.d.ts +88 -0
- package/dist/lib/harness/session-store.js +141 -2
- package/dist/lib/harness/session-store.js.map +1 -1
- package/dist/lib/harness/spawn.d.ts +15 -0
- package/dist/lib/harness/spawn.js +424 -68
- package/dist/lib/harness/spawn.js.map +1 -1
- package/dist/lib/harness/turn-watch.d.ts +149 -0
- package/dist/lib/harness/turn-watch.js +265 -0
- package/dist/lib/harness/turn-watch.js.map +1 -0
- package/dist/lib/orchestrator/handlers/git.js +4 -3
- package/dist/lib/orchestrator/handlers/git.js.map +1 -1
- package/dist/lib/orchestrator/worktree.d.ts +2 -0
- package/dist/lib/orchestrator/worktree.js +1 -0
- package/dist/lib/orchestrator/worktree.js.map +1 -1
- package/dist/lib/workspace/mirror-lease.d.ts +10 -0
- package/dist/lib/workspace/mirror-lease.js +1 -0
- package/dist/lib/workspace/mirror-lease.js.map +1 -1
- package/dist/lib/workspace/mirror.d.ts +16 -0
- package/dist/lib/workspace/mirror.js +124 -22
- package/dist/lib/workspace/mirror.js.map +1 -1
- package/dist/lib/workspace/state-root.d.ts +8 -0
- package/dist/lib/workspace/state-root.js +11 -0
- package/dist/lib/workspace/state-root.js.map +1 -1
- package/dist/lib/workspace/stop-notice.d.ts +13 -1
- package/dist/lib/workspace/stop-notice.js +17 -2
- package/dist/lib/workspace/stop-notice.js.map +1 -1
- package/dist/lib/workspace/stop-save.d.ts +3 -0
- package/dist/lib/workspace/stop-save.js +39 -5
- package/dist/lib/workspace/stop-save.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONVERSATIONAL_MODES = exports.DEFAULT_CHAT_CONTEXT_TOKENS = void 0;
|
|
4
|
+
exports.estimateSessionTokens = estimateSessionTokens;
|
|
5
|
+
exports.sessionContextExceeded = sessionContextExceeded;
|
|
3
6
|
exports.loadHarnessSession = loadHarnessSession;
|
|
4
7
|
exports.saveHarnessSession = saveHarnessSession;
|
|
5
8
|
exports.clearHarnessSession = clearHarnessSession;
|
|
9
|
+
exports.peekHarnessSession = peekHarnessSession;
|
|
10
|
+
exports.addHarnessSessionContext = addHarnessSessionContext;
|
|
11
|
+
exports.noteHarnessSessionFailure = noteHarnessSessionFailure;
|
|
12
|
+
exports.clearHarnessSessionFailure = clearHarnessSessionFailure;
|
|
6
13
|
exports.hasHarnessSession = hasHarnessSession;
|
|
14
|
+
exports.conversationWouldResume = conversationWouldResume;
|
|
7
15
|
exports.saveLiveHarnessSession = saveLiveHarnessSession;
|
|
8
16
|
exports.loadLiveHarnessSession = loadLiveHarnessSession;
|
|
9
17
|
exports.clearLiveHarnessSession = clearLiveHarnessSession;
|
|
@@ -21,8 +29,55 @@ exports.clearLiveHarnessSession = clearLiveHarnessSession;
|
|
|
21
29
|
const node_fs_1 = require("node:fs");
|
|
22
30
|
const node_os_1 = require("node:os");
|
|
23
31
|
const node_path_1 = require("node:path");
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
// Env overrides exist so a test can never write into the developer's real
|
|
33
|
+
// `~/.teamshare/harness-sessions` (and, worse, adopt a live agent's session
|
|
34
|
+
// record). Same pattern as `mirror-lease.ts`'s `TS_MIRROR_LEASE_DIR`.
|
|
35
|
+
const STORE_DIR = process.env.TS_HARNESS_SESSION_DIR?.trim() ||
|
|
36
|
+
(0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'harness-sessions');
|
|
37
|
+
const SESSIONS_DIR = process.env.TS_SESSIONS_DIR?.trim() ||
|
|
38
|
+
(0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'sessions');
|
|
39
|
+
/**
|
|
40
|
+
* Default context budget for a conversational session (2026-12).
|
|
41
|
+
*
|
|
42
|
+
* A project can override it (`Project.chatMaxContextTokens`); this is what
|
|
43
|
+
* "not stated" means. 400k is large enough that a normal project conversation
|
|
44
|
+
* never rotates, and small enough that it happens well before the biggest
|
|
45
|
+
* windows fill.
|
|
46
|
+
*/
|
|
47
|
+
exports.DEFAULT_CHAT_CONTEXT_TOKENS = 400_000;
|
|
48
|
+
/** Modes that are ONE CONVERSATION and must not lose it to a transient error. */
|
|
49
|
+
exports.CONVERSATIONAL_MODES = new Set([
|
|
50
|
+
'chat',
|
|
51
|
+
'doc',
|
|
52
|
+
'board',
|
|
53
|
+
]);
|
|
54
|
+
/**
|
|
55
|
+
* Rough token estimate for a conversation from its accumulated character count.
|
|
56
|
+
*
|
|
57
|
+
* ~4 characters per token is the standard English approximation, and it is the
|
|
58
|
+
* only one that works for every harness (some print usage, most do not).
|
|
59
|
+
*/
|
|
60
|
+
function estimateSessionTokens(contextChars) {
|
|
61
|
+
if (!contextChars || contextChars <= 0)
|
|
62
|
+
return 0;
|
|
63
|
+
return Math.ceil(contextChars / 4);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Has this conversation outgrown its budget?
|
|
67
|
+
*
|
|
68
|
+
* `limit` is `Project.chatMaxContextTokens` (null/undefined = the 400k
|
|
69
|
+
* default). A record with no `contextChars` (written before this field existed)
|
|
70
|
+
* is treated as EMPTY, not as over budget - the first run under the new code
|
|
71
|
+
* adopts it and starts counting from its own prompt.
|
|
72
|
+
*/
|
|
73
|
+
function sessionContextExceeded(record, limitTokens) {
|
|
74
|
+
if (!record)
|
|
75
|
+
return false;
|
|
76
|
+
const limit = typeof limitTokens === 'number' && limitTokens > 0
|
|
77
|
+
? limitTokens
|
|
78
|
+
: exports.DEFAULT_CHAT_CONTEXT_TOKENS;
|
|
79
|
+
return estimateSessionTokens(record.contextChars) >= limit;
|
|
80
|
+
}
|
|
26
81
|
function recordPath(agentId, taskId, mode) {
|
|
27
82
|
return (0, node_path_1.join)(STORE_DIR, agentId, `${taskId}.${mode}.json`);
|
|
28
83
|
}
|
|
@@ -77,10 +132,94 @@ function clearHarnessSession(agentId, taskId, mode) {
|
|
|
77
132
|
/* best-effort */
|
|
78
133
|
}
|
|
79
134
|
}
|
|
135
|
+
/** Read a record regardless of harness/cwd (used for accounting + rotation). */
|
|
136
|
+
function peekHarnessSession(agentId, taskId, mode) {
|
|
137
|
+
try {
|
|
138
|
+
const raw = (0, node_fs_1.readFileSync)(recordPath(agentId, taskId, mode), 'utf8');
|
|
139
|
+
const rec = JSON.parse(raw);
|
|
140
|
+
return rec?.id ? rec : null;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function patchSessionRecord(agentId, taskId, mode, patch) {
|
|
147
|
+
const current = peekHarnessSession(agentId, taskId, mode);
|
|
148
|
+
if (!current)
|
|
149
|
+
return null;
|
|
150
|
+
try {
|
|
151
|
+
const next = patch(current);
|
|
152
|
+
(0, node_fs_1.writeFileSync)(recordPath(agentId, taskId, mode), JSON.stringify(next, null, 2), 'utf8');
|
|
153
|
+
return next;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return current;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Add one turn's worth of characters to a session's context estimate.
|
|
161
|
+
*
|
|
162
|
+
* Called after a successful turn. Best-effort: a missing record (cleared mid
|
|
163
|
+
* run) is a no-op, and the conversation simply starts counting again next time.
|
|
164
|
+
*/
|
|
165
|
+
function addHarnessSessionContext(agentId, taskId, mode, addedChars) {
|
|
166
|
+
const add = Math.max(0, Math.round(addedChars));
|
|
167
|
+
return patchSessionRecord(agentId, taskId, mode, (rec) => ({
|
|
168
|
+
...rec,
|
|
169
|
+
contextChars: (rec.contextChars ?? 0) + add,
|
|
170
|
+
turns: (rec.turns ?? 0) + 1,
|
|
171
|
+
consecutiveFailures: 0,
|
|
172
|
+
lastUsedAt: new Date().toISOString(),
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Record a failed turn on a conversational session.
|
|
177
|
+
*
|
|
178
|
+
* Returns the new consecutive-failure count, so the caller can decide whether
|
|
179
|
+
* the session is worth keeping (1) or poisoned (>= 2).
|
|
180
|
+
*/
|
|
181
|
+
function noteHarnessSessionFailure(agentId, taskId, mode, error) {
|
|
182
|
+
const next = patchSessionRecord(agentId, taskId, mode, (rec) => ({
|
|
183
|
+
...rec,
|
|
184
|
+
consecutiveFailures: (rec.consecutiveFailures ?? 0) + 1,
|
|
185
|
+
lastError: error?.slice(0, 300),
|
|
186
|
+
}));
|
|
187
|
+
return next?.consecutiveFailures ?? 0;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Take back the recorded failure of a turn that DID deliver its answer (2026-11).
|
|
191
|
+
*
|
|
192
|
+
* A conversational turn can exit non-zero AFTER the model posted its reply
|
|
193
|
+
* through the MCP tool (OpenCode V2 client/server). The bridge only learns that
|
|
194
|
+
* later, from the channel, so the caller clears the strike it did not deserve -
|
|
195
|
+
* otherwise one delivered turn plus one transient error would reach the 2-strike
|
|
196
|
+
* conversation reset and silently forget the thread.
|
|
197
|
+
*/
|
|
198
|
+
function clearHarnessSessionFailure(agentId, taskId, mode) {
|
|
199
|
+
patchSessionRecord(agentId, taskId, mode, (rec) => {
|
|
200
|
+
const next = { ...rec, consecutiveFailures: 0 };
|
|
201
|
+
delete next.lastError;
|
|
202
|
+
return next;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
80
205
|
/** True when a record exists (used to decide whether resume is even possible). */
|
|
81
206
|
function hasHarnessSession(agentId, taskId, mode) {
|
|
82
207
|
return (0, node_fs_1.existsSync)(recordPath(agentId, taskId, mode));
|
|
83
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Would the next run of this conversation RESUME, or start fresh? (2026-12)
|
|
211
|
+
*
|
|
212
|
+
* Read-only: it applies exactly the gates `spawnHarness` applies (record
|
|
213
|
+
* present, same harness, same cwd) plus the context budget, so a caller can
|
|
214
|
+
* choose a bigger seed window when the conversation is about to be new
|
|
215
|
+
* (`chat-reply`). It must never rotate anything itself.
|
|
216
|
+
*/
|
|
217
|
+
function conversationWouldResume(agentId, taskId, mode, harness, cwd, limitTokens) {
|
|
218
|
+
const rec = loadRecord(agentId, taskId, mode, harness, cwd);
|
|
219
|
+
if (!rec)
|
|
220
|
+
return false;
|
|
221
|
+
return !sessionContextExceeded(rec, limitTokens);
|
|
222
|
+
}
|
|
84
223
|
function liveRecordPath(bridgeSessionId) {
|
|
85
224
|
const safe = bridgeSessionId.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 80);
|
|
86
225
|
return (0, node_path_1.join)(SESSIONS_DIR, `harness-${safe}.json`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/lib/harness/session-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../../src/lib/harness/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { type HarnessName, type SpawnOpts } from './harness-adapter';
|
|
2
2
|
export type LogFn = (text: string, level?: 'stdout' | 'stderr') => void;
|
|
3
|
+
/**
|
|
4
|
+
* Does this harness output line report "the conversation is too big for the
|
|
5
|
+
* model's context window"? (2026-12)
|
|
6
|
+
*
|
|
7
|
+
* Harnesses fail this way in words, not codes, and every vendor phrases it
|
|
8
|
+
* differently: OpenAI says "maximum context length", Anthropic "prompt is too
|
|
9
|
+
* long", Gemini "input token count ... exceeds", local models print
|
|
10
|
+
* "context window exceeded". We only need to recognise it well enough to
|
|
11
|
+
* ROTATE instead of failing the reply - a false positive costs one fresh
|
|
12
|
+
* session, a false negative loses the human's message.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately narrow: bare "token" or "context" alone would match ordinary
|
|
15
|
+
* chatter, so each pattern pairs the idea with a limit/exceed verb.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isContextOverflowText(text: string): boolean;
|
|
3
18
|
/**
|
|
4
19
|
* Kill a spawned harness AND its whole descendant tree. Plain child.kill()
|
|
5
20
|
* only terminates the shell wrapper (cmd.exe / sh) - npm/vitest/LSP
|