@orion-agents/orion-code 0.2.2 → 0.3.1

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 (217) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +89 -14
  3. package/README.zh-CN.md +77 -14
  4. package/bin/orion +15 -4
  5. package/dist/cli.js +51 -172
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/model-command-handlers.d.ts +2 -2
  8. package/dist/commands/model-command-handlers.d.ts.map +1 -1
  9. package/dist/commands/model-command-handlers.js +113 -32
  10. package/dist/commands/model-command-handlers.js.map +1 -1
  11. package/dist/commands/session-command-handlers.d.ts.map +1 -1
  12. package/dist/commands/session-command-handlers.js +106 -15
  13. package/dist/commands/session-command-handlers.js.map +1 -1
  14. package/dist/commands/types.d.ts +13 -3
  15. package/dist/commands/types.d.ts.map +1 -1
  16. package/dist/commands/types.js +1 -1
  17. package/dist/commands/types.js.map +1 -1
  18. package/dist/core/tool-artifacts.d.ts +2 -0
  19. package/dist/core/tool-artifacts.d.ts.map +1 -1
  20. package/dist/core/tool-artifacts.js +27 -1
  21. package/dist/core/tool-artifacts.js.map +1 -1
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/runtime/agent-loop.d.ts.map +1 -1
  25. package/dist/runtime/agent-loop.js +3 -3
  26. package/dist/runtime/agent-loop.js.map +1 -1
  27. package/dist/runtime/agent-runtime-controller.d.ts +32 -1
  28. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  29. package/dist/runtime/agent-runtime-controller.js +241 -27
  30. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  31. package/dist/runtime/agent-runtime-protocol.d.ts +4 -0
  32. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  33. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  34. package/dist/runtime/agent-runtime-runner.d.ts +2 -1
  35. package/dist/runtime/agent-runtime-runner.d.ts.map +1 -1
  36. package/dist/runtime/durable-tool-receipt-reader.d.ts +32 -0
  37. package/dist/runtime/durable-tool-receipt-reader.d.ts.map +1 -0
  38. package/dist/runtime/durable-tool-receipt-reader.js +130 -0
  39. package/dist/runtime/durable-tool-receipt-reader.js.map +1 -0
  40. package/dist/runtime/legacy-thread-materializer.d.ts +31 -0
  41. package/dist/runtime/legacy-thread-materializer.d.ts.map +1 -1
  42. package/dist/runtime/legacy-thread-materializer.js +71 -17
  43. package/dist/runtime/legacy-thread-materializer.js.map +1 -1
  44. package/dist/runtime/orion-runtime-v1.d.ts +2 -0
  45. package/dist/runtime/orion-runtime-v1.d.ts.map +1 -1
  46. package/dist/runtime/orion-runtime-v1.js +7 -1
  47. package/dist/runtime/orion-runtime-v1.js.map +1 -1
  48. package/dist/runtime/orion-session-runner.d.ts +7 -2
  49. package/dist/runtime/orion-session-runner.d.ts.map +1 -1
  50. package/dist/runtime/orion-session-runner.js +16 -6
  51. package/dist/runtime/orion-session-runner.js.map +1 -1
  52. package/dist/runtime/product-bootstrap.d.ts +22 -0
  53. package/dist/runtime/product-bootstrap.d.ts.map +1 -0
  54. package/dist/runtime/product-bootstrap.js +374 -0
  55. package/dist/runtime/product-bootstrap.js.map +1 -0
  56. package/dist/runtime/product-orion-runtime.d.ts +2 -1
  57. package/dist/runtime/product-orion-runtime.d.ts.map +1 -1
  58. package/dist/runtime/product-orion-runtime.js +83 -13
  59. package/dist/runtime/product-orion-runtime.js.map +1 -1
  60. package/dist/runtime/protocol/runtime-protocol-v1.d.ts +1 -1
  61. package/dist/runtime/protocol/runtime-protocol-v1.js +1 -1
  62. package/dist/runtime/protocol/runtime-protocol-v1.js.map +1 -1
  63. package/dist/runtime/release-receipts.d.ts +66 -3
  64. package/dist/runtime/release-receipts.d.ts.map +1 -1
  65. package/dist/runtime/release-receipts.js +340 -7
  66. package/dist/runtime/release-receipts.js.map +1 -1
  67. package/dist/runtime/step-snapshot.d.ts.map +1 -1
  68. package/dist/runtime/step-snapshot.js +22 -2
  69. package/dist/runtime/step-snapshot.js.map +1 -1
  70. package/dist/runtime/subagents/runtime-integration.d.ts +1 -1
  71. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  72. package/dist/runtime/subagents/runtime-integration.js +5 -2
  73. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  74. package/dist/runtime/thread-event-store.d.ts +80 -0
  75. package/dist/runtime/thread-event-store.d.ts.map +1 -1
  76. package/dist/runtime/thread-event-store.js +456 -22
  77. package/dist/runtime/thread-event-store.js.map +1 -1
  78. package/dist/runtime/thread-projection.d.ts +10 -0
  79. package/dist/runtime/thread-projection.d.ts.map +1 -1
  80. package/dist/runtime/thread-projection.js +40 -0
  81. package/dist/runtime/thread-projection.js.map +1 -1
  82. package/dist/runtime/thread-runtime.d.ts +3 -1
  83. package/dist/runtime/thread-runtime.d.ts.map +1 -1
  84. package/dist/runtime/thread-runtime.js +6 -0
  85. package/dist/runtime/thread-runtime.js.map +1 -1
  86. package/dist/runtime/thread-session-index.d.ts +84 -0
  87. package/dist/runtime/thread-session-index.d.ts.map +1 -0
  88. package/dist/runtime/thread-session-index.js +503 -0
  89. package/dist/runtime/thread-session-index.js.map +1 -0
  90. package/dist/runtime/thread-session-view.d.ts +70 -9
  91. package/dist/runtime/thread-session-view.d.ts.map +1 -1
  92. package/dist/runtime/thread-session-view.js +200 -82
  93. package/dist/runtime/thread-session-view.js.map +1 -1
  94. package/dist/runtime/thread-ui-adapter.d.ts +2 -0
  95. package/dist/runtime/thread-ui-adapter.d.ts.map +1 -1
  96. package/dist/runtime/thread-ui-adapter.js +86 -4
  97. package/dist/runtime/thread-ui-adapter.js.map +1 -1
  98. package/dist/runtime/tool-detail-repository.d.ts.map +1 -1
  99. package/dist/runtime/tool-detail-repository.js +23 -19
  100. package/dist/runtime/tool-detail-repository.js.map +1 -1
  101. package/dist/runtime/tool-receipt-validator.d.ts +21 -0
  102. package/dist/runtime/tool-receipt-validator.d.ts.map +1 -0
  103. package/dist/runtime/tool-receipt-validator.js +157 -0
  104. package/dist/runtime/tool-receipt-validator.js.map +1 -0
  105. package/dist/runtime/ui-events.d.ts +35 -0
  106. package/dist/runtime/ui-events.d.ts.map +1 -1
  107. package/dist/runtime/ui-events.js +1 -0
  108. package/dist/runtime/ui-events.js.map +1 -1
  109. package/dist/runtime/ui-view-model.d.ts +2 -0
  110. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  111. package/dist/runtime/ui-view-model.js +7 -3
  112. package/dist/runtime/ui-view-model.js.map +1 -1
  113. package/dist/services/global-config.d.ts +25 -0
  114. package/dist/services/global-config.d.ts.map +1 -1
  115. package/dist/services/global-config.js +373 -5
  116. package/dist/services/global-config.js.map +1 -1
  117. package/dist/services/redaction.d.ts +4 -0
  118. package/dist/services/redaction.d.ts.map +1 -1
  119. package/dist/services/redaction.js +63 -0
  120. package/dist/services/redaction.js.map +1 -1
  121. package/dist/services/session-index.d.ts +16 -0
  122. package/dist/services/session-index.d.ts.map +1 -1
  123. package/dist/services/session-index.js +45 -36
  124. package/dist/services/session-index.js.map +1 -1
  125. package/dist/services/session-storage.d.ts +59 -0
  126. package/dist/services/session-storage.d.ts.map +1 -1
  127. package/dist/services/session-storage.js +306 -107
  128. package/dist/services/session-storage.js.map +1 -1
  129. package/dist/services/settings-coordinator.d.ts +174 -0
  130. package/dist/services/settings-coordinator.d.ts.map +1 -0
  131. package/dist/services/settings-coordinator.js +605 -0
  132. package/dist/services/settings-coordinator.js.map +1 -0
  133. package/dist/services/settings-document-repository.d.ts +138 -0
  134. package/dist/services/settings-document-repository.d.ts.map +1 -0
  135. package/dist/services/settings-document-repository.js +551 -0
  136. package/dist/services/settings-document-repository.js.map +1 -0
  137. package/dist/services/workspace-registry.d.ts +42 -0
  138. package/dist/services/workspace-registry.d.ts.map +1 -0
  139. package/dist/services/workspace-registry.js +222 -0
  140. package/dist/services/workspace-registry.js.map +1 -0
  141. package/dist/terminal-ui/launch.d.ts.map +1 -1
  142. package/dist/terminal-ui/launch.js +5 -0
  143. package/dist/terminal-ui/launch.js.map +1 -1
  144. package/dist/tui-ui/state.d.ts.map +1 -1
  145. package/dist/tui-ui/state.js +5 -0
  146. package/dist/tui-ui/state.js.map +1 -1
  147. package/dist/web/errors.d.ts +6 -0
  148. package/dist/web/errors.d.ts.map +1 -0
  149. package/dist/web/errors.js +13 -0
  150. package/dist/web/errors.js.map +1 -0
  151. package/dist/web/event-hub.d.ts +43 -0
  152. package/dist/web/event-hub.d.ts.map +1 -0
  153. package/dist/web/event-hub.js +323 -0
  154. package/dist/web/event-hub.js.map +1 -0
  155. package/dist/web/file-read-service.d.ts +55 -0
  156. package/dist/web/file-read-service.d.ts.map +1 -0
  157. package/dist/web/file-read-service.js +399 -0
  158. package/dist/web/file-read-service.js.map +1 -0
  159. package/dist/web/git-read-model-service.d.ts +77 -0
  160. package/dist/web/git-read-model-service.d.ts.map +1 -0
  161. package/dist/web/git-read-model-service.js +631 -0
  162. package/dist/web/git-read-model-service.js.map +1 -0
  163. package/dist/web/index.d.ts +6 -0
  164. package/dist/web/index.d.ts.map +1 -0
  165. package/dist/web/index.js +28 -0
  166. package/dist/web/index.js.map +1 -0
  167. package/dist/web/launch.d.ts +9 -0
  168. package/dist/web/launch.d.ts.map +1 -0
  169. package/dist/web/launch.js +64 -0
  170. package/dist/web/launch.js.map +1 -0
  171. package/dist/web/protocol.d.ts +408 -0
  172. package/dist/web/protocol.d.ts.map +1 -0
  173. package/dist/web/protocol.js +369 -0
  174. package/dist/web/protocol.js.map +1 -0
  175. package/dist/web/review-service.d.ts +38 -0
  176. package/dist/web/review-service.d.ts.map +1 -0
  177. package/dist/web/review-service.js +74 -0
  178. package/dist/web/review-service.js.map +1 -0
  179. package/dist/web/server.d.ts +20 -0
  180. package/dist/web/server.d.ts.map +1 -0
  181. package/dist/web/server.js +744 -0
  182. package/dist/web/server.js.map +1 -0
  183. package/dist/web/terminal-manager.d.ts +155 -0
  184. package/dist/web/terminal-manager.d.ts.map +1 -0
  185. package/dist/web/terminal-manager.js +728 -0
  186. package/dist/web/terminal-manager.js.map +1 -0
  187. package/dist/web/terminal-server.d.ts +8 -0
  188. package/dist/web/terminal-server.d.ts.map +1 -0
  189. package/dist/web/terminal-server.js +275 -0
  190. package/dist/web/terminal-server.js.map +1 -0
  191. package/dist/web/workbench-controller.d.ts +99 -0
  192. package/dist/web/workbench-controller.d.ts.map +1 -0
  193. package/dist/web/workbench-controller.js +1267 -0
  194. package/dist/web/workbench-controller.js.map +1 -0
  195. package/dist/web-client/assets/DiffViewer-DpKoD07C.js +5 -0
  196. package/dist/web-client/assets/FilesPanel-BkoLmgjR.js +2 -0
  197. package/dist/web-client/assets/GitPanel-D20StcdG.js +1 -0
  198. package/dist/web-client/assets/ReviewPanel-3MVWbMQV.js +1 -0
  199. package/dist/web-client/assets/TerminalPanel-BLQ592Fb.js +21 -0
  200. package/dist/web-client/assets/TerminalPanel-DLuoa74B.css +1 -0
  201. package/dist/web-client/assets/index-BkIDl_xk.js +16 -0
  202. package/dist/web-client/assets/index-DXMpnWE8.css +1 -0
  203. package/dist/web-client/index.html +16 -0
  204. package/docs/architecture/v0.3.0-web-api.yaml +1340 -0
  205. package/docs/architecture/v0.3.1-web-api.yaml +2290 -0
  206. package/docs/migration/v0.2.2-to-v0.3.0-settings.md +114 -0
  207. package/docs/migration/v0.2.2-to-v0.3.0.md +55 -0
  208. package/docs/migration/v0.3.0-to-v0.3.1.md +88 -0
  209. package/docs/orion.example.json +9 -2
  210. package/docs/plan/v0.3.0-node-runtime-compatibility-plan.md +57 -0
  211. package/docs/plan/v0.3.0-settings-integration-plan.md +740 -0
  212. package/docs/plan/v0.3.0-web-workbench-plan.md +376 -0
  213. package/docs/plan/v0.3.1-web-workbench-professional-shell-plan.md +848 -0
  214. package/docs/readme.md +22 -1
  215. package/docs/test/v0.3.1-web-workbench-e2e-plan.md +140 -0
  216. package/npm-shrinkwrap.json +1229 -45
  217. package/package.json +47 -11
@@ -0,0 +1,551 @@
1
+ "use strict";
2
+ /**
3
+ * Durable, secret-preserving storage seam for the v0.3.0 Settings subsystem.
4
+ *
5
+ * `orion.json` remains the only settings document. The sidecar key is solely
6
+ * local revision entropy and never contains settings or leaves this service.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SettingsDocumentRepository = exports.SettingsDocumentRepositoryError = exports.SETTINGS_REVISION_PREFIX = exports.SETTINGS_REVISION_KEY_FILE = void 0;
10
+ exports.validateSettingsOperationsV1 = validateSettingsOperationsV1;
11
+ const crypto_1 = require("crypto");
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const atomic_write_1 = require("./atomic-write");
15
+ const file_lock_1 = require("./file-lock");
16
+ const paths_1 = require("../product/paths");
17
+ const global_config_1 = require("./global-config");
18
+ const effort_1 = require("./effort");
19
+ exports.SETTINGS_REVISION_KEY_FILE = '.orion-settings-revision.key';
20
+ exports.SETTINGS_REVISION_PREFIX = 'hmac-sha256:';
21
+ const REVISION_KEY_BYTES = 32;
22
+ const MISSING_DOCUMENT_SENTINEL = Buffer.from('missing-document-v1', 'utf8');
23
+ const DEFAULT_WATCH_DEBOUNCE_MS = 30;
24
+ const DEFAULT_LOCK_WAIT_MS = 10000;
25
+ class SettingsDocumentRepositoryError extends Error {
26
+ constructor(code, message) {
27
+ super(message);
28
+ this.code = code;
29
+ this.name = 'SettingsDocumentRepositoryError';
30
+ }
31
+ }
32
+ exports.SettingsDocumentRepositoryError = SettingsDocumentRepositoryError;
33
+ function cloneDocument(value) {
34
+ return JSON.parse(JSON.stringify(value));
35
+ }
36
+ function deepFreeze(value) {
37
+ if (value && typeof value === 'object' && !Object.isFrozen(value)) {
38
+ for (const child of Object.values(value))
39
+ deepFreeze(child);
40
+ Object.freeze(value);
41
+ }
42
+ return value;
43
+ }
44
+ function immutableDocument(document) {
45
+ return deepFreeze(cloneDocument(document));
46
+ }
47
+ function cloneSnapshot(snapshot) {
48
+ return Object.freeze({
49
+ ...snapshot,
50
+ document: immutableDocument(snapshot.document),
51
+ ...(snapshot.diagnostic ? { diagnostic: Object.freeze({ ...snapshot.diagnostic }) } : {}),
52
+ });
53
+ }
54
+ function isRecord(value) {
55
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
56
+ }
57
+ function pruneEmptyObject(parent, key) {
58
+ const value = parent[key];
59
+ if (isRecord(value) && Object.keys(value).length === 0)
60
+ delete parent[key];
61
+ }
62
+ function invalidOperation() {
63
+ throw new SettingsDocumentRepositoryError('settings_invalid_operation', 'The settings operation is invalid.');
64
+ }
65
+ function withRedactedFileLock(targetPath, waitMs, failureCode, failureMessage, operation) {
66
+ try {
67
+ return (0, file_lock_1.withFileLockSync)(targetPath, operation, { waitMs });
68
+ }
69
+ catch (error) {
70
+ if (error instanceof SettingsDocumentRepositoryError)
71
+ throw error;
72
+ throw new SettingsDocumentRepositoryError(failureCode, failureMessage);
73
+ }
74
+ }
75
+ /** Validate bounded public path operations without ever accepting arbitrary paths. */
76
+ function validateSettingsOperationsV1(operations) {
77
+ if (!Array.isArray(operations) || operations.length < 1 || operations.length > 20) {
78
+ invalidOperation();
79
+ }
80
+ const keys = new Set();
81
+ for (const operation of operations) {
82
+ if (!isRecord(operation) || (operation.op !== 'set' && operation.op !== 'unset')) {
83
+ invalidOperation();
84
+ }
85
+ if (operation.key !== 'appearance.theme' &&
86
+ operation.key !== 'appearance.motion' &&
87
+ operation.key !== 'defaults.model' &&
88
+ operation.key !== 'defaults.effort' &&
89
+ operation.key !== 'defaults.globalEffort' &&
90
+ operation.key !== 'permissions.toolConfirmation') {
91
+ invalidOperation();
92
+ }
93
+ if (keys.has(operation.key))
94
+ invalidOperation();
95
+ keys.add(operation.key);
96
+ if (operation.op === 'unset') {
97
+ if (Object.prototype.hasOwnProperty.call(operation, 'value'))
98
+ invalidOperation();
99
+ continue;
100
+ }
101
+ switch (operation.key) {
102
+ case 'appearance.theme':
103
+ if (operation.value !== 'system' &&
104
+ operation.value !== 'light' &&
105
+ operation.value !== 'dark') {
106
+ invalidOperation();
107
+ }
108
+ break;
109
+ case 'appearance.motion':
110
+ if (operation.value !== 'system' && operation.value !== 'reduced')
111
+ invalidOperation();
112
+ break;
113
+ case 'defaults.model':
114
+ if (typeof operation.value !== 'string' ||
115
+ operation.value.trim().length === 0 ||
116
+ operation.value.length > 256) {
117
+ invalidOperation();
118
+ }
119
+ break;
120
+ case 'defaults.effort':
121
+ case 'defaults.globalEffort':
122
+ if (!(0, effort_1.isEffortPreference)(operation.value))
123
+ invalidOperation();
124
+ break;
125
+ case 'permissions.toolConfirmation':
126
+ if (operation.value !== 'ask' &&
127
+ operation.value !== 'allow' &&
128
+ operation.value !== 'deny') {
129
+ invalidOperation();
130
+ }
131
+ break;
132
+ default:
133
+ invalidOperation();
134
+ }
135
+ }
136
+ return operations;
137
+ }
138
+ function applyOperations(source, workspace, operations) {
139
+ const candidate = cloneDocument(source);
140
+ for (const operation of operations) {
141
+ switch (operation.key) {
142
+ case 'appearance.theme': {
143
+ if (operation.op === 'set') {
144
+ const web = isRecord(candidate.web) ? candidate.web : {};
145
+ const appearance = isRecord(web.appearance) ? web.appearance : {};
146
+ appearance.theme = operation.value;
147
+ web.appearance = appearance;
148
+ candidate.web = web;
149
+ }
150
+ else if (isRecord(candidate.web) && isRecord(candidate.web.appearance)) {
151
+ delete candidate.web.appearance.theme;
152
+ pruneEmptyObject(candidate.web, 'appearance');
153
+ pruneEmptyObject(candidate, 'web');
154
+ }
155
+ break;
156
+ }
157
+ case 'appearance.motion': {
158
+ if (operation.op === 'set') {
159
+ const web = isRecord(candidate.web) ? candidate.web : {};
160
+ const appearance = isRecord(web.appearance) ? web.appearance : {};
161
+ appearance.motion = operation.value;
162
+ web.appearance = appearance;
163
+ candidate.web = web;
164
+ }
165
+ else if (isRecord(candidate.web) && isRecord(candidate.web.appearance)) {
166
+ delete candidate.web.appearance.motion;
167
+ pruneEmptyObject(candidate.web, 'appearance');
168
+ pruneEmptyObject(candidate, 'web');
169
+ }
170
+ break;
171
+ }
172
+ case 'defaults.model':
173
+ if (operation.op === 'set')
174
+ candidate.defaultModel = operation.value;
175
+ else
176
+ delete candidate.defaultModel;
177
+ break;
178
+ case 'defaults.effort': {
179
+ if (operation.op === 'set') {
180
+ const projects = isRecord(candidate.projects) ? candidate.projects : {};
181
+ const project = isRecord(projects[workspace]) ? projects[workspace] : {};
182
+ project.defaultEffort = operation.value;
183
+ projects[workspace] = project;
184
+ candidate.projects = projects;
185
+ }
186
+ else if (isRecord(candidate.projects) && isRecord(candidate.projects[workspace])) {
187
+ delete candidate.projects[workspace].defaultEffort;
188
+ pruneEmptyObject(candidate.projects, workspace);
189
+ pruneEmptyObject(candidate, 'projects');
190
+ }
191
+ break;
192
+ }
193
+ case 'defaults.globalEffort':
194
+ if (operation.op === 'set')
195
+ candidate.defaultEffort = operation.value;
196
+ else
197
+ delete candidate.defaultEffort;
198
+ break;
199
+ case 'permissions.toolConfirmation':
200
+ if (operation.op === 'set')
201
+ candidate.toolConfirmation = operation.value;
202
+ else
203
+ delete candidate.toolConfirmation;
204
+ break;
205
+ }
206
+ }
207
+ return candidate;
208
+ }
209
+ function secureRevisionEqual(left, right) {
210
+ if (!left.startsWith(exports.SETTINGS_REVISION_PREFIX) || !right.startsWith(exports.SETTINGS_REVISION_PREFIX)) {
211
+ return false;
212
+ }
213
+ const leftBytes = Buffer.from(left.slice(exports.SETTINGS_REVISION_PREFIX.length), 'hex');
214
+ const rightBytes = Buffer.from(right.slice(exports.SETTINGS_REVISION_PREFIX.length), 'hex');
215
+ return (leftBytes.length === 32 && rightBytes.length === 32 && (0, crypto_1.timingSafeEqual)(leftBytes, rightBytes));
216
+ }
217
+ /** Repository for strict reads and lock-protected CAS writes of `orion.json`. */
218
+ class SettingsDocumentRepository {
219
+ constructor(options = {}) {
220
+ this.lastGood = null;
221
+ this.lastReadSignature = null;
222
+ this.lastObservedSignature = null;
223
+ this.watcher = null;
224
+ this.watchTimer = null;
225
+ this.listeners = new Set();
226
+ this.closed = false;
227
+ this.documentPath = options.documentPath ?? (0, paths_1.getGlobalConfigPath)();
228
+ this.revisionKeyPath =
229
+ options.revisionKeyPath ??
230
+ (0, path_1.join)(options.documentPath ? (0, path_1.dirname)(options.documentPath) : (0, paths_1.getConfigHome)(), exports.SETTINGS_REVISION_KEY_FILE);
231
+ this.lockWaitMs = options.lockWaitMs ?? DEFAULT_LOCK_WAIT_MS;
232
+ this.watchDebounceMs = options.watchDebounceMs ?? DEFAULT_WATCH_DEBOUNCE_MS;
233
+ this.validateCandidate = options.validateCandidate;
234
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(this.documentPath), { recursive: true, mode: 0o700 });
235
+ this.revisionKey = this.loadOrCreateRevisionKey();
236
+ }
237
+ static create(options = {}) {
238
+ return new SettingsDocumentRepository(options);
239
+ }
240
+ assertOpen() {
241
+ if (this.closed) {
242
+ throw new SettingsDocumentRepositoryError('settings_document_unavailable', 'The settings repository is closed.');
243
+ }
244
+ }
245
+ loadOrCreateRevisionKey() {
246
+ return withRedactedFileLock(this.revisionKeyPath, this.lockWaitMs, 'settings_document_unavailable', 'The local settings revision key is unavailable.', () => {
247
+ if (!(0, fs_1.existsSync)(this.revisionKeyPath)) {
248
+ (0, atomic_write_1.atomicWriteFileSync)(this.revisionKeyPath, (0, crypto_1.randomBytes)(REVISION_KEY_BYTES), {
249
+ mode: 0o600,
250
+ fsync: true,
251
+ });
252
+ }
253
+ let key;
254
+ try {
255
+ key = (0, fs_1.readFileSync)(this.revisionKeyPath);
256
+ (0, fs_1.chmodSync)(this.revisionKeyPath, 0o600);
257
+ }
258
+ catch {
259
+ throw new SettingsDocumentRepositoryError('settings_document_unavailable', 'The local settings revision key is unavailable.');
260
+ }
261
+ if (key.length !== REVISION_KEY_BYTES) {
262
+ throw new SettingsDocumentRepositoryError('settings_document_unavailable', 'The local settings revision key is invalid.');
263
+ }
264
+ return Buffer.from(key);
265
+ });
266
+ }
267
+ revision(bytes) {
268
+ const digest = (0, crypto_1.createHmac)('sha256', this.revisionKey)
269
+ .update(bytes ?? MISSING_DOCUMENT_SENTINEL)
270
+ .digest('hex');
271
+ return `${exports.SETTINGS_REVISION_PREFIX}${digest}`;
272
+ }
273
+ readDisk() {
274
+ let bytes;
275
+ try {
276
+ bytes = (0, fs_1.readFileSync)(this.documentPath);
277
+ }
278
+ catch (error) {
279
+ if (error.code === 'ENOENT') {
280
+ const revision = this.revision(null);
281
+ const document = immutableDocument({});
282
+ const snapshot = Object.freeze({
283
+ revision,
284
+ state: 'ready',
285
+ hasDocument: false,
286
+ document,
287
+ lastGoodRevision: revision,
288
+ });
289
+ return { snapshot, bytes: null, currentDocument: {} };
290
+ }
291
+ const fallback = this.lastGood;
292
+ const snapshot = Object.freeze({
293
+ revision: fallback?.revision ?? this.revision(null),
294
+ state: 'unavailable',
295
+ hasDocument: (0, fs_1.existsSync)(this.documentPath),
296
+ document: fallback?.document ?? immutableDocument({}),
297
+ ...(fallback ? { lastGoodRevision: fallback.revision } : {}),
298
+ diagnostic: Object.freeze({
299
+ code: 'settings_document_unavailable',
300
+ message: 'The settings document is unavailable.',
301
+ }),
302
+ });
303
+ return { snapshot, bytes: null, currentDocument: null };
304
+ }
305
+ const revision = this.revision(bytes);
306
+ try {
307
+ const document = (0, global_config_1.parseGlobalConfigDocumentStrict)(bytes);
308
+ const immutable = immutableDocument(document);
309
+ return {
310
+ snapshot: Object.freeze({
311
+ revision,
312
+ state: 'ready',
313
+ hasDocument: true,
314
+ document: immutable,
315
+ lastGoodRevision: revision,
316
+ }),
317
+ bytes,
318
+ currentDocument: cloneDocument(document),
319
+ };
320
+ }
321
+ catch (error) {
322
+ if (!(error instanceof global_config_1.GlobalConfigDocumentValidationError))
323
+ throw error;
324
+ const fallback = this.lastGood;
325
+ return {
326
+ snapshot: Object.freeze({
327
+ revision,
328
+ state: 'invalid',
329
+ hasDocument: true,
330
+ document: fallback?.document ?? immutableDocument({}),
331
+ ...(fallback ? { lastGoodRevision: fallback.revision } : {}),
332
+ diagnostic: Object.freeze({
333
+ code: 'settings_document_invalid',
334
+ message: 'The settings document is invalid. Repair it before saving settings.',
335
+ }),
336
+ }),
337
+ bytes,
338
+ currentDocument: null,
339
+ };
340
+ }
341
+ }
342
+ remember(read, markWatcherObserved = false) {
343
+ if (read.snapshot.state === 'ready' && read.currentDocument) {
344
+ this.lastGood = Object.freeze({
345
+ revision: read.snapshot.revision,
346
+ hasDocument: read.snapshot.hasDocument,
347
+ document: immutableDocument(read.currentDocument),
348
+ });
349
+ }
350
+ this.lastReadSignature = `${read.snapshot.state}:${read.snapshot.revision}`;
351
+ if (markWatcherObserved)
352
+ this.lastObservedSignature = this.lastReadSignature;
353
+ return cloneSnapshot(read.snapshot);
354
+ }
355
+ /** Strictly read current bytes. Invalid bytes never become defaults. */
356
+ read() {
357
+ this.assertOpen();
358
+ return this.remember(this.readDisk());
359
+ }
360
+ /** Whether the current document (or its directory when missing) is locally writable. */
361
+ isWritable(snapshot = this.read()) {
362
+ if (snapshot.state !== 'ready')
363
+ return false;
364
+ try {
365
+ (0, fs_1.accessSync)(snapshot.hasDocument ? this.documentPath : (0, path_1.dirname)(this.documentPath), fs_1.constants.W_OK);
366
+ return true;
367
+ }
368
+ catch {
369
+ return false;
370
+ }
371
+ }
372
+ /** Apply a typed batch under one cross-process lock and one atomic rename. */
373
+ persist(workspace, expectedRevision, operations) {
374
+ this.assertOpen();
375
+ const validatedOperations = validateSettingsOperationsV1(operations);
376
+ return withRedactedFileLock(this.documentPath, this.lockWaitMs, 'settings_document_unavailable', 'The settings document could not be persisted.', () => {
377
+ const before = this.readDisk();
378
+ if (before.snapshot.state === 'invalid') {
379
+ throw new SettingsDocumentRepositoryError('settings_document_invalid', 'The settings document is invalid.');
380
+ }
381
+ if (before.snapshot.state !== 'ready' || !before.currentDocument) {
382
+ throw new SettingsDocumentRepositoryError('settings_document_unavailable', 'The settings document is unavailable.');
383
+ }
384
+ if (!secureRevisionEqual(expectedRevision, before.snapshot.revision)) {
385
+ throw new SettingsDocumentRepositoryError('settings_revision_conflict', 'The settings document changed before this update.');
386
+ }
387
+ const base = before.snapshot.hasDocument
388
+ ? before.currentDocument
389
+ : { schemaVersion: 1 };
390
+ // The composition root owns workspace canonicalization. Re-keying to a
391
+ // git root here would diverge from existing getProjectConfig(cwd).
392
+ const candidate = applyOperations(base, workspace, validatedOperations);
393
+ try {
394
+ (0, global_config_1.validateGlobalConfigDocumentStrict)(candidate);
395
+ this.validateCandidate?.(immutableDocument(candidate));
396
+ }
397
+ catch {
398
+ throw new SettingsDocumentRepositoryError('settings_rejected', 'The candidate settings document was rejected.');
399
+ }
400
+ const bytes = Buffer.from(JSON.stringify(candidate, null, 2), 'utf8');
401
+ (0, atomic_write_1.atomicWriteFileSync)(this.documentPath, bytes, { mode: 0o600, fsync: true });
402
+ const revision = this.revision(bytes);
403
+ const snapshot = Object.freeze({
404
+ revision,
405
+ state: 'ready',
406
+ hasDocument: true,
407
+ document: immutableDocument(candidate),
408
+ lastGoodRevision: revision,
409
+ });
410
+ this.remember({ snapshot, bytes, currentDocument: candidate }, true);
411
+ const rollbackToken = Object.freeze({
412
+ committedRevision: revision,
413
+ previousBytes: before.bytes ? Buffer.from(before.bytes) : null,
414
+ });
415
+ return Object.freeze({
416
+ revision,
417
+ appliedKeys: Object.freeze(validatedOperations.map(operation => operation.key)),
418
+ snapshot: cloneSnapshot(snapshot),
419
+ rollbackToken,
420
+ });
421
+ });
422
+ }
423
+ /** Conditionally restore the exact previous bytes after a Runtime apply failure. */
424
+ rollback(rollbackToken) {
425
+ this.assertOpen();
426
+ if (!isRecord(rollbackToken)) {
427
+ throw new SettingsDocumentRepositoryError('settings_recovery_required', 'The settings rollback token is invalid.');
428
+ }
429
+ const token = rollbackToken;
430
+ if (typeof token.committedRevision !== 'string' ||
431
+ (token.previousBytes !== null && !Buffer.isBuffer(token.previousBytes))) {
432
+ throw new SettingsDocumentRepositoryError('settings_recovery_required', 'The settings rollback token is invalid.');
433
+ }
434
+ return withRedactedFileLock(this.documentPath, this.lockWaitMs, 'settings_recovery_required', 'The settings document could not be recovered safely.', () => {
435
+ const current = this.readDisk();
436
+ if (current.snapshot.state !== 'ready' ||
437
+ !secureRevisionEqual(current.snapshot.revision, token.committedRevision)) {
438
+ throw new SettingsDocumentRepositoryError('settings_recovery_required', 'The settings document changed before recovery completed.');
439
+ }
440
+ if (token.previousBytes === null) {
441
+ try {
442
+ (0, fs_1.unlinkSync)(this.documentPath);
443
+ }
444
+ catch (error) {
445
+ if (error.code !== 'ENOENT')
446
+ throw error;
447
+ }
448
+ }
449
+ else {
450
+ try {
451
+ (0, global_config_1.parseGlobalConfigDocumentStrict)(token.previousBytes);
452
+ }
453
+ catch {
454
+ throw new SettingsDocumentRepositoryError('settings_recovery_required', 'The previous settings document cannot be recovered safely.');
455
+ }
456
+ (0, atomic_write_1.atomicWriteFileSync)(this.documentPath, token.previousBytes, { mode: 0o600, fsync: true });
457
+ }
458
+ return this.remember(this.readDisk(), true);
459
+ });
460
+ }
461
+ /** Create the minimal canonical document when the pathless advanced action needs one. */
462
+ ensureDocument() {
463
+ this.assertOpen();
464
+ return withRedactedFileLock(this.documentPath, this.lockWaitMs, 'settings_document_unavailable', 'The settings document could not be created safely.', () => {
465
+ const current = this.readDisk();
466
+ // An invalid existing document is still openable for manual repair;
467
+ // this method must only refuse to overwrite it.
468
+ if (current.snapshot.state === 'invalid') {
469
+ return Object.freeze({ created: false, snapshot: this.remember(current) });
470
+ }
471
+ if (current.snapshot.state !== 'ready') {
472
+ throw new SettingsDocumentRepositoryError('settings_document_unavailable', 'The settings document is unavailable.');
473
+ }
474
+ if (current.snapshot.hasDocument) {
475
+ return Object.freeze({ created: false, snapshot: this.remember(current) });
476
+ }
477
+ const document = { schemaVersion: 1 };
478
+ const bytes = Buffer.from(JSON.stringify(document, null, 2), 'utf8');
479
+ (0, atomic_write_1.atomicWriteFileSync)(this.documentPath, bytes, { mode: 0o600, fsync: true });
480
+ return Object.freeze({ created: true, snapshot: this.remember(this.readDisk(), true) });
481
+ });
482
+ }
483
+ /** Watch atomic replacements by observing the containing directory. */
484
+ watch(listener) {
485
+ this.assertOpen();
486
+ this.listeners.add(listener);
487
+ if (!this.watcher) {
488
+ const directory = (0, path_1.dirname)(this.documentPath);
489
+ const targetName = (0, path_1.basename)(this.documentPath);
490
+ const baselineSignature = this.lastReadSignature;
491
+ this.watcher = (0, fs_1.watch)(directory, (_eventType, filename) => {
492
+ if (filename !== null && filename.toString() !== targetName)
493
+ return;
494
+ if (this.watchTimer)
495
+ clearTimeout(this.watchTimer);
496
+ this.watchTimer = setTimeout(() => this.refreshWatcher(), this.watchDebounceMs);
497
+ });
498
+ this.watcher.on('error', () => this.stopWatcher());
499
+ // Close the read-before-watch race: re-read after the native watcher exists.
500
+ this.refreshWatcher(baselineSignature);
501
+ }
502
+ return () => {
503
+ this.listeners.delete(listener);
504
+ if (this.listeners.size === 0)
505
+ this.stopWatcher();
506
+ };
507
+ }
508
+ refreshWatcher(compareWith = this.lastObservedSignature) {
509
+ if (this.closed)
510
+ return;
511
+ this.watchTimer = null;
512
+ const read = this.readDisk();
513
+ const signature = `${read.snapshot.state}:${read.snapshot.revision}`;
514
+ this.remember(read, true);
515
+ if (compareWith === null ||
516
+ signature === compareWith ||
517
+ read.snapshot.state === 'unavailable') {
518
+ return;
519
+ }
520
+ const event = Object.freeze({
521
+ revision: read.snapshot.revision,
522
+ reason: 'external-edit',
523
+ state: read.snapshot.state,
524
+ });
525
+ for (const listener of this.listeners) {
526
+ try {
527
+ listener(event);
528
+ }
529
+ catch {
530
+ // Watcher delivery is advisory; one observer cannot break durable CAS.
531
+ }
532
+ }
533
+ }
534
+ stopWatcher() {
535
+ if (this.watchTimer)
536
+ clearTimeout(this.watchTimer);
537
+ this.watchTimer = null;
538
+ this.watcher?.close();
539
+ this.watcher = null;
540
+ }
541
+ close() {
542
+ if (this.closed)
543
+ return;
544
+ this.closed = true;
545
+ this.stopWatcher();
546
+ this.listeners.clear();
547
+ this.revisionKey.fill(0);
548
+ }
549
+ }
550
+ exports.SettingsDocumentRepository = SettingsDocumentRepository;
551
+ //# sourceMappingURL=settings-document-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-document-repository.js","sourceRoot":"","sources":["../../src/services/settings-document-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface WorkspaceRegistryEntryV1 {
2
+ readonly id: string;
3
+ readonly canonicalPath: string;
4
+ readonly label: string;
5
+ readonly lastActivatedAt: string;
6
+ readonly pinnedOrder?: number;
7
+ }
8
+ export interface WorkspaceRegistryOptions {
9
+ readonly storagePath?: string;
10
+ readonly now?: () => Date;
11
+ readonly createId?: () => string;
12
+ }
13
+ export declare class WorkspaceRegistryError extends Error {
14
+ readonly code: 'workspace_registry_invalid' | 'workspace_registry_capacity' | 'workspace_unavailable';
15
+ constructor(message: string, code: 'workspace_registry_invalid' | 'workspace_registry_capacity' | 'workspace_unavailable');
16
+ }
17
+ /**
18
+ * Durable registry of directories the user explicitly opened in Orion.
19
+ *
20
+ * Paths are canonicalized before becoming identities. Mutations take the
21
+ * repository-wide file lock so two local Orion processes cannot silently
22
+ * overwrite each other's project list.
23
+ */
24
+ export declare class WorkspaceRegistryV1 {
25
+ private readonly storagePath;
26
+ private readonly now;
27
+ private readonly createId;
28
+ constructor(options?: WorkspaceRegistryOptions);
29
+ list(): readonly WorkspaceRegistryEntryV1[];
30
+ register(path: string, options?: {
31
+ readonly activated?: boolean;
32
+ }): WorkspaceRegistryEntryV1;
33
+ registerKnown(paths: readonly string[], activePath?: string): readonly WorkspaceRegistryEntryV1[];
34
+ find(id: string): WorkspaceRegistryEntryV1 | undefined;
35
+ setPinned(id: string, pinned: boolean): WorkspaceRegistryEntryV1;
36
+ remove(id: string): boolean;
37
+ private readDocument;
38
+ private writeDocument;
39
+ private ensureStorageDirectory;
40
+ }
41
+ export declare function canonicalWorkspaceDirectory(path: string): string;
42
+ //# sourceMappingURL=workspace-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-registry.d.ts","sourceRoot":"","sources":["../../src/services/workspace-registry.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAOD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;CAClC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAG7C,QAAQ,CAAC,IAAI,EACT,4BAA4B,GAC5B,6BAA6B,GAC7B,uBAAuB;gBAJ3B,OAAO,EAAE,MAAM,EACN,IAAI,EACT,4BAA4B,GAC5B,6BAA6B,GAC7B,uBAAuB;CAK9B;AAED;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,OAAO,GAAE,wBAA6B;IAMlD,IAAI,IAAI,SAAS,wBAAwB,EAAE;IAI3C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,wBAAwB;IA4BhG,aAAa,CACX,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,SAAS,wBAAwB,EAAE;IAiCtC,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAItD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,wBAAwB;IAwBhE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAW3B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,sBAAsB;CAG/B;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBhE"}