cli-jaw 2.17.72 → 2.17.73

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 (169) hide show
  1. package/README.md +16 -0
  2. package/dist/src/agent/aside-catalog.js +339 -0
  3. package/dist/src/agent/aside-catalog.js.map +1 -0
  4. package/dist/src/agent/aside-cli.js +208 -0
  5. package/dist/src/agent/aside-cli.js.map +1 -0
  6. package/dist/src/agent/aside-replay.js +120 -0
  7. package/dist/src/agent/aside-replay.js.map +1 -0
  8. package/dist/src/agent/aside-runtime.js +175 -0
  9. package/dist/src/agent/aside-runtime.js.map +1 -0
  10. package/dist/src/agent/lifecycle-handler.js +26 -18
  11. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  12. package/dist/src/agent/memory-flush-controller.js +3 -0
  13. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  14. package/dist/src/agent/prompt-context.js +2 -2
  15. package/dist/src/agent/prompt-context.js.map +1 -1
  16. package/dist/src/agent/session-persistence.js +2 -0
  17. package/dist/src/agent/session-persistence.js.map +1 -1
  18. package/dist/src/agent/spawn/backend-aside.js +314 -0
  19. package/dist/src/agent/spawn/backend-aside.js.map +1 -0
  20. package/dist/src/agent/spawn/resume.js +3 -0
  21. package/dist/src/agent/spawn/resume.js.map +1 -1
  22. package/dist/src/agent/spawn-env.js +5 -0
  23. package/dist/src/agent/spawn-env.js.map +1 -1
  24. package/dist/src/agent/spawn.js +60 -6
  25. package/dist/src/agent/spawn.js.map +1 -1
  26. package/dist/src/cli/cli-status-worker.js +2 -1
  27. package/dist/src/cli/cli-status-worker.js.map +1 -1
  28. package/dist/src/cli/employee-handler.js +2 -0
  29. package/dist/src/cli/employee-handler.js.map +1 -1
  30. package/dist/src/cli/handlers-completions.js +20 -8
  31. package/dist/src/cli/handlers-completions.js.map +1 -1
  32. package/dist/src/cli/handlers-runtime.js +2 -0
  33. package/dist/src/cli/handlers-runtime.js.map +1 -1
  34. package/dist/src/cli/readiness.js +7 -3
  35. package/dist/src/cli/readiness.js.map +1 -1
  36. package/dist/src/cli/registry-live.js +47 -0
  37. package/dist/src/cli/registry-live.js.map +1 -1
  38. package/dist/src/cli/registry.js +5 -0
  39. package/dist/src/cli/registry.js.map +1 -1
  40. package/dist/src/core/config.js +10 -3
  41. package/dist/src/core/config.js.map +1 -1
  42. package/dist/src/core/employees.js +5 -3
  43. package/dist/src/core/employees.js.map +1 -1
  44. package/dist/src/core/settings-merge.js +35 -0
  45. package/dist/src/core/settings-merge.js.map +1 -1
  46. package/dist/src/core/settings-watch.js +10 -1
  47. package/dist/src/core/settings-watch.js.map +1 -1
  48. package/dist/src/orchestrator/gateway.js +2 -0
  49. package/dist/src/orchestrator/gateway.js.map +1 -1
  50. package/dist/src/routes/employees.js +8 -0
  51. package/dist/src/routes/employees.js.map +1 -1
  52. package/dist/src/routes/jaw-memory.js +4 -0
  53. package/dist/src/routes/jaw-memory.js.map +1 -1
  54. package/dist/src/routes/orchestrate.js +22 -3
  55. package/dist/src/routes/orchestrate.js.map +1 -1
  56. package/dist/src/routes/settings.js +23 -0
  57. package/dist/src/routes/settings.js.map +1 -1
  58. package/dist/src/shared/aside-contract.js +2 -0
  59. package/dist/src/shared/aside-contract.js.map +1 -0
  60. package/dist/src/types/cli-engine.js +1 -0
  61. package/dist/src/types/cli-engine.js.map +1 -1
  62. package/package.json +1 -1
  63. package/public/dist/.vite/manifest.json +186 -175
  64. package/public/dist/assets/{Activity-DPLlOJ46.js → Activity-DsBgOkCP.js} +1 -1
  65. package/public/dist/assets/{AdvancedExport-BgOgGvc5.js → AdvancedExport-COGQ7vbK.js} +1 -1
  66. package/public/dist/assets/Agent-6qGQN7lY.js +1 -0
  67. package/public/dist/assets/AsideSelectionFields-DvU5xWAP.js +1 -0
  68. package/public/dist/assets/{Browser-m6VynQXV.js → Browser-r09vOsR1.js} +1 -1
  69. package/public/dist/assets/ChannelEnablementControl-ooOkdd-Q.js +85 -0
  70. package/public/dist/assets/{ChannelSetupEntry-DHLoZEzJ.js → ChannelSetupEntry-B0b4TdhH.js} +1 -1
  71. package/public/dist/assets/{ChannelsDiscord-B-G8vsYy.js → ChannelsDiscord-9EMLt5b3.js} +1 -1
  72. package/public/dist/assets/{ChannelsSlack-oPuh922z.js → ChannelsSlack-B8ETzWFt.js} +1 -1
  73. package/public/dist/assets/{ChannelsTelegram-PmTv43KQ.js → ChannelsTelegram-CflLUsQw.js} +1 -1
  74. package/public/dist/assets/{DashboardMeta-BqEiJrvr.js → DashboardMeta-wjEuh9-E.js} +1 -1
  75. package/public/dist/assets/{Developer-CbySB7_Z.js → Developer-B3cDkldo.js} +1 -1
  76. package/public/dist/assets/{Display-DU4_76cS.js → Display-BXQxpv6-.js} +1 -1
  77. package/public/dist/assets/{Display-C0Zdamcb.js → Display-Cl4DD334.js} +1 -1
  78. package/public/dist/assets/{Embedding-CCFMOB_2.js → Embedding-D-T92-En.js} +1 -1
  79. package/public/dist/assets/{Employees-BanvF58d.js → Employees-Cf4IeF0N.js} +1 -1
  80. package/public/dist/assets/{Heartbeat-uyi_MpUd.js → Heartbeat-Bj8V_bUM.js} +1 -1
  81. package/public/dist/assets/{Mcp-rjPoL_Zo.js → Mcp-jAcut_fw.js} +1 -1
  82. package/public/dist/assets/Memory-BOXkBFKg.js +1 -0
  83. package/public/dist/assets/ModelProvider-DIDQ37z-.js +1 -0
  84. package/public/dist/assets/{Network-CuqFrOvR.js → Network-I5eOe2hf.js} +1 -1
  85. package/public/dist/assets/{Permissions-BltXiZnz.js → Permissions-B7PthH01.js} +1 -1
  86. package/public/dist/assets/{Permissions-DcCbFMIq.js → Permissions-BCYUfJg1.js} +1 -1
  87. package/public/dist/assets/Profile-CYPMVhQM.js +1 -0
  88. package/public/dist/assets/{Prompts-C9vY8ivQ.js → Prompts-BRAgZLNQ.js} +1 -1
  89. package/public/dist/assets/{SpeechKeys-BJ8V7U5E.js → SpeechKeys-UlXNSFoe.js} +1 -1
  90. package/public/dist/assets/{TelegramHub-DtyjLGFR.js → TelegramHub-BhUFhIcv.js} +1 -1
  91. package/public/dist/assets/agent-meta-v4jNRAbX.js +1 -0
  92. package/public/dist/assets/app-SVIyP1TT.js +59 -0
  93. package/public/dist/assets/bgtask-badge-HIrvpcr_.js +1 -0
  94. package/public/dist/assets/{bgtask-badge-oPvZyylH.js → bgtask-badge-tYRnplEV.js} +1 -1
  95. package/public/dist/assets/constants-_iw-lnKY.js +1 -0
  96. package/public/dist/assets/{employees-BchFBkDz.js → employees-DNTPcxtZ.js} +2 -2
  97. package/public/dist/assets/{error-normalize-clOi-AAA.js → error-normalize-jnjrKZDu.js} +1 -1
  98. package/public/dist/assets/{iframe-renderer-CcGzEi0v.js → iframe-renderer--lHbKTDh.js} +2 -2
  99. package/public/dist/assets/iframe-renderer-DigNC5FU.js +1 -0
  100. package/public/dist/assets/{manager-nquYZ7_x.js → manager-qGH-xUZ7.js} +1 -1
  101. package/public/dist/assets/{memory-DTpD4see.js → memory-BAdRkBdk.js} +1 -1
  102. package/public/dist/assets/memory-DA8x5314.js +1 -0
  103. package/public/dist/assets/message-history-CGOgZH4l.js +1 -0
  104. package/public/dist/assets/{message-history-DSvflaZ9.js → message-history-PAYeKmia.js} +1 -1
  105. package/public/dist/assets/page-shell-Cz2ylri8.js +1 -0
  106. package/public/dist/assets/{render-D8dVQ_bm.js → render-F6xF6w6c.js} +1 -1
  107. package/public/dist/assets/settings-DMbNzuTm.js +1 -0
  108. package/public/dist/assets/{settings-DMiQe469.js → settings-DZ2-ca8T.js} +1 -1
  109. package/public/dist/assets/{settings-Bp0sgQ2a.js → settings-W0WFhBf2.js} +1 -1
  110. package/public/dist/assets/settings-core-2vZXNf6n.js +2 -0
  111. package/public/dist/assets/settings-core-BofMyzL9.js +1 -0
  112. package/public/dist/assets/{settings-embedding-BRW0WZvh.js → settings-embedding-Bjwpe8xu.js} +2 -2
  113. package/public/dist/assets/{shared-D1begqvi.js → shared-CftvKNY9.js} +1 -1
  114. package/public/dist/assets/{sidebar-CrpBbYFg.js → sidebar-Clkqd78q.js} +3 -3
  115. package/public/dist/assets/{skills-Bx8U-gJa.js → skills-0aA-RuN9.js} +1 -1
  116. package/public/dist/assets/skills-SqmQXndw.js +1 -0
  117. package/public/dist/assets/{slash-commands-DkrGUOnC.js → slash-commands-4zHHXEeU.js} +1 -1
  118. package/public/dist/assets/slash-commands-D5LqONzL.js +1 -0
  119. package/public/dist/assets/{trace-drawer-Dbe5pTbf.js → trace-drawer-B4O0Tl1M.js} +1 -1
  120. package/public/dist/assets/{ui-rnVAM91F.js → ui-CVtGpivr.js} +1 -1
  121. package/public/dist/assets/ui-_cqgseFX.js +1 -0
  122. package/public/dist/index.html +1 -1
  123. package/public/dist/manager/index.html +1 -1
  124. package/public/dist/settings/index.html +1 -1
  125. package/public/js/constants.ts +5 -0
  126. package/public/js/features/employees.ts +3 -3
  127. package/public/js/features/heartbeat.ts +14 -1
  128. package/public/js/features/settings-core.ts +39 -13
  129. package/public/js/features/settings-types.ts +1 -1
  130. package/public/locales/en.json +2 -0
  131. package/public/locales/ja.json +2 -0
  132. package/public/locales/ko.json +2 -0
  133. package/public/locales/zh.json +2 -0
  134. package/public/manager/src/settings/SettingsShell.tsx +1 -1
  135. package/public/manager/src/settings/pages/Agent.tsx +137 -52
  136. package/public/manager/src/settings/pages/Heartbeat.tsx +6 -0
  137. package/public/manager/src/settings/pages/Memory.tsx +8 -6
  138. package/public/manager/src/settings/pages/ModelProvider.tsx +31 -6
  139. package/public/manager/src/settings/pages/Profile.tsx +2 -2
  140. package/public/manager/src/settings/pages/components/AsideSelectionFields.tsx +33 -0
  141. package/public/manager/src/settings/pages/components/AvatarCard.tsx +22 -34
  142. package/public/manager/src/settings/pages/components/PerCliRow.tsx +29 -1
  143. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +7 -6
  144. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +4 -4
  145. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +5 -0
  146. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -0
  147. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +3 -2
  148. package/public/manager/src/settings/pages/components/aside-models.ts +104 -0
  149. package/public/manager/src/settings/settings-client.ts +3 -1
  150. package/public/manager/src/settings/types.ts +1 -0
  151. package/public/dist/assets/Agent-O_U8ny90.js +0 -1
  152. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +0 -85
  153. package/public/dist/assets/Memory-C9I33pIi.js +0 -1
  154. package/public/dist/assets/ModelProvider-fiUktMaO.js +0 -1
  155. package/public/dist/assets/Profile-DUL7-RE_.js +0 -1
  156. package/public/dist/assets/agent-meta-94LMwZZK.js +0 -1
  157. package/public/dist/assets/app-Iu76iEiU.js +0 -59
  158. package/public/dist/assets/bgtask-badge-DHo2mkMI.js +0 -1
  159. package/public/dist/assets/constants-DmZ9Rjym.js +0 -1
  160. package/public/dist/assets/iframe-renderer-DSLsfZq8.js +0 -1
  161. package/public/dist/assets/memory-BgUF3M9l.js +0 -1
  162. package/public/dist/assets/message-history-DkB768L3.js +0 -1
  163. package/public/dist/assets/page-shell-DfinU3mb.js +0 -1
  164. package/public/dist/assets/settings-DxjoyiIM.js +0 -1
  165. package/public/dist/assets/settings-core-CXWmPKUE.js +0 -1
  166. package/public/dist/assets/settings-core-D4zGy72z.js +0 -2
  167. package/public/dist/assets/skills-BY-hQnqM.js +0 -1
  168. package/public/dist/assets/slash-commands-C53T9J3g.js +0 -1
  169. package/public/dist/assets/ui-C0o427q6.js +0 -1
package/README.md CHANGED
@@ -619,3 +619,19 @@ Public code and product docs live here. Private planning and history live only i
619
619
  <p align="center"><a href="LICENSE"><b>MIT License</b></a> · Built by developers who got tired of tab-switching between AI apps.</p>
620
620
 
621
621
 
622
+
623
+
624
+ ### Aside (experimental)
625
+
626
+ Select Aside in Settings → Agent, then enter the local account ID and select a
627
+ registered model. Model defaults uses the same account-scoped controls. You can also
628
+ configure the explicit account selector:
629
+ `perCli.aside = { "account": "u0", "host": "local", "model": "default", "effort": "default" }`.
630
+ Catalog discovery reads only that account's allowlisted local model metadata; installed
631
+ binary detection does not verify authentication. Safe uses guard; Auto uses full-access.
632
+ Workers, memory flush, images, native Code and automatic retry/fallback are unsupported.
633
+ Normal steer and `/steer` queue follow-ups; `/queue steer` is unavailable. If cleanup is
634
+ uncertain, reconcile the captured session in Aside and acknowledge via
635
+ `POST /api/orchestrate/aside/reconcile` with `{ "sessionId": "<jaw-chat-id>", "acknowledgementToken": "<retained-run-token>", "acknowledged": true }`.
636
+ Recovery requires the captured local CLI to have closed and discards old queued input;
637
+ send fresh input afterward. Stop does not prove external tools have physically finished.
@@ -0,0 +1,339 @@
1
+ import { constants } from 'node:fs';
2
+ import { lstat, open, realpath } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ const MAX_FILE_BYTES = 2 * 1024 * 1024;
6
+ const MAX_PROVIDERS = 64;
7
+ const MAX_MODELS_PER_PROVIDER = 512;
8
+ const MAX_TOTAL_MODELS = 2048;
9
+ const MAX_CACHED_IDS = 2048;
10
+ const MAX_ID_LENGTH = 256;
11
+ const MAX_NAME_LENGTH = 256;
12
+ const MAX_TOKENS = 1_000_000_000;
13
+ const THINKING_LEVELS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
14
+ const MESSAGES = {
15
+ invalid_context: 'Aside requires an explicit valid account.',
16
+ unsupported_host: 'Aside catalog discovery supports the local host only.',
17
+ unsafe_path: 'Aside profile path is not safe for local discovery.',
18
+ read_failed: 'Aside catalog file could not be read.',
19
+ malformed_catalog: 'Aside catalog data is malformed.',
20
+ limit_exceeded: 'Aside catalog data exceeds discovery limits.',
21
+ duplicate_model: 'Aside catalog contains duplicate model identities.',
22
+ catalog_unavailable: 'Aside catalog is unavailable.',
23
+ default_unavailable: 'Aside has no concrete configured default model.',
24
+ model_unavailable: 'Aside model is not present in the observed catalog.',
25
+ effort_unavailable: 'Aside effort is not supported by the observed model metadata.',
26
+ };
27
+ /** Messages never include raw JSON, account paths, credentials or caught errors. */
28
+ export class AsideCatalogError extends Error {
29
+ code;
30
+ constructor(code) {
31
+ super(MESSAGES[code]);
32
+ this.code = code;
33
+ this.name = 'AsideCatalogError';
34
+ }
35
+ }
36
+ function fail(code) { throw new AsideCatalogError(code); }
37
+ function record(value) {
38
+ if (!value || typeof value !== 'object' || Array.isArray(value))
39
+ return fail('malformed_catalog');
40
+ return value;
41
+ }
42
+ function identifier(value, provider = false) {
43
+ if (typeof value !== 'string' || !value || value.length > MAX_ID_LENGTH)
44
+ return fail('malformed_catalog');
45
+ const pattern = provider ? /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/ : /^[a-zA-Z0-9][a-zA-Z0-9_./:+\[\]-]*$/;
46
+ if (!pattern.test(value) || value.split('/').some(part => !part || part === '.' || part === '..'))
47
+ return fail('malformed_catalog');
48
+ return value;
49
+ }
50
+ function thinkingLevel(value) {
51
+ if (typeof value !== 'string' || !THINKING_LEVELS.includes(value))
52
+ return fail('malformed_catalog');
53
+ return value;
54
+ }
55
+ function tokenCount(value) {
56
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0 || value > MAX_TOKENS)
57
+ return fail('malformed_catalog');
58
+ return value;
59
+ }
60
+ function modelEntry(value, provider) {
61
+ const row = record(value);
62
+ const modelId = identifier(row['id']);
63
+ const entry = {
64
+ id: `${provider}/${modelId}`, provider, modelId, name: modelId,
65
+ efforts: [], thinkingLevelMap: {}, capability: 'unknown',
66
+ };
67
+ if (row['name'] !== undefined) {
68
+ const name = row['name'];
69
+ if (typeof name !== 'string' || !name.trim() || name.length > MAX_NAME_LENGTH || /[\x00-\x1f\x7f]/.test(name))
70
+ return fail('malformed_catalog');
71
+ entry.name = name;
72
+ }
73
+ if (row['thinkingLevelMap'] !== undefined) {
74
+ const map = record(row['thinkingLevelMap']);
75
+ if (Object.keys(map).length > 16)
76
+ return fail('limit_exceeded');
77
+ for (const level of THINKING_LEVELS) {
78
+ const mapped = map[level];
79
+ if (mapped === null || mapped === undefined)
80
+ continue;
81
+ if (typeof mapped === 'string') {
82
+ if (!mapped || mapped.length > 64 || !/^[a-zA-Z0-9_-]+$/.test(mapped))
83
+ return fail('malformed_catalog');
84
+ }
85
+ else if (typeof mapped !== 'number' || !Number.isSafeInteger(mapped) || mapped < 0 || mapped > MAX_TOKENS) {
86
+ return fail('malformed_catalog');
87
+ }
88
+ entry.thinkingLevelMap[level] = mapped;
89
+ entry.efforts.push(level);
90
+ }
91
+ entry.capability = 'registered';
92
+ }
93
+ if (row['reasoning'] !== undefined) {
94
+ if (typeof row['reasoning'] !== 'boolean')
95
+ return fail('malformed_catalog');
96
+ entry.reasoning = row['reasoning'];
97
+ }
98
+ if (row['input'] !== undefined) {
99
+ const input = row['input'];
100
+ if (!Array.isArray(input) || input.length > 4 || input.some(v => !['text', 'image', 'audio', 'video'].includes(v)))
101
+ return fail('malformed_catalog');
102
+ entry.input = [...new Set(input)];
103
+ }
104
+ if (row['contextWindow'] !== undefined)
105
+ entry.contextWindow = tokenCount(row['contextWindow']);
106
+ if (row['maxTokens'] !== undefined)
107
+ entry.maxTokens = tokenCount(row['maxTokens']);
108
+ return entry;
109
+ }
110
+ function parseModels(value) {
111
+ const root = record(value);
112
+ const providers = root['providers'] === undefined ? {} : record(root['providers']);
113
+ const pairs = Object.entries(providers);
114
+ if (pairs.length > MAX_PROVIDERS)
115
+ return fail('limit_exceeded');
116
+ const entries = [];
117
+ const cachedIds = [];
118
+ const seen = new Set();
119
+ const seenCached = new Set();
120
+ for (const [providerId, raw] of pairs) {
121
+ const provider = identifier(providerId, true);
122
+ const row = record(raw);
123
+ if (row['models'] !== undefined) {
124
+ const models = row['models'];
125
+ if (!Array.isArray(models))
126
+ return fail('malformed_catalog');
127
+ if (models.length > MAX_MODELS_PER_PROVIDER || entries.length + models.length > MAX_TOTAL_MODELS)
128
+ return fail('limit_exceeded');
129
+ for (const value of models) {
130
+ const entry = modelEntry(value, provider);
131
+ if (seen.has(entry.id))
132
+ return fail('duplicate_model');
133
+ seen.add(entry.id);
134
+ entries.push(entry);
135
+ }
136
+ }
137
+ if (row['accountModelCatalog'] !== undefined) {
138
+ const cache = record(row['accountModelCatalog']);
139
+ const ids = cache['modelIds'];
140
+ if (!Array.isArray(ids))
141
+ return fail('malformed_catalog');
142
+ if (ids.length > MAX_CACHED_IDS || cachedIds.length + ids.length > MAX_CACHED_IDS)
143
+ return fail('limit_exceeded');
144
+ for (const value of ids) {
145
+ const modelId = identifier(value);
146
+ const id = `${provider}/${modelId}`;
147
+ if (seenCached.has(id))
148
+ return fail('duplicate_model');
149
+ seenCached.add(id);
150
+ cachedIds.push({ id, provider, modelId, capability: 'unknown' });
151
+ }
152
+ }
153
+ }
154
+ return { entries, cachedIds };
155
+ }
156
+ function parseDefault(value) {
157
+ const root = record(value);
158
+ if (root['defaultModel'] === undefined || root['defaultModel'] === null)
159
+ return null;
160
+ const row = record(root['defaultModel']);
161
+ const result = { provider: identifier(row['provider'], true), modelId: identifier(row['modelId']) };
162
+ if (row['thinkingLevel'] !== undefined)
163
+ result.thinkingLevel = thinkingLevel(row['thinkingLevel']);
164
+ if (row['fastMode'] !== undefined) {
165
+ if (typeof row['fastMode'] !== 'boolean')
166
+ return fail('malformed_catalog');
167
+ result.fastMode = row['fastMode'];
168
+ }
169
+ return result;
170
+ }
171
+ function validateContext(context) {
172
+ if (!context || context.host !== 'local')
173
+ return fail('unsupported_host');
174
+ if (typeof context.account !== 'string' || !/^u(?:0|[1-9][0-9]{0,8})$/.test(context.account))
175
+ return fail('invalid_context');
176
+ }
177
+ function sameFile(a, b) { return a.dev === b.dev && a.ino === b.ino; }
178
+ function missing(error) { return !!error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT'; }
179
+ /** Check every account-path component, including in-profile links to other accounts. */
180
+ async function profileIdentity(home, account) {
181
+ const paths = [join(home, '.aside'), join(home, '.aside', 'u'), join(home, '.aside', 'u', account.slice(1))];
182
+ const identities = [];
183
+ for (const path of paths) {
184
+ const stat = await lstat(path);
185
+ if (!stat.isDirectory() || stat.isSymbolicLink() || await realpath(path) !== path)
186
+ return fail('unsafe_path');
187
+ identities.push({ path, stat });
188
+ }
189
+ return identities;
190
+ }
191
+ function sameIdentity(a, b) {
192
+ return a.length === b.length && a.every((item, i) => item.path === b[i].path && sameFile(item.stat, b[i].stat));
193
+ }
194
+ /** `expected` pins one profile directory identity across every file of a discovery operation. */
195
+ async function readJson(home, account, filename, expected) {
196
+ try {
197
+ const identity = await profileIdentity(home, account);
198
+ if (!sameIdentity(identity, expected))
199
+ return fail('unsafe_path');
200
+ const path = join(home, '.aside', 'u', account.slice(1), filename);
201
+ const before = await lstat(path);
202
+ if (!before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || await realpath(path) !== path)
203
+ return fail('unsafe_path');
204
+ if (before.size > MAX_FILE_BYTES)
205
+ return fail('limit_exceeded');
206
+ // NONBLOCK prevents a replacement FIFO from hanging open; NOFOLLOW rejects file links.
207
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
208
+ try {
209
+ const opened = await file.stat();
210
+ if (!opened.isFile() || opened.nlink !== 1 || !sameFile(before, opened))
211
+ return fail('unsafe_path');
212
+ const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);
213
+ let bytes = 0;
214
+ while (bytes < buffer.length) {
215
+ const read = await file.read(buffer, bytes, buffer.length - bytes, bytes);
216
+ if (read.bytesRead === 0)
217
+ break;
218
+ bytes += read.bytesRead;
219
+ }
220
+ if (bytes > MAX_FILE_BYTES)
221
+ return fail('limit_exceeded');
222
+ const after = await file.stat();
223
+ if (opened.size !== after.size || opened.mtimeMs !== after.mtimeMs || opened.ctimeMs !== after.ctimeMs)
224
+ return fail('read_failed');
225
+ const current = await profileIdentity(home, account);
226
+ if (identity.some((item, i) => !current[i] || !sameFile(item.stat, current[i].stat)) || !sameFile(after, await lstat(path)))
227
+ return fail('unsafe_path');
228
+ try {
229
+ return JSON.parse(buffer.subarray(0, bytes).toString('utf8'));
230
+ }
231
+ catch {
232
+ return fail('malformed_catalog');
233
+ }
234
+ }
235
+ finally {
236
+ await file.close();
237
+ }
238
+ }
239
+ catch (error) {
240
+ if (missing(error))
241
+ return undefined;
242
+ if (error instanceof AsideCatalogError)
243
+ throw error;
244
+ return fail('read_failed');
245
+ }
246
+ }
247
+ /** Always reads the selected local profile afresh; never spawns a CLI or queries a provider. */
248
+ export async function readAsideCatalog(context, options = {}) {
249
+ validateContext(context);
250
+ const capturedContext = { account: context.account, host: 'local' };
251
+ const home = await realpath(resolve(options.homeDir ?? homedir())).catch(() => fail('unsafe_path'));
252
+ const catalog = {
253
+ context: capturedContext, entries: [], cachedIds: [],
254
+ configuredDefault: null, defaultModel: null, source: 'local-files', status: 'unavailable', diagnostics: [],
255
+ };
256
+ const account = catalog.context.account;
257
+ // One profile identity for the whole operation: a directory swapped between the two
258
+ // reads must not combine one profile's models with another profile's default.
259
+ let expected;
260
+ try {
261
+ expected = await profileIdentity(home, account);
262
+ }
263
+ catch (error) {
264
+ if (!missing(error)) {
265
+ const code = error instanceof AsideCatalogError ? error.code : 'read_failed';
266
+ for (const source of ['models', 'settings'])
267
+ catalog.diagnostics.push({ source, code, message: MESSAGES[code] });
268
+ }
269
+ return catalog;
270
+ }
271
+ for (const source of ['models', 'settings']) {
272
+ try {
273
+ const value = await readJson(home, account, `${source}.json`, expected);
274
+ await options.afterRead?.(source);
275
+ if (value === undefined)
276
+ continue;
277
+ if (source === 'models')
278
+ Object.assign(catalog, parseModels(value));
279
+ else {
280
+ catalog.configuredDefault = parseDefault(value);
281
+ if (catalog.configuredDefault)
282
+ catalog.defaultModel = `${catalog.configuredDefault.provider}/${catalog.configuredDefault.modelId}`;
283
+ }
284
+ }
285
+ catch (error) {
286
+ const code = error instanceof AsideCatalogError ? error.code : 'read_failed';
287
+ catalog.diagnostics.push({ source, code, message: MESSAGES[code] });
288
+ }
289
+ }
290
+ let stable = false;
291
+ try {
292
+ stable = sameIdentity(await profileIdentity(home, account), expected);
293
+ }
294
+ catch {
295
+ stable = false;
296
+ }
297
+ if (!stable) {
298
+ // Discard the complete projection; partial data from a replaced profile is never retained.
299
+ catalog.entries = [];
300
+ catalog.cachedIds = [];
301
+ catalog.configuredDefault = null;
302
+ catalog.defaultModel = null;
303
+ catalog.diagnostics = ['models', 'settings'].map(source => ({ source, code: 'unsafe_path', message: MESSAGES.unsafe_path }));
304
+ catalog.status = 'unavailable';
305
+ return catalog;
306
+ }
307
+ const data = catalog.entries.length > 0 || catalog.cachedIds.length > 0 || catalog.defaultModel !== null;
308
+ catalog.status = catalog.entries.length > 0 && catalog.diagnostics.length === 0 ? 'available' : data ? 'partial' : 'unavailable';
309
+ return catalog;
310
+ }
311
+ /** Cached IDs alone cannot select a model; an observed concrete default can resolve the sentinel. */
312
+ export function resolveAsideSelection(catalog, model = 'default', effort = 'default') {
313
+ validateContext(catalog.context);
314
+ if (catalog.status === 'unavailable' || catalog.diagnostics.some(d => d.source === 'models'))
315
+ return fail('catalog_unavailable');
316
+ const selected = model === 'default' ? catalog.defaultModel : model;
317
+ if (!selected)
318
+ return fail('default_unavailable');
319
+ const entry = catalog.entries.find(row => row.id === selected);
320
+ const preference = catalog.defaultModel === selected ? catalog.configuredDefault : null;
321
+ if (!entry && !preference)
322
+ return fail('model_unavailable');
323
+ let level = null;
324
+ if (effort === 'default')
325
+ level = preference?.thinkingLevel ?? null;
326
+ else if (THINKING_LEVELS.includes(effort))
327
+ level = effort;
328
+ else
329
+ return fail('effort_unavailable');
330
+ if (level !== null && (entry?.capability === 'registered'
331
+ ? !entry.efforts.includes(level)
332
+ : !preference || level !== preference.thinkingLevel))
333
+ return fail('effort_unavailable');
334
+ return {
335
+ account: catalog.context.account, host: 'local', provider: entry?.provider ?? preference.provider,
336
+ modelId: entry?.modelId ?? preference.modelId, model: selected, effort: level,
337
+ };
338
+ }
339
+ //# sourceMappingURL=aside-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aside-catalog.js","sourceRoot":"","sources":["../../../src/agent/aside-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { stripVTControlCharacters } from 'node:util';
4
+ import { createTextStreamReader } from './stream-text.js';
5
+ import { redactOutboundText } from '../messaging/redact.js';
6
+ export const ASIDE_ARGV_BYTES = 96 * 1024;
7
+ const WINDOWS_ARGV_BYTES = 24 * 1024;
8
+ export const ASIDE_DIAGNOSTIC_BYTES = 32 * 1024;
9
+ export const ASIDE_REPL_BYTES = 4 * 1024 * 1024;
10
+ export const ASIDE_HISTORY_LIMIT = 200;
11
+ export const ASIDE_PROBE_TIMEOUT_MS = 10_000;
12
+ export const ASIDE_CLOSE_TIMEOUT_MS = 5_000;
13
+ export const ASIDE_KILL_TIMEOUT_MS = 2_000;
14
+ const HEADER_BYTES = 4096;
15
+ const LEVELS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
16
+ export class AsideTransportError extends Error {
17
+ code;
18
+ constructor(code) {
19
+ super(`Aside transport rejected: ${code}.`);
20
+ this.code = code;
21
+ this.name = 'AsideTransportError';
22
+ }
23
+ }
24
+ export function validateAsideSessionId(id) {
25
+ if (!/^[a-zA-Z0-9_-]{1,128}$/.test(id))
26
+ throw new AsideTransportError('invalid_session');
27
+ }
28
+ export function validateAsideSelection(s) {
29
+ if (!/^u(?:0|[1-9][0-9]{0,8})$/.test(s.account) || s.host !== 'local'
30
+ || !/^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,255}$/.test(s.provider)
31
+ || !/^[a-zA-Z0-9][a-zA-Z0-9_./:+\[\]-]{0,255}$/.test(s.modelId)
32
+ || s.modelId.split('/').some(p => !p || p === '.' || p === '..')
33
+ || s.model !== `${s.provider}/${s.modelId}`
34
+ || (s.effort !== null && !LEVELS.includes(s.effort))) {
35
+ throw new AsideTransportError('invalid_selection');
36
+ }
37
+ }
38
+ function boundedArgv(args) {
39
+ if (args.some(arg => arg.includes('\0')) || args.reduce((n, arg) => n + Buffer.byteLength(arg) + 1, 0) > (process.platform === 'win32' ? WINDOWS_ARGV_BYTES : ASIDE_ARGV_BYTES)) {
40
+ throw new AsideTransportError('argv_limit');
41
+ }
42
+ return args;
43
+ }
44
+ function selectors(s) {
45
+ validateAsideSelection(s);
46
+ return ['--account', s.account, '--host', s.host];
47
+ }
48
+ export function buildAsideRunArgs(input) {
49
+ const args = [...selectors(input.selection), '--model', input.selection.model, '--permission', input.permission];
50
+ if (!['guard', 'full-access'].includes(input.permission) || !input.prompt.trim())
51
+ throw new AsideTransportError('invalid_input');
52
+ if (input.selection.effort !== null)
53
+ args.push('--effort', input.selection.effort);
54
+ if (input.sessionId !== undefined) {
55
+ validateAsideSessionId(input.sessionId);
56
+ args.push('session', 'resume', input.sessionId);
57
+ }
58
+ else
59
+ args.push('exec');
60
+ return boundedArgv([...args, '--', input.prompt]);
61
+ }
62
+ export function buildAsideStopArgs(selection, id) {
63
+ validateAsideSessionId(id);
64
+ return boundedArgv([...selectors(selection), 'session', 'stop', id]);
65
+ }
66
+ /** Receipt parsing is stderr-only, before any other nonblank diagnostic line. */
67
+ export function createAsideHeaderReader(resumeId) {
68
+ let pending = '', sealed = false;
69
+ return (text) => {
70
+ if (sealed)
71
+ return null;
72
+ pending += text;
73
+ if (Buffer.byteLength(pending) > HEADER_BYTES) {
74
+ sealed = true;
75
+ return null;
76
+ }
77
+ let newline;
78
+ while ((newline = pending.indexOf('\n')) !== -1) {
79
+ const line = stripVTControlCharacters(pending.slice(0, newline)).trim();
80
+ pending = pending.slice(newline + 1);
81
+ if (!line)
82
+ continue;
83
+ sealed = true;
84
+ const match = /^(created new session|continuing existing session): ([a-zA-Z0-9_-]{1,128})$/.exec(line);
85
+ if (!match || (resumeId === undefined ? match[1] !== 'created new session' : match[1] !== 'continuing existing session' || match[2] !== resumeId))
86
+ return null;
87
+ return match[2] ?? null;
88
+ }
89
+ return null;
90
+ };
91
+ }
92
+ export function observeAsideCallback(callback, value) {
93
+ try {
94
+ Promise.resolve(callback?.(value)).catch(() => { });
95
+ }
96
+ catch { /* Observer isolation is part of the outcome contract. */ }
97
+ }
98
+ /** Resolve on close, never on exit or successful signal delivery. */
99
+ export function launchAsideCommand(input, args, options = {}) {
100
+ boundedArgv(args);
101
+ const child = (options.spawn ?? spawn)(input.binary, args, {
102
+ cwd: input.cwd, env: input.env, shell: false, windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'],
103
+ });
104
+ let closed = false, overflow = false, failed = false, bytes = 0;
105
+ let stdout = '', stderr = '';
106
+ const out = createTextStreamReader(), err = createTextStreamReader();
107
+ const maxBytes = options.maxBytes ?? ASIDE_DIAGNOSTIC_BYTES;
108
+ const consume = (isOut, chunk) => {
109
+ const decoded = (isOut ? out : err).write(chunk);
110
+ bytes += Buffer.byteLength(chunk);
111
+ if (bytes > maxBytes) {
112
+ overflow = true;
113
+ return;
114
+ }
115
+ if (isOut)
116
+ stdout += decoded;
117
+ else
118
+ stderr += decoded;
119
+ observeAsideCallback(isOut ? options.onStdout : options.onStderr, decoded);
120
+ };
121
+ child.stdout?.on('data', (chunk) => consume(true, chunk));
122
+ child.stderr?.on('data', (chunk) => consume(false, chunk));
123
+ const ioError = () => { failed = true; };
124
+ child.stdout?.on('error', ioError);
125
+ child.stderr?.on('error', ioError);
126
+ child.on('error', ioError);
127
+ const completion = new Promise(resolve => child.once('close', (exitCode, signal) => {
128
+ closed = true;
129
+ stdout += out.end();
130
+ stderr += err.end();
131
+ resolve({ exitCode, signal, stdout, stderr, overflow, failed });
132
+ }));
133
+ return {
134
+ child, completion,
135
+ get closed() { return closed; },
136
+ get overflow() { return overflow; },
137
+ signal(signal) {
138
+ if (!closed && child.exitCode === null && child.signalCode === null) {
139
+ try {
140
+ child.kill(signal);
141
+ }
142
+ catch {
143
+ failed = true;
144
+ }
145
+ }
146
+ },
147
+ };
148
+ }
149
+ export async function asideWithin(promise, ms) {
150
+ let timer;
151
+ try {
152
+ return await Promise.race([promise, new Promise(resolve => { timer = setTimeout(() => resolve(undefined), ms); })]);
153
+ }
154
+ finally {
155
+ if (timer)
156
+ clearTimeout(timer);
157
+ }
158
+ }
159
+ export async function closeAsideCommand(command, closeMs = ASIDE_CLOSE_TIMEOUT_MS, killMs = ASIDE_KILL_TIMEOUT_MS) {
160
+ if (command.closed)
161
+ return true;
162
+ command.signal('SIGTERM');
163
+ if (await asideWithin(command.completion, closeMs))
164
+ return true;
165
+ command.signal('SIGKILL');
166
+ return (await asideWithin(command.completion, killMs)) !== undefined;
167
+ }
168
+ export function safeAsideDiagnostic(text) {
169
+ // Bound before the shared redactor's scanning work; decoder preserves chunk UTF-8.
170
+ return redactOutboundText(stripVTControlCharacters(text)).slice(0, ASIDE_DIAGNOSTIC_BYTES);
171
+ }
172
+ export function buildAsideReadArgs(selection, id, frame) {
173
+ validateAsideSessionId(id);
174
+ if (!/^[a-f0-9-]{36}$/.test(frame))
175
+ throw new AsideTransportError('invalid_frame');
176
+ const code = `const id=${JSON.stringify(id)};const before=await aside.sessions.get(id);const messages=await aside.sessions.messages(id,{limit:${ASIDE_HISTORY_LIMIT},order:"desc"});const after=await aside.sessions.get(id);const value={session:{id:after.id,status:after.status},before:{id:before.id,status:before.status},messages,limit:${ASIDE_HISTORY_LIMIT},order:"desc"};const json=JSON.stringify(value);if(new TextEncoder().encode(json).length>${ASIDE_REPL_BYTES - 4096})throw new Error("aside_replay_limit");console.log("JAW_ASIDE_${frame}_BEGIN"+json+"JAW_ASIDE_${frame}_END");`;
177
+ return boundedArgv([...selectors(selection), 'repl', '--', code]);
178
+ }
179
+ export function parseAsideRepl(stdout, frame) {
180
+ const text = stripVTControlCharacters(stdout).trim();
181
+ if (!/\[ok \| [0-9]+ms\]$/.test(text))
182
+ throw new AsideTransportError('repl_failed');
183
+ const begin = `JAW_ASIDE_${frame}_BEGIN`, end = `JAW_ASIDE_${frame}_END`;
184
+ const start = text.indexOf(begin), finish = text.lastIndexOf(end);
185
+ if (start !== 0 || finish < begin.length
186
+ || !/^\s*\[ok \| [0-9]+ms\]$/.test(text.slice(finish + end.length)))
187
+ throw new AsideTransportError('invalid_repl_frame');
188
+ try {
189
+ return JSON.parse(text.slice(begin.length, finish));
190
+ }
191
+ catch {
192
+ throw new AsideTransportError('invalid_repl_json');
193
+ }
194
+ }
195
+ export async function readAsideSession(input, selection, id, deps = {}) {
196
+ const frame = randomUUID();
197
+ const command = launchAsideCommand(input, buildAsideReadArgs(selection, id, frame), { ...deps, maxBytes: ASIDE_REPL_BYTES });
198
+ deps.onCommand?.(command);
199
+ const result = await asideWithin(command.completion, deps.probeMs ?? ASIDE_PROBE_TIMEOUT_MS);
200
+ if (!result) {
201
+ const closed = await closeAsideCommand(command, deps.closeMs, deps.killMs);
202
+ throw new AsideTransportError(closed ? 'repl_timeout' : 'repl_close_unconfirmed');
203
+ }
204
+ if (result.exitCode !== 0 || result.failed || result.overflow || result.stderr.trim())
205
+ throw new AsideTransportError('repl_transport_failed');
206
+ return parseAsideRepl(result.stdout, frame);
207
+ }
208
+ //# sourceMappingURL=aside-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aside-cli.js","sourceRoot":"","sources":["../../../src/agent/aside-cli.ts"],"names":[],"mappings":"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"}