instar 1.3.1661 → 1.3.1663

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 (160) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +195 -30
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/ClaudeKeyHealth.d.ts +21 -0
  5. package/dist/core/ClaudeKeyHealth.d.ts.map +1 -1
  6. package/dist/core/ClaudeKeyHealth.js +81 -5
  7. package/dist/core/ClaudeKeyHealth.js.map +1 -1
  8. package/dist/core/MeshRpc.d.ts +14 -0
  9. package/dist/core/MeshRpc.d.ts.map +1 -1
  10. package/dist/core/MeshRpc.js +1 -0
  11. package/dist/core/MeshRpc.js.map +1 -1
  12. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  13. package/dist/core/PostUpdateMigrator.js +18 -0
  14. package/dist/core/PostUpdateMigrator.js.map +1 -1
  15. package/dist/core/SessionManager.d.ts.map +1 -1
  16. package/dist/core/SessionManager.js +8 -6
  17. package/dist/core/SessionManager.js.map +1 -1
  18. package/dist/core/SlackReplyRelayInstaller.d.ts.map +1 -1
  19. package/dist/core/SlackReplyRelayInstaller.js +2 -0
  20. package/dist/core/SlackReplyRelayInstaller.js.map +1 -1
  21. package/dist/core/StateManager.d.ts +8 -0
  22. package/dist/core/StateManager.d.ts.map +1 -1
  23. package/dist/core/StateManager.js +11 -0
  24. package/dist/core/StateManager.js.map +1 -1
  25. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  26. package/dist/core/WriteDomainRegistry.js +9 -0
  27. package/dist/core/WriteDomainRegistry.js.map +1 -1
  28. package/dist/core/claudeKeyRecovery.d.ts +102 -0
  29. package/dist/core/claudeKeyRecovery.d.ts.map +1 -0
  30. package/dist/core/claudeKeyRecovery.js +178 -0
  31. package/dist/core/claudeKeyRecovery.js.map +1 -0
  32. package/dist/core/memorySessionPolicy.d.ts +12 -0
  33. package/dist/core/memorySessionPolicy.d.ts.map +1 -1
  34. package/dist/core/memorySessionPolicy.js +20 -0
  35. package/dist/core/memorySessionPolicy.js.map +1 -1
  36. package/dist/core/pickSessionByTmux.d.ts +11 -0
  37. package/dist/core/pickSessionByTmux.d.ts.map +1 -0
  38. package/dist/core/pickSessionByTmux.js +11 -0
  39. package/dist/core/pickSessionByTmux.js.map +1 -0
  40. package/dist/core/types.d.ts +14 -0
  41. package/dist/core/types.d.ts.map +1 -1
  42. package/dist/core/types.js.map +1 -1
  43. package/dist/data/standards-guard-index.json +2 -2
  44. package/dist/data/standards-guard-index.meta.json +3 -3
  45. package/dist/data/standards-registry.md +12 -2
  46. package/dist/data/standards-registry.meta.json +3 -3
  47. package/dist/feedback-factory/execute/changeSet.d.ts.map +1 -1
  48. package/dist/feedback-factory/execute/changeSet.js +18 -1
  49. package/dist/feedback-factory/execute/changeSet.js.map +1 -1
  50. package/dist/feedback-factory/execute/executePolicy.d.ts +1 -1
  51. package/dist/feedback-factory/execute/executePolicy.d.ts.map +1 -1
  52. package/dist/feedback-factory/execute/executePolicy.js +2 -2
  53. package/dist/feedback-factory/execute/executePolicy.js.map +1 -1
  54. package/dist/messaging/SpawnRequestManager.d.ts +31 -0
  55. package/dist/messaging/SpawnRequestManager.d.ts.map +1 -1
  56. package/dist/messaging/SpawnRequestManager.js +149 -11
  57. package/dist/messaging/SpawnRequestManager.js.map +1 -1
  58. package/dist/messaging/TelegramAdapter.d.ts +11 -11
  59. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  60. package/dist/messaging/TelegramAdapter.js +59 -14
  61. package/dist/messaging/TelegramAdapter.js.map +1 -1
  62. package/dist/messaging/slack/SlackAdapter.d.ts +23 -0
  63. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  64. package/dist/messaging/slack/SlackAdapter.js +69 -0
  65. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  66. package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
  67. package/dist/native/instar-desktop-host +0 -0
  68. package/dist/scaffold/templates.d.ts.map +1 -1
  69. package/dist/scaffold/templates.js +9 -0
  70. package/dist/scaffold/templates.js.map +1 -1
  71. package/dist/server/AgentServer.d.ts +1 -0
  72. package/dist/server/AgentServer.d.ts.map +1 -1
  73. package/dist/server/AgentServer.js +1 -0
  74. package/dist/server/AgentServer.js.map +1 -1
  75. package/dist/server/routes.d.ts +4 -0
  76. package/dist/server/routes.d.ts.map +1 -1
  77. package/dist/server/routes.js +99 -4
  78. package/dist/server/routes.js.map +1 -1
  79. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  80. package/dist/testing/selfActionRegistry.js +48 -0
  81. package/dist/testing/selfActionRegistry.js.map +1 -1
  82. package/dist/threadline/A2ADeliveryTracker.d.ts +49 -0
  83. package/dist/threadline/A2ADeliveryTracker.d.ts.map +1 -1
  84. package/dist/threadline/A2ADeliveryTracker.js +81 -2
  85. package/dist/threadline/A2ADeliveryTracker.js.map +1 -1
  86. package/dist/threadline/InboundMessageGate.d.ts.map +1 -1
  87. package/dist/threadline/InboundMessageGate.js +12 -0
  88. package/dist/threadline/InboundMessageGate.js.map +1 -1
  89. package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
  90. package/dist/threadline/ThreadlineBootstrap.js +13 -2
  91. package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
  92. package/dist/threadline/ThreadlineEndpoints.d.ts.map +1 -1
  93. package/dist/threadline/ThreadlineEndpoints.js +9 -0
  94. package/dist/threadline/ThreadlineEndpoints.js.map +1 -1
  95. package/dist/threadline/ThreadlineMCPServer.d.ts +25 -1
  96. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  97. package/dist/threadline/ThreadlineMCPServer.js +38 -1
  98. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  99. package/dist/threadline/ThreadlineMcpHttpService.d.ts.map +1 -1
  100. package/dist/threadline/ThreadlineMcpHttpService.js +6 -2
  101. package/dist/threadline/ThreadlineMcpHttpService.js.map +1 -1
  102. package/dist/threadline/ThreadlineRouter.d.ts +17 -1
  103. package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
  104. package/dist/threadline/ThreadlineRouter.js +22 -2
  105. package/dist/threadline/ThreadlineRouter.js.map +1 -1
  106. package/dist/threadline/TopicLinkageHandler.d.ts +9 -0
  107. package/dist/threadline/TopicLinkageHandler.d.ts.map +1 -1
  108. package/dist/threadline/TopicLinkageHandler.js +13 -2
  109. package/dist/threadline/TopicLinkageHandler.js.map +1 -1
  110. package/dist/threadline/autoAck.d.ts +37 -21
  111. package/dist/threadline/autoAck.d.ts.map +1 -1
  112. package/dist/threadline/autoAck.js +34 -19
  113. package/dist/threadline/autoAck.js.map +1 -1
  114. package/dist/threadline/client/MessageEncryptor.d.ts +5 -0
  115. package/dist/threadline/client/MessageEncryptor.d.ts.map +1 -1
  116. package/dist/threadline/client/MessageEncryptor.js.map +1 -1
  117. package/dist/threadline/client/ThreadlineClient.d.ts +26 -0
  118. package/dist/threadline/client/ThreadlineClient.d.ts.map +1 -1
  119. package/dist/threadline/client/ThreadlineClient.js +70 -4
  120. package/dist/threadline/client/ThreadlineClient.js.map +1 -1
  121. package/dist/threadline/inboundIdLedgerWiring.d.ts.map +1 -1
  122. package/dist/threadline/inboundIdLedgerWiring.js +4 -1
  123. package/dist/threadline/inboundIdLedgerWiring.js.map +1 -1
  124. package/dist/threadline/mcp-http-client.d.ts +11 -0
  125. package/dist/threadline/mcp-http-client.d.ts.map +1 -1
  126. package/dist/threadline/mcp-http-client.js +34 -0
  127. package/dist/threadline/mcp-http-client.js.map +1 -1
  128. package/dist/threadline/mcp-stdio-entry.js +4 -1
  129. package/dist/threadline/mcp-stdio-entry.js.map +1 -1
  130. package/dist/threadline/requiredAck.d.ts +64 -0
  131. package/dist/threadline/requiredAck.d.ts.map +1 -0
  132. package/dist/threadline/requiredAck.js +117 -0
  133. package/dist/threadline/requiredAck.js.map +1 -0
  134. package/dist/threadline/requiredAckService.d.ts +223 -0
  135. package/dist/threadline/requiredAckService.d.ts.map +1 -0
  136. package/dist/threadline/requiredAckService.js +565 -0
  137. package/dist/threadline/requiredAckService.js.map +1 -0
  138. package/dist/threadline/requiredAckStore.d.ts +149 -0
  139. package/dist/threadline/requiredAckStore.d.ts.map +1 -0
  140. package/dist/threadline/requiredAckStore.js +283 -0
  141. package/dist/threadline/requiredAckStore.js.map +1 -0
  142. package/package.json +1 -1
  143. package/src/data/builtin-manifest.json +66 -66
  144. package/src/data/feature-ladders.json +3 -1
  145. package/src/data/standards-guard-index.json +2 -2
  146. package/src/data/standards-guard-index.meta.json +3 -3
  147. package/src/data/standards-registry.md +12 -2
  148. package/src/data/standards-registry.meta.json +3 -3
  149. package/src/scaffold/templates.ts +9 -0
  150. package/src/templates/scripts/slack-reply.sh +7 -0
  151. package/upgrades/1.3.1663.md +77 -0
  152. package/upgrades/cloud-key-recovery-reply.eli16.md +19 -0
  153. package/upgrades/side-effects/a2a-required-acknowledgment.md +130 -0
  154. package/upgrades/side-effects/agent-health-quiet-default.md +74 -0
  155. package/upgrades/side-effects/cloud-key-recovery-reply.md +141 -0
  156. package/upgrades/side-effects/feedback-changeset-byte-cap-calibration.md +60 -0
  157. package/upgrades/side-effects/memory-privacy-ladder-off-by-default.md +100 -0
  158. package/upgrades/side-effects/memory-privacy-linux-replies.md +109 -0
  159. package/upgrades/side-effects/person-decides-counterpart.md +62 -0
  160. package/upgrades/side-effects/session-by-tmux.md +48 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * claudeKeyRecovery — what a conversation restarted after a dead sign-in key is told, and how we
3
+ * check it answered (follow-up to spec cloud-key-internal-calls, Part 2; upgrades/side-effects/cloud-key-recovery-reply.md).
4
+ *
5
+ * The 2026-11-04 nimbus drill: the restarted sessions got a bare prompt with no reply command and
6
+ * no copy of the held messages. Both posted their channel id as the reply; one person's messages
7
+ * were never answered while the restart reported success. So the prompt now carries the held
8
+ * messages and the exact reply command, and success means an answer seen in the conversation.
9
+ *
10
+ * Pure: no I/O, so both platforms and both sides of every decision are unit-tested.
11
+ */
12
+ /** A Slack id the agent printed instead of a reply. Never counts as an answer. */
13
+ const BARE_CHANNEL_ID = /^\s*[CDG](?=[A-Z0-9]*[0-9])[A-Z0-9]{8,11}\s*$/;
14
+ function isFixedNotice(text, fixedTexts) {
15
+ const t = text.trim();
16
+ return fixedTexts.some((f) => f.trim() === t || t.startsWith(f.trim()));
17
+ }
18
+ /** An agent line that is a real reply: not one of the server's fixed notices, not a bare id. */
19
+ function isRealAgentReply(line, fixedTexts) {
20
+ return line.fromAgent && line.text.trim().length > 0 && !BARE_CHANNEL_ID.test(line.text) && !isFixedNotice(line.text, fixedTexts);
21
+ }
22
+ /**
23
+ * Messages from people after the agent's last real reply. The server's own key notices don't
24
+ * count as replies: they say the agent can't answer, so what came before them is still held.
25
+ */
26
+ export function heldMessages(lines, fixedTexts) {
27
+ const sorted = [...lines].sort((a, b) => a.at - b.at);
28
+ let lastReply = -1;
29
+ sorted.forEach((line, i) => { if (isRealAgentReply(line, fixedTexts))
30
+ lastReply = i; });
31
+ return sorted.slice(lastReply + 1)
32
+ .filter((l) => !l.fromAgent && l.text.trim().length > 0)
33
+ .map((l) => ({ who: l.who, text: l.text, at: l.at }));
34
+ }
35
+ /** True once the agent wrote a real reply after `sinceMs`. */
36
+ export function answeredSince(lines, sinceMs, fixedTexts) {
37
+ return lines.some((l) => l.at >= sinceMs && isRealAgentReply(l, fixedTexts));
38
+ }
39
+ /**
40
+ * A Slack conversation as lines. Only this agent's bot user is the agent (another bot answering is
41
+ * not a reply), and of its posts only a session's count: the server's own (standby notes,
42
+ * notices) come from the same bot user and are nobody answering. Only the agent's authorized
43
+ * people are waiting. Everything else is left out.
44
+ */
45
+ export function slackConversationLines(messages, opts) {
46
+ const lines = [];
47
+ for (const m of messages) {
48
+ if (m.unaddressed)
49
+ continue;
50
+ if (m.subtype && !['thread_broadcast', 'file_share', 'bot_message'].includes(m.subtype))
51
+ continue;
52
+ const at = Math.round(parseFloat(m.ts) * 1000);
53
+ if (!Number.isFinite(at))
54
+ continue;
55
+ const fromAgent = opts.botUserId !== null ? m.user === opts.botUserId : Boolean(m.bot_id);
56
+ if (fromAgent) {
57
+ if (!opts.isServerPost(m.ts))
58
+ lines.push({ at, fromAgent: true, who: 'agent', text: m.text ?? '' });
59
+ continue;
60
+ }
61
+ if (!m.bot_id && m.user && opts.isPerson(m.user))
62
+ lines.push({ at, fromAgent: false, who: m.user, text: m.text ?? '' });
63
+ }
64
+ return lines;
65
+ }
66
+ /** The reply command for this conversation, exactly as the agent should run it. */
67
+ export function replyCommand(channel) {
68
+ if (channel.platform === 'slack') {
69
+ // A bound Slack session's binding picks the destination: no channel argument.
70
+ return ["cat <<'EOF' | .instar/scripts/slack-reply.sh", 'Your reply here', 'EOF'];
71
+ }
72
+ return [`cat <<'EOF' | .instar/scripts/telegram-reply.sh ${channel.topicId}`, 'Your reply here', 'EOF'];
73
+ }
74
+ const MAX_HELD = 20;
75
+ const MAX_HELD_CHARS = 2000;
76
+ /**
77
+ * The prompt a restarted conversation gets, with the held messages quoted and the reply command
78
+ * spelled out. A Slack prompt carries the `[slack:<channel>]` tag of an ordinary inbound message.
79
+ */
80
+ export function buildKeyRecoveryPrompt(channel, held) {
81
+ // The Telegram respawn tags the message itself; the Slack respawn passes it through as is.
82
+ const tag = channel.platform === 'slack' ? `[slack:${channel.channelId}] ` : '';
83
+ const lines = [
84
+ `${tag}Your sign-in key stopped working for a while and has now been fixed. ` +
85
+ 'Messages sent during that time were not answered.',
86
+ '',
87
+ ];
88
+ const shown = held.slice(-MAX_HELD);
89
+ if (shown.length > 0) {
90
+ lines.push(`Messages still waiting for your answer (${shown.length}${held.length > shown.length ? ` of ${held.length}` : ''}, oldest first):`);
91
+ for (const m of shown) {
92
+ const text = m.text.length > MAX_HELD_CHARS ? `${m.text.slice(0, MAX_HELD_CHARS)}…` : m.text;
93
+ lines.push(`- ${new Date(m.at).toISOString()} ${m.who}: ${text}`);
94
+ }
95
+ lines.push('', 'Answer each of them now, in this conversation. One reply may cover several.');
96
+ }
97
+ else {
98
+ lines.push('Read the conversation and answer anything still unanswered. If nothing is waiting, send nothing.');
99
+ }
100
+ lines.push('', 'Your reply only reaches the person through this command. Write the reply text only:', ...replyCommand(channel));
101
+ if (channel.platform === 'slack') {
102
+ lines.push('Do not pass a channel id to the script: this session is already bound to the conversation.');
103
+ }
104
+ return lines.join('\n');
105
+ }
106
+ /**
107
+ * Send a fixed notice so a person can read it. True only when someone who reads it got it: the
108
+ * Telegram attention topic, a Slack alert channel with one of the agent's people in it, or a
109
+ * direct message. A post to an alert channel nobody is in is kept as a record but is not "told"
110
+ * (2026-11-04 drill: the notice went to an empty channel and the person text said "My operator
111
+ * has been told").
112
+ */
113
+ export async function deliverOperatorNotice(routes, text) {
114
+ const warn = routes.warn ?? (() => { });
115
+ const why = (err) => (err instanceof Error ? err.message : String(err));
116
+ let delivered = false;
117
+ if (routes.telegram) {
118
+ try {
119
+ await routes.telegram(text);
120
+ delivered = true;
121
+ }
122
+ catch (err) { /* @silent-fallback-ok: `delivered` stays false, which drives the retry and its capped report */
123
+ warn(`Telegram notice failed: ${why(err)}`);
124
+ }
125
+ }
126
+ const slack = routes.slack;
127
+ if (!slack)
128
+ return delivered;
129
+ let channelRead = false;
130
+ if (slack.attentionChannel) {
131
+ let readers = null;
132
+ try {
133
+ readers = await slack.readersOf(slack.attentionChannel);
134
+ }
135
+ catch (err) { /* @silent-fallback-ok: unknown readers means the direct messages below still go */
136
+ warn(`could not read the alert channel's members: ${why(err)}`);
137
+ }
138
+ // A channel known to have none of the operators in it is skipped: a post there reaches
139
+ // nobody, and every retry would repeat it.
140
+ if (readers === null || readers.length > 0) {
141
+ try {
142
+ await slack.post(slack.attentionChannel, text);
143
+ channelRead = readers !== null;
144
+ }
145
+ catch (err) { /* @silent-fallback-ok: `channelRead` stays false, so the direct messages below go */
146
+ warn(`Slack notice failed: ${why(err)}`);
147
+ }
148
+ }
149
+ }
150
+ if (channelRead)
151
+ return true;
152
+ if (delivered)
153
+ return true; // Telegram reached the operator: no need to message people directly too
154
+ for (const userId of slack.people()) {
155
+ try {
156
+ await slack.directMessage(userId, text);
157
+ delivered = true;
158
+ }
159
+ catch (err) { /* @silent-fallback-ok: `delivered` stays false unless another person was reached */
160
+ warn(`direct message failed: ${why(err)}`);
161
+ }
162
+ }
163
+ return delivered;
164
+ }
165
+ /** Above this many authorized people with no owner or admin among them, nobody is messaged directly. */
166
+ export const MAX_UNRANKED_OPERATORS = 3;
167
+ /**
168
+ * Who the operator is on Slack: the authorized people whose user profile is an owner or admin.
169
+ * With no ranked profile, a small authorized list (a personal agent: the operator and perhaps a
170
+ * partner) stands in; a large one is a team, where a direct message to everyone is spam.
171
+ */
172
+ export function operatorSlackIds(authorized, profiles) {
173
+ const ranked = authorized.filter((id) => profiles.some((p) => p.slackUserId === id && (p.role === 'owner' || p.role === 'admin')));
174
+ if (ranked.length > 0)
175
+ return ranked;
176
+ return authorized.length <= MAX_UNRANKED_OPERATORS ? [...authorized] : [];
177
+ }
178
+ //# sourceMappingURL=claudeKeyRecovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeKeyRecovery.js","sourceRoot":"","sources":["../../src/core/claudeKeyRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,kFAAkF;AAClF,MAAM,eAAe,GAAG,+CAA+C,CAAC;AAExE,SAAS,aAAa,CAAC,IAAY,EAAE,UAA6B;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,gGAAgG;AAChG,SAAS,gBAAgB,CAAC,IAAsB,EAAE,UAA6B;IAC7E,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACpI,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAkC,EAAE,UAA6B;IAC5F,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IACtD,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC;QAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,aAAa,CAAC,KAAkC,EAAE,OAAe,EAAE,UAA6B;IAC9G,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,IAAI,gBAAgB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AAC/E,CAAC;AAKD;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAmC,EACnC,IAAgH;IAEhH,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,WAAW;YAAE,SAAS;QAC5B,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,kBAAkB,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS;QAClG,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,SAAS;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1F,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YACpG,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1H,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAMD,mFAAmF;AACnF,MAAM,UAAU,YAAY,CAAC,OAAwB;IACnD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,8EAA8E;QAC9E,OAAO,CAAC,8CAA8C,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,mDAAmD,OAAO,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,KAAK,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAwB,EAAE,IAA4B;IAC3F,2FAA2F;IAC3F,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAChF,MAAM,KAAK,GAAa;QACtB,GAAG,GAAG,uEAAuE;YAC3E,mDAAmD;QACrD,EAAE;KACH,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,2CAA2C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAC/I,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7F,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,6EAA6E,CAAC,CAAC;IAChG,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,kGAAkG,CAAC,CAAC;IACjH,CAAC;IACD,KAAK,CAAC,IAAI,CACR,EAAE,EACF,qFAAqF,EACrF,GAAG,YAAY,CAAC,OAAO,CAAC,CACzB,CAAC;IACF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAiBD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAA4B,EAAE,IAAY;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;QACtD,OAAO,GAAG,EAAE,CAAC,CAAC,gGAAgG;YAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC/J,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAoB,IAAI,CAAC;QACpC,IAAI,CAAC;YAAC,OAAO,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAAC,CAAC;QAChE,OAAO,GAAG,EAAE,CAAC,CAAC,mFAAmF;YAAC,IAAI,CAAC,+CAA+C,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QACpK,uFAAuF;QACvF,2CAA2C;QAC3C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;gBAC/C,WAAW,GAAG,OAAO,KAAK,IAAI,CAAC;YACjC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC,CAAC,qFAAqF;gBAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QACnJ,CAAC;IACH,CAAC;IACD,IAAI,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC,CAAC,wEAAwE;IACpG,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC;YAAC,MAAM,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;QAClE,OAAO,GAAG,EAAE,CAAC,CAAC,oFAAoF;YAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAClJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wGAAwG;AACxG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAA6B,EAC7B,QAA+D;IAE/D,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACnI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,UAAU,CAAC,MAAM,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5E,CAAC"}
@@ -26,6 +26,18 @@ export interface MemorySessionPaths {
26
26
  tempRoots: readonly string[];
27
27
  }
28
28
  export declare function buildMemorySessionSettings(p: MemorySessionPaths): Record<string, unknown>;
29
+ /**
30
+ * Linux only: let the session's curl reach the agent server. bubblewrap gives the
31
+ * session its own network namespace, so localhost inside it is not the agent's
32
+ * server, and the sandbox's NO_PROXY sends localhost past the proxy that could
33
+ * carry it. Every reply script uses plain curl, so a curl config that clears
34
+ * NO_PROXY sends localhost through the sandbox proxy, which allows it (it is in
35
+ * allowedDomains). Reach is the same as on macOS, where the session shares the
36
+ * host's loopback. Measured with Claude Code 2.1.318 on Ubuntu 24.04: without
37
+ * this, curl exit 7; with it, HTTP 200 from the server and outside hosts unchanged.
38
+ * Returns the folder to pass as CURL_HOME, or null where nothing is needed.
39
+ */
40
+ export declare function prepareSessionCurlHome(scopeDir: string, platform?: NodeJS.Platform): string | null;
29
41
  /** `--allowedTools` entries: the plain tools, and file tools on the scope folder only. */
30
42
  export declare function memorySessionAllowedTools(scopeDir: string): string[];
31
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"memorySessionPolicy.d.ts","sourceRoot":"","sources":["../../src/core/memorySessionPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,eAAO,MAAM,oBAAoB,YAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAU,CAAC;AAQ9H,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,8CAA8C;IAC9C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,sDAAsD;IACtD,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAID,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiCzF;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAOpE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgBrG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAqBpI"}
1
+ {"version":3,"file":"memorySessionPolicy.d.ts","sourceRoot":"","sources":["../../src/core/memorySessionPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,eAAO,MAAM,oBAAoB,YAAI,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,CAAU,CAAC;AAQ9H,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,8CAA8C;IAC9C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,sDAAsD;IACtD,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAID,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiCzF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,GAAG,IAAI,CAOpH;AAED,0FAA0F;AAC1F,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAOpE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAgBrG;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAqBpI"}
@@ -57,6 +57,26 @@ export function buildMemorySessionSettings(p) {
57
57
  },
58
58
  };
59
59
  }
60
+ /**
61
+ * Linux only: let the session's curl reach the agent server. bubblewrap gives the
62
+ * session its own network namespace, so localhost inside it is not the agent's
63
+ * server, and the sandbox's NO_PROXY sends localhost past the proxy that could
64
+ * carry it. Every reply script uses plain curl, so a curl config that clears
65
+ * NO_PROXY sends localhost through the sandbox proxy, which allows it (it is in
66
+ * allowedDomains). Reach is the same as on macOS, where the session shares the
67
+ * host's loopback. Measured with Claude Code 2.1.318 on Ubuntu 24.04: without
68
+ * this, curl exit 7; with it, HTTP 200 from the server and outside hosts unchanged.
69
+ * Returns the folder to pass as CURL_HOME, or null where nothing is needed.
70
+ */
71
+ export function prepareSessionCurlHome(scopeDir, platform = process.platform) {
72
+ if (platform !== 'linux')
73
+ return null;
74
+ const curlHome = path.join(scopeDir, '.curl');
75
+ fs.mkdirSync(curlHome, { recursive: true, mode: 0o700 });
76
+ // Rewritten at every spawn: the folder is the session's own, so it may have changed it.
77
+ fs.writeFileSync(path.join(curlHome, '.curlrc'), 'noproxy = ""\n', { mode: 0o600 });
78
+ return curlHome;
79
+ }
60
80
  /** `--allowedTools` entries: the plain tools, and file tools on the scope folder only. */
61
81
  export function memorySessionAllowedTools(scopeDir) {
62
82
  return [
@@ -1 +1 @@
1
- {"version":3,"file":"memorySessionPolicy.js","sourceRoot":"","sources":["../../src/core/memorySessionPolicy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memorySessionPolicy.js","sourceRoot":"","sources":["../../src/core/memorySessionPolicy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A tmux name is reused when a conversation comes back to a machine, so several session
3
+ * records can carry one name. The live one is the one callers mean: a running record
4
+ * wins, otherwise the newest. Never reorders the caller's list.
5
+ */
6
+ export declare function pickSessionByTmux<T extends {
7
+ tmuxSession: string;
8
+ status?: string;
9
+ startedAt?: string;
10
+ }>(records: readonly T[], tmuxSession: string): T | undefined;
11
+ //# sourceMappingURL=pickSessionByTmux.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickSessionByTmux.d.ts","sourceRoot":"","sources":["../../src/core/pickSessionByTmux.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACtG,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,CAAC,GAAG,SAAS,CAIf"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A tmux name is reused when a conversation comes back to a machine, so several session
3
+ * records can carry one name. The live one is the one callers mean: a running record
4
+ * wins, otherwise the newest. Never reorders the caller's list.
5
+ */
6
+ export function pickSessionByTmux(records, tmuxSession) {
7
+ const matches = records.filter((s) => s.tmuxSession === tmuxSession);
8
+ return matches.find((s) => s.status === 'running')
9
+ ?? matches.sort((x, y) => String(y.startedAt ?? '').localeCompare(String(x.startedAt ?? '')))[0];
10
+ }
11
+ //# sourceMappingURL=pickSessionByTmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pickSessionByTmux.js","sourceRoot":"","sources":["../../src/core/pickSessionByTmux.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAqB,EACrB,WAAmB;IAEnB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;WAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrG,CAAC"}
@@ -5816,6 +5816,20 @@ export interface ThreadlineListenerConfig {
5816
5816
  export interface ThreadlineConfig {
5817
5817
  /** Whether cloud relay is enabled (default: false, opt-in) */
5818
5818
  relayEnabled: boolean;
5819
+ /**
5820
+ * A sender is never left guessing (docs/specs/a2a-required-acknowledgment.md).
5821
+ * On unless `enabled: false`, which turns off sending, watching and the instruction;
5822
+ * inbound kinded acks are always consumed safely.
5823
+ */
5824
+ requiredAck?: {
5825
+ enabled?: boolean;
5826
+ /** Reminder to an interactive session. Default 5 minutes. */
5827
+ reminderMs?: number;
5828
+ /** Tell the sender `unacknowledged`. Default 15 minutes. */
5829
+ attentionMs?: number;
5830
+ /** Reminders per peer per day. Default 20. */
5831
+ reminderDailyCap?: number;
5832
+ };
5819
5833
  /** Cloud relay URL (default: 'wss://threadline-relay.fly.dev/v1/connect') */
5820
5834
  relayUrl?: string;
5821
5835
  /** Agent visibility on the relay network: 'public' (discoverable), 'unlisted' (direct only), 'private' (no relay) */