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.
Files changed (74) hide show
  1. package/dist/bridge/daemon.js +57 -2
  2. package/dist/bridge/daemon.js.map +1 -1
  3. package/dist/bridge/wake-handler.d.ts +16 -0
  4. package/dist/bridge/wake-handler.js +67 -37
  5. package/dist/bridge/wake-handler.js.map +1 -1
  6. package/dist/bridge/wake-outbox.d.ts +28 -0
  7. package/dist/bridge/wake-outbox.js +45 -1
  8. package/dist/bridge/wake-outbox.js.map +1 -1
  9. package/dist/bridge/wake-routing.js +13 -3
  10. package/dist/bridge/wake-routing.js.map +1 -1
  11. package/dist/cli/commands/build.js +5 -0
  12. package/dist/cli/commands/build.js.map +1 -1
  13. package/dist/cli/commands/chat.js +8 -0
  14. package/dist/cli/commands/chat.js.map +1 -1
  15. package/dist/cli/commands/run.js +9 -0
  16. package/dist/cli/commands/run.js.map +1 -1
  17. package/dist/lib/api-content.d.ts +11 -0
  18. package/dist/lib/api-content.js.map +1 -1
  19. package/dist/lib/api-types.d.ts +2 -0
  20. package/dist/lib/browser/browse-harness.js +31 -6
  21. package/dist/lib/browser/browse-harness.js.map +1 -1
  22. package/dist/lib/chat/board-reply.d.ts +5 -0
  23. package/dist/lib/chat/board-reply.js +12 -0
  24. package/dist/lib/chat/board-reply.js.map +1 -1
  25. package/dist/lib/chat/chat-reply.d.ts +54 -0
  26. package/dist/lib/chat/chat-reply.js +141 -9
  27. package/dist/lib/chat/chat-reply.js.map +1 -1
  28. package/dist/lib/chat/doc-reply.d.ts +5 -0
  29. package/dist/lib/chat/doc-reply.js +63 -18
  30. package/dist/lib/chat/doc-reply.js.map +1 -1
  31. package/dist/lib/git/git-branch.d.ts +37 -0
  32. package/dist/lib/git/git-branch.js +56 -6
  33. package/dist/lib/git/git-branch.js.map +1 -1
  34. package/dist/lib/git/git-finalize.d.ts +5 -0
  35. package/dist/lib/git/git-finalize.js +62 -3
  36. package/dist/lib/git/git-finalize.js.map +1 -1
  37. package/dist/lib/git/git-prepare.d.ts +5 -0
  38. package/dist/lib/git/git-prepare.js +12 -2
  39. package/dist/lib/git/git-prepare.js.map +1 -1
  40. package/dist/lib/harness/harness-adapter.d.ts +21 -0
  41. package/dist/lib/harness/harness-adapter.js.map +1 -1
  42. package/dist/lib/harness/prompt-file.d.ts +56 -0
  43. package/dist/lib/harness/prompt-file.js +120 -13
  44. package/dist/lib/harness/prompt-file.js.map +1 -1
  45. package/dist/lib/harness/session-store.d.ts +88 -0
  46. package/dist/lib/harness/session-store.js +141 -2
  47. package/dist/lib/harness/session-store.js.map +1 -1
  48. package/dist/lib/harness/spawn.d.ts +15 -0
  49. package/dist/lib/harness/spawn.js +424 -68
  50. package/dist/lib/harness/spawn.js.map +1 -1
  51. package/dist/lib/harness/turn-watch.d.ts +149 -0
  52. package/dist/lib/harness/turn-watch.js +265 -0
  53. package/dist/lib/harness/turn-watch.js.map +1 -0
  54. package/dist/lib/orchestrator/handlers/git.js +4 -3
  55. package/dist/lib/orchestrator/handlers/git.js.map +1 -1
  56. package/dist/lib/orchestrator/worktree.d.ts +2 -0
  57. package/dist/lib/orchestrator/worktree.js +1 -0
  58. package/dist/lib/orchestrator/worktree.js.map +1 -1
  59. package/dist/lib/workspace/mirror-lease.d.ts +10 -0
  60. package/dist/lib/workspace/mirror-lease.js +1 -0
  61. package/dist/lib/workspace/mirror-lease.js.map +1 -1
  62. package/dist/lib/workspace/mirror.d.ts +16 -0
  63. package/dist/lib/workspace/mirror.js +124 -22
  64. package/dist/lib/workspace/mirror.js.map +1 -1
  65. package/dist/lib/workspace/state-root.d.ts +8 -0
  66. package/dist/lib/workspace/state-root.js +11 -0
  67. package/dist/lib/workspace/state-root.js.map +1 -1
  68. package/dist/lib/workspace/stop-notice.d.ts +13 -1
  69. package/dist/lib/workspace/stop-notice.js +17 -2
  70. package/dist/lib/workspace/stop-notice.js.map +1 -1
  71. package/dist/lib/workspace/stop-save.d.ts +3 -0
  72. package/dist/lib/workspace/stop-save.js +39 -5
  73. package/dist/lib/workspace/stop-save.js.map +1 -1
  74. 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
- const STORE_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'harness-sessions');
25
- const SESSIONS_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'sessions');
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":"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"}
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