openpond 0.1.0 → 0.2.0

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 (137) hide show
  1. package/README.md +4 -4
  2. package/dist/cache.d.ts +7 -10
  3. package/dist/chunks/{app-layer-XEYHFJHI.js → app-layer-F3CGXB33.js} +9 -7
  4. package/dist/chunks/{app-server-runtime-Y6MW4XCG.js → app-server-runtime-RHO5TFUC.js} +9 -7
  5. package/dist/chunks/{apps-GSXUDK6V.js → apps-L5XCL7QY.js} +12 -10
  6. package/dist/chunks/{chunk-J7PYGDRY.js → chunk-26AMV5ZI.js} +1 -1
  7. package/dist/chunks/{chunk-DNXBJZAU.js → chunk-3EB7I67T.js} +1 -1
  8. package/dist/chunks/{chunk-J3YDKJFD.js → chunk-3ELF4FXY.js} +19 -11
  9. package/dist/chunks/{chunk-HFPUR4CQ.js → chunk-3VEYNDHN.js} +10 -10
  10. package/dist/chunks/chunk-4KA25HUP.js +5648 -0
  11. package/dist/chunks/{chunk-EFET7LB7.js → chunk-6SMNG6YA.js} +62 -90
  12. package/dist/chunks/{chunk-N3TGCM7J.js → chunk-7RIGZB7N.js} +50 -37
  13. package/dist/chunks/{chunk-47EIAYI7.js → chunk-A6G3PFA5.js} +6 -4
  14. package/dist/chunks/{chunk-D7BO5Y5J.js → chunk-FJ2JGB2N.js} +31 -189
  15. package/dist/chunks/{chunk-WBAZFKC7.js → chunk-G65WAOJV.js} +2 -2
  16. package/dist/chunks/{chunk-CNTM26OW.js → chunk-K4TZEHAW.js} +16 -16
  17. package/dist/chunks/{chunk-AN2EYCN3.js → chunk-KCRCIQPD.js} +1 -5
  18. package/dist/chunks/chunk-OCBRPU2K.js +629 -0
  19. package/dist/chunks/{chunk-2JABRRNR.js → chunk-PS37DB5F.js} +1 -1
  20. package/dist/chunks/{chunk-TGM5IPYO.js → chunk-UZMVNKXM.js} +1 -1
  21. package/dist/chunks/{chunk-TZWAUV2L.js → chunk-VT6BLHMB.js} +10750 -1240
  22. package/dist/chunks/{chunk-5TKZBMQM.js → chunk-X6F4LBTQ.js} +102 -1
  23. package/dist/chunks/{chunk-6G6MDZLM.js → chunk-XA4KBDMY.js} +213 -999
  24. package/dist/chunks/chunk-ZNQEROWP.js +254 -0
  25. package/dist/chunks/{cli-L5VPOV6I.js → cli-D2MUUBEX.js} +7 -5
  26. package/dist/chunks/configuration-command-NR6JYIUD.js +187 -0
  27. package/dist/chunks/{continual-FYDKLCO7.js → continual-37CE4LLJ.js} +4 -4
  28. package/dist/chunks/{core-commands-MAN3CSJQ.js → core-commands-SWGIOZLW.js} +8 -6
  29. package/dist/chunks/database-DEYUZDIM.js +20 -0
  30. package/dist/chunks/{desktop-test-OE5SST2W.js → desktop-test-QOS7G5NE.js} +8 -6
  31. package/dist/chunks/dist-AKYCQNNF.js +187 -0
  32. package/dist/chunks/{extension-J3CIEDP4.js → extension-HJUJBQAD.js} +67 -730
  33. package/dist/chunks/{help-JNGJJFU5.js → help-J6PZ23IC.js} +1 -1
  34. package/dist/chunks/{opchat-6HEQJFLL.js → opchat-ABX5YBAT.js} +9 -7
  35. package/dist/chunks/{organizations-MWAPNOCK.js → organizations-CPNC47DO.js} +8 -6
  36. package/dist/chunks/{profile-P7HMONTZ.js → profile-Q3HB5MIO.js} +16 -14
  37. package/dist/chunks/{project-agent-2RAK7GAZ.js → project-agent-YHUBX4OR.js} +9 -7
  38. package/dist/chunks/{sandbox-command-G22CPFNK.js → sandbox-command-YFL5QTWX.js} +8 -6
  39. package/dist/chunks/{sandbox-template-S4WRUWJ6.js → sandbox-template-Z6P7NTNF.js} +12 -10
  40. package/dist/chunks/{src-BKBZ7WLO.js → src-7XEENEBI.js} +16 -12
  41. package/dist/chunks/{src-A6O6ZGIL.js → src-KBBIV4NT.js} +1338 -10969
  42. package/dist/chunks/{taskset-BMI7KOWP.js → taskset-2TRZBRRT.js} +1 -1
  43. package/dist/chunks/{teams-bot-5VBYEN7M.js → teams-bot-WD33NLH5.js} +7 -5
  44. package/dist/chunks/{training-UPVSGDTB.js → training-4XH37UZB.js} +1 -1
  45. package/dist/chunks/{workspaces-XM5BY3MO.js → workspaces-WG2MH2WE.js} +2 -2
  46. package/dist/cli.js +25 -17
  47. package/dist/client.d.ts +1 -1
  48. package/dist/config.d.ts +1 -0
  49. package/dist/index.js +20803 -15878
  50. package/dist/private-json-file.d.ts +1 -2
  51. package/dist/skills/openpond-desktop-harness/SKILL.md +1 -1
  52. package/dist/web/assets/App-C9aGkxVg.js +173 -0
  53. package/dist/web/assets/{AppDialog-CSXu5wRu.js → AppDialog-CK6_lg8c.js} +1 -1
  54. package/dist/web/assets/{AppTerminalPanel-y2bVL2RV.js → AppTerminalPanel-BKqgX4sd.js} +2 -2
  55. package/dist/web/assets/{AppsView-Bs9pwD2H.js → AppsView-B1NUuAIf.js} +1 -1
  56. package/dist/web/assets/{BrowserSidebar-CUgT5V1m.js → BrowserSidebar-DOvYxXeP.js} +1 -1
  57. package/dist/web/assets/{CartesianChart-DA85hfrP.js → CartesianChart-pOrYpzBr.js} +1 -1
  58. package/dist/web/assets/{CollaborationTabs-B8mlPhM3.js → CollaborationTabs-CgbR-MBJ.js} +1 -1
  59. package/dist/web/assets/{CommandMenu-EwUGCeC_.js → CommandMenu-CrIr4qUX.js} +1 -1
  60. package/dist/web/assets/{CommunityView-IHNq-YJz.js → CommunityView-CvAVQ_HZ.js} +1 -1
  61. package/dist/web/assets/{ComposerCreateImproveStrip-qOL2zA26.js → ComposerCreateImproveStrip-DybcKwwd.js} +1 -1
  62. package/dist/web/assets/GetStartedView-DVInkexN.js +1 -0
  63. package/dist/web/assets/{LabModelVersionDetailPage-BK0eoUlW.js → LabModelVersionDetailPage-NaaPElmM.js} +1 -1
  64. package/dist/web/assets/{LabSkillSidebar-CRPb4qBn.js → LabSkillSidebar-CuaYrtiu.js} +1 -1
  65. package/dist/web/assets/LabsRoute-BRR6x3SX.js +2 -0
  66. package/dist/web/assets/{MainChatThread-Cu6_UnNE.js → MainChatThread-BfkjCZB9.js} +2 -2
  67. package/dist/web/assets/MainPane-Gw-YK38n.js +8 -0
  68. package/dist/web/assets/{MarkdownText-N60tvLug.js → MarkdownText-DOlVQR8a.js} +1 -1
  69. package/dist/web/assets/{Messages-CYQFLElK.js → Messages-DMubppta.js} +6 -6
  70. package/dist/web/assets/{NativeSkillSidebar-zbx7WmOk.js → NativeSkillSidebar-DSFwZ-od.js} +1 -1
  71. package/dist/web/assets/{NewExperienceSwitcher-B0zev5Sx.js → NewExperienceSwitcher-Dj0ePIJ-.js} +1 -1
  72. package/dist/web/assets/{NewProjectDialog-lZlzrp-R.js → NewProjectDialog-B8NQV-Ji.js} +1 -1
  73. package/dist/web/assets/{OutputsPage-B4zYYUT5.js → OutputsPage-D_LDYTgV.js} +1 -1
  74. package/dist/web/assets/{ProjectsPage-97wgc84s.js → ProjectsPage-xjDYPc_W.js} +1 -1
  75. package/dist/web/assets/RightChatPanelStack-BktRQ9wg.js +1 -0
  76. package/dist/web/assets/{RightSidebarHomePanel-BUcWVJi-.js → RightSidebarHomePanel-j0VckZUu.js} +1 -1
  77. package/dist/web/assets/ScheduledWorkPage-1aT4bBY-.js +1 -0
  78. package/dist/web/assets/SettingsView-BSpuMDpv.js +9 -0
  79. package/dist/web/assets/SettingsView-CAH0vreE.css +1 -0
  80. package/dist/web/assets/{TeamChatView-Fj5_yjVE.js → TeamChatView-BPWJbDf1.js} +2 -2
  81. package/dist/web/assets/{TerminalOverlay-D2WBeJvp.js → TerminalOverlay-CrSwUk2d.js} +1 -1
  82. package/dist/web/assets/{TrainingCreationPanel-dYW_dh3M.js → TrainingCreationPanel-B4HMRwUg.js} +1 -1
  83. package/dist/web/assets/{TrainingDraftPanel-zeJWmmW6.js → TrainingDraftPanel-D4r1tN3I.js} +1 -1
  84. package/dist/web/assets/{UsageSettingsSection-B6SBqYuB.js → UsageSettingsSection-2aymqwIM.js} +1 -1
  85. package/dist/web/assets/{WorkSidebarPanel-BwbWKpOZ.js → WorkSidebarPanel-B0X0OiR6.js} +1 -1
  86. package/dist/web/assets/WorkspaceDiffPanel-Pg7GL0br.js +14 -0
  87. package/dist/web/assets/{WorkspaceEnvironmentMenu-D-3YGp06.js → WorkspaceEnvironmentMenu-OAfMEt7L.js} +3 -3
  88. package/dist/web/assets/{WorkspaceGitDialogs-BUbzUN4m.js → WorkspaceGitDialogs-YxcPH2Rq.js} +1 -1
  89. package/dist/web/assets/{WorkspaceMonacoEditor-CXPY7bBI.js → WorkspaceMonacoEditor-COKTiQZl.js} +3 -3
  90. package/dist/web/assets/{arrow-up-right-C7VWgGQP.js → arrow-up-right-_TX-awvK.js} +1 -1
  91. package/dist/web/assets/{chat-file-links-CqfMdhHQ.js → chat-file-links-CWLsRYvW.js} +1 -1
  92. package/dist/web/assets/chevron-up--mNnEqha.js +1 -0
  93. package/dist/web/assets/{clipboard-B-8k7mlT.js → clipboard-CyRSS8Sy.js} +1 -1
  94. package/dist/web/assets/{cloud-upload-CUVFzURz.js → cloud-upload-uBJBUYTy.js} +1 -1
  95. package/dist/web/assets/{cssMode-DYvfmqoL.js → cssMode-BrXSsZYs.js} +1 -1
  96. package/dist/web/assets/{folder-open-CnbcQIy8.js → folder-open-DktdZNW7.js} +1 -1
  97. package/dist/web/assets/{folder-plus-BOaLAKy4.js → folder-plus-DO06i9Vo.js} +1 -1
  98. package/dist/web/assets/{git-commit-horizontal-DQeHsooT.js → git-commit-horizontal-zFSIkPs7.js} +1 -1
  99. package/dist/web/assets/{htmlMode-BXEI-BVY.js → htmlMode-X9UMFkjt.js} +1 -1
  100. package/dist/web/assets/index-BEPmTPIA.js +1 -0
  101. package/dist/web/assets/{index-CGMb_VXm.css → index-ByQIHpc9.css} +1 -1
  102. package/dist/web/assets/{index-D-VK8mST.js → index-UOGdfLzi.js} +1 -1
  103. package/dist/web/assets/{info-DtzDuGLn.js → info-BEJXUqCD.js} +1 -1
  104. package/dist/web/assets/{jsonMode-Dosjh_hK.js → jsonMode-DIsB-j2E.js} +1 -1
  105. package/dist/web/assets/{lspLanguageFeatures-BNe-6FJA.js → lspLanguageFeatures-CmZ17KpA.js} +1 -1
  106. package/dist/web/assets/{minimize-2-DnxKN5oK.js → minimize-2-DumTpFtE.js} +1 -1
  107. package/dist/web/assets/{monaco.contribution-CfF-ajhi.js → monaco.contribution-D6w5PJji.js} +2 -2
  108. package/dist/web/assets/{monaco.contribution-ytyanGyj.js → monaco.contribution-DJ_NmcHu.js} +2 -2
  109. package/dist/web/assets/{monaco.contribution-CnkROzNv.js → monaco.contribution-LZEujgny.js} +2 -2
  110. package/dist/web/assets/{monaco.contribution-Dyns81H2.js → monaco.contribution-YVDfJcG4.js} +2 -2
  111. package/dist/web/assets/{play-B3o6IAQd.js → play-CLFeH7CU.js} +1 -1
  112. package/dist/web/assets/{python-B7zZ_9Z_.js → python-Djbda_qZ.js} +1 -1
  113. package/dist/web/assets/{refresh-cw-DSJZXa8S.js → refresh-cw-B4IpQ_7Q.js} +1 -1
  114. package/dist/web/assets/{save-iC-AXHN6.js → save-BbTHztnA.js} +1 -1
  115. package/dist/web/assets/{square-B2roZTxf.js → square-BJrVbmz6.js} +1 -1
  116. package/dist/web/assets/{toggleHighContrast-CjlV4YHK.js → toggleHighContrast-BopU5W9S.js} +1 -1
  117. package/dist/web/assets/{tsMode-XmKmSq0B.js → tsMode-CH_0_YDX.js} +1 -1
  118. package/dist/web/assets/{upload-BgHXNjfJ.js → upload-UumVeufu.js} +1 -1
  119. package/dist/web/assets/{useLocalAgentSchedules-CVJz0AMr.js → useLocalAgentSchedules-BRa23U7O.js} +1 -1
  120. package/dist/web/assets/{wifi-off-CneL8bDZ.js → wifi-off-BWJWivn6.js} +1 -1
  121. package/dist/web/assets/{workers-CT7VYBR5.js → workers-pTe8RvSI.js} +1 -1
  122. package/dist/web/assets/{yaml-CF8jchCz.js → yaml-DNLASORn.js} +1 -1
  123. package/dist/web/index.html +2 -2
  124. package/docs/command-reference.md +28 -2
  125. package/package.json +7 -5
  126. package/dist/chunks/chunk-P6JLLWMI.js +0 -238
  127. package/dist/web/assets/App-DfiCmBv6.js +0 -173
  128. package/dist/web/assets/GetStartedView-C2ypO0v7.js +0 -1
  129. package/dist/web/assets/LabsRoute-Bw-HD6QC.js +0 -2
  130. package/dist/web/assets/MainPane-k1iII9e9.js +0 -8
  131. package/dist/web/assets/RightChatPanelStack-I2znDCc7.js +0 -1
  132. package/dist/web/assets/ScheduledWorkPage-Bp-t0eVj.js +0 -1
  133. package/dist/web/assets/SettingsView-BRPrJuP5.css +0 -1
  134. package/dist/web/assets/SettingsView-C1xyn1Y4.js +0 -6
  135. package/dist/web/assets/WorkspaceDiffPanel-D9Kp0vFw.js +0 -14
  136. package/dist/web/assets/chevron-up-DD9Tei-Q.js +0 -1
  137. package/dist/web/assets/index-D-WCyNdJ.js +0 -1
@@ -0,0 +1,254 @@
1
+ import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
+
3
+ // ../../packages/persistence/dist/private-permissions.js
4
+ import { execFileSync } from "node:child_process";
5
+ import { chmodSync, lstatSync } from "node:fs";
6
+
7
+ // ../../packages/persistence/dist/errors.js
8
+ var PersistenceError = class extends Error {
9
+ issue;
10
+ constructor(issue, options) {
11
+ super(issue.message, options);
12
+ this.name = "PersistenceError";
13
+ this.issue = issue;
14
+ }
15
+ };
16
+ function persistenceIssue(error, filePath) {
17
+ if (error instanceof PersistenceError)
18
+ return error.issue;
19
+ return { code: "STORAGE_UNAVAILABLE", path: filePath, message: "OpenPond could not access its storage.", action: "Check the folder permissions and available disk space, then retry." };
20
+ }
21
+ function isMissing(error) {
22
+ return error?.code === "ENOENT";
23
+ }
24
+
25
+ // ../../packages/persistence/dist/windows-powershell.js
26
+ function windowsPowerShellEnvironment(extra = {}) {
27
+ const env = { ...process.env, ...extra };
28
+ for (const key of Object.keys(env))
29
+ if (key.toLowerCase() === "psmodulepath")
30
+ delete env[key];
31
+ return env;
32
+ }
33
+
34
+ // ../../packages/persistence/dist/private-permissions.js
35
+ var secured = /* @__PURE__ */ new Map();
36
+ var setOwnerAcl = [
37
+ "$ErrorActionPreference='Stop'",
38
+ "$identity=[System.Security.Principal.WindowsIdentity]::GetCurrent().User",
39
+ "$acl=New-Object System.Security.AccessControl.DirectorySecurity",
40
+ "$acl.SetOwner($identity)",
41
+ "$acl.SetAccessRuleProtection($true,$false)",
42
+ "$rule=New-Object System.Security.AccessControl.FileSystemAccessRule($identity,'FullControl','ContainerInherit,ObjectInherit','None','Allow')",
43
+ "$acl.AddAccessRule($rule)",
44
+ "Set-Acl -LiteralPath $env:OPENPOND_PRIVATE_DIRECTORY -AclObject $acl"
45
+ ].join("; ");
46
+ function protectPrivateDirectory(directory) {
47
+ if (process.platform !== "win32") {
48
+ chmodSync(directory, 448);
49
+ return;
50
+ }
51
+ const stat = lstatSync(directory);
52
+ const identity = `${stat.dev}:${stat.ino}:${stat.birthtimeMs}`;
53
+ if (secured.get(directory) === identity)
54
+ return;
55
+ try {
56
+ execFileSync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", setOwnerAcl], {
57
+ env: windowsPowerShellEnvironment({ OPENPOND_PRIVATE_DIRECTORY: directory }),
58
+ stdio: ["ignore", "ignore", "pipe"],
59
+ timeout: 3e4,
60
+ windowsHide: true
61
+ });
62
+ secured.set(directory, identity);
63
+ } catch (cause) {
64
+ throw new PersistenceError({
65
+ code: "PRIVATE_STORAGE_UNAVAILABLE",
66
+ path: directory,
67
+ message: "OpenPond could not restrict this storage folder to its owner.",
68
+ action: "Use a local folder that supports private access controls, then retry."
69
+ }, { cause });
70
+ }
71
+ }
72
+
73
+ // ../../packages/persistence/dist/path-safety.js
74
+ import { lstatSync as lstatSync2 } from "node:fs";
75
+ import path from "node:path";
76
+ function assertStorageAncestors(file) {
77
+ let directory = path.resolve(file);
78
+ while (true) {
79
+ try {
80
+ const stat = lstatSync2(directory);
81
+ const systemAlias = process.platform === "darwin" && ["/tmp", "/var", "/etc"].includes(directory);
82
+ if (stat.isSymbolicLink() && !systemAlias)
83
+ throw new PersistenceError({ code: "UNSAFE_STORAGE_PATH", path: directory, message: "A managed storage path passes through a symbolic link.", action: "Use the canonical local folder and keep managed subdirectories inside that home." });
84
+ } catch (error) {
85
+ if (!isMissing(error))
86
+ throw error;
87
+ }
88
+ const parent = path.dirname(directory);
89
+ if (parent === directory)
90
+ return;
91
+ directory = parent;
92
+ }
93
+ }
94
+
95
+ // ../../packages/persistence/dist/database.js
96
+ import { mkdirSync, chmodSync as chmodSync2, existsSync, lstatSync as lstatSync3 } from "node:fs";
97
+ import path4 from "node:path";
98
+ import { DatabaseSync } from "node:sqlite";
99
+
100
+ // ../../packages/persistence/dist/home-context.js
101
+ import { AsyncLocalStorage } from "node:async_hooks";
102
+ import path2 from "node:path";
103
+ var homes = new AsyncLocalStorage();
104
+ var currentOpenPondHome = () => homes.getStore();
105
+ function withOpenPondHome(home, operation) {
106
+ return homes.run(path2.resolve(home), operation);
107
+ }
108
+ function bindHomeCallbacks(home, callbacks) {
109
+ return Object.fromEntries(Object.entries(callbacks).map(([name, value]) => [name, typeof value === "function" ? (...args) => withOpenPondHome(home, () => value(...args)) : value]));
110
+ }
111
+
112
+ // ../../packages/persistence/dist/home.js
113
+ import os from "node:os";
114
+ import path3 from "node:path";
115
+ function resolveOpenPondHome(options = {}) {
116
+ const env = options.env ?? process.env;
117
+ const explicit = options.home?.trim() || (options.env ? void 0 : currentOpenPondHome()) || env.OPENPOND_HOME?.trim();
118
+ if (explicit)
119
+ return path3.resolve(expandHome(explicit));
120
+ for (const name of ["OPENPOND_APP_HOME", "OPENPOND_CONFIG_DIR"]) {
121
+ if (env[name]?.trim()) {
122
+ throw new PersistenceError({ code: "RETIRED_HOME_OPTION", path: name, message: `${name} has been replaced by OPENPOND_HOME.`, action: "Set OPENPOND_HOME to the destination home. Use openpond config migrate --source-app-home to import a previous installation." });
123
+ }
124
+ }
125
+ return path3.join(os.homedir(), options.channel === "nightly" ? ".openpond-nightly" : ".openpond");
126
+ }
127
+ function expandHome(value) {
128
+ return value === "~" ? os.homedir() : value.startsWith("~/") ? path3.join(os.homedir(), value.slice(2)) : value;
129
+ }
130
+ function storagePaths(home = resolveOpenPondHome()) {
131
+ const root = path3.resolve(home);
132
+ return {
133
+ home: root,
134
+ config: path3.join(root, "config.toml"),
135
+ marker: path3.join(root, "storage.json"),
136
+ database: path3.join(root, "state", "state.sqlite"),
137
+ cache: path3.join(root, "cache", "cache.sqlite"),
138
+ credentials: path3.join(root, "secrets", "credentials.json"),
139
+ key: path3.join(root, "secrets", "credentials.key"),
140
+ token: path3.join(root, "secrets", "server-token"),
141
+ runtime: path3.join(root, "runtime"),
142
+ library: path3.join(root, "library"),
143
+ instructions: path3.join(root, "instructions")
144
+ };
145
+ }
146
+ function resolveConfigPath(value, root, allowHome = true) {
147
+ return path3.resolve(root, allowHome ? expandHome(value) : value);
148
+ }
149
+
150
+ // ../../packages/persistence/dist/database.js
151
+ var PERSISTENCE_TABLES_SQL = `
152
+ CREATE TABLE IF NOT EXISTS scaffold_registrations (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
153
+ CREATE TABLE IF NOT EXISTS account_sessions (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
154
+ CREATE TABLE IF NOT EXISTS account_selection (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
155
+ CREATE TABLE IF NOT EXISTS profile_installations (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
156
+ CREATE TABLE IF NOT EXISTS extension_installations (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
157
+ CREATE TABLE IF NOT EXISTS client_preferences (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
158
+ CREATE TABLE IF NOT EXISTS saved_local_projects (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
159
+ CREATE TABLE IF NOT EXISTS codex_sidebar_state (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
160
+ CREATE TABLE IF NOT EXISTS browser_tab_state (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
161
+ CREATE TABLE IF NOT EXISTS project_trust (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
162
+ CREATE TABLE IF NOT EXISTS refiner_bindings (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
163
+ CREATE TABLE IF NOT EXISTS refiner_transitions (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
164
+ CREATE TABLE IF NOT EXISTS config_run_snapshots (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
165
+ CREATE TABLE IF NOT EXISTS provider_connection_state (id TEXT PRIMARY KEY, payload TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1);
166
+ `;
167
+ function openStorageDatabase(filePath, readOnly = false) {
168
+ assertStorageAncestors(path4.dirname(filePath));
169
+ if (!readOnly) {
170
+ mkdirSync(path4.dirname(filePath), { recursive: true, mode: 448 });
171
+ protectPrivateDirectory(path4.dirname(filePath));
172
+ }
173
+ if (existsSync(filePath) && lstatSync3(filePath).isSymbolicLink())
174
+ throw new PersistenceError({ code: "UNSAFE_STORAGE_PATH", path: filePath, message: "Storage database cannot be a symbolic link.", action: "Choose a regular local database file." });
175
+ const db = new DatabaseSync(filePath, { readOnly });
176
+ try {
177
+ db.exec("PRAGMA busy_timeout = 5000; PRAGMA foreign_keys = ON;");
178
+ if (!readOnly) {
179
+ db.exec("PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;");
180
+ if (process.platform !== "win32")
181
+ chmodSync2(filePath, 384);
182
+ }
183
+ return db;
184
+ } catch (error) {
185
+ db.close();
186
+ throw error;
187
+ }
188
+ }
189
+ function withLocalDatabase(home, action) {
190
+ const db = openStorageDatabase(storagePaths(home).database);
191
+ try {
192
+ db.exec(PERSISTENCE_TABLES_SQL);
193
+ return action(db);
194
+ } finally {
195
+ db.close();
196
+ }
197
+ }
198
+ function getLocalRecord(home, table, id) {
199
+ if (!existsSync(storagePaths(home).database))
200
+ return null;
201
+ return withLocalDatabase(home, (db) => {
202
+ const row = db.prepare(`SELECT payload, revision FROM ${table} WHERE id = ?`).get(id);
203
+ return row ? { value: JSON.parse(row.payload), revision: row.revision } : null;
204
+ });
205
+ }
206
+ function listLocalRecords(home, table) {
207
+ if (!existsSync(storagePaths(home).database))
208
+ return {};
209
+ return withLocalDatabase(home, (db) => Object.fromEntries(db.prepare(`SELECT id, payload, revision FROM ${table} ORDER BY id`).all().map((row) => [row.id, { value: JSON.parse(row.payload), revision: row.revision }])));
210
+ }
211
+ function putLocalRecord(home, table, id, value, expectedRevision) {
212
+ return withLocalDatabase(home, (db) => {
213
+ db.exec("BEGIN IMMEDIATE");
214
+ try {
215
+ const existing = db.prepare(`SELECT revision FROM ${table} WHERE id = ?`).get(id);
216
+ if (expectedRevision !== void 0 && expectedRevision !== (existing?.revision ?? null))
217
+ throw new PersistenceError({ code: "STATE_CONFLICT", path: table, message: "This record changed while it was being edited.", action: "Reload the latest record and retry." });
218
+ const revision = (existing?.revision ?? 0) + 1;
219
+ db.prepare(`INSERT INTO ${table} (id, payload, revision) VALUES (?, ?, ?) ON CONFLICT(id) DO UPDATE SET payload=excluded.payload, revision=excluded.revision`).run(id, JSON.stringify(value), revision);
220
+ db.exec("COMMIT");
221
+ return revision;
222
+ } catch (error) {
223
+ db.exec("ROLLBACK");
224
+ throw error;
225
+ }
226
+ });
227
+ }
228
+ function deleteLocalRecord(home, table, id) {
229
+ withLocalDatabase(home, (db) => {
230
+ db.prepare(`DELETE FROM ${table} WHERE id = ?`).run(id);
231
+ });
232
+ }
233
+
234
+ export {
235
+ withOpenPondHome,
236
+ bindHomeCallbacks,
237
+ PersistenceError,
238
+ persistenceIssue,
239
+ isMissing,
240
+ resolveOpenPondHome,
241
+ expandHome,
242
+ storagePaths,
243
+ resolveConfigPath,
244
+ windowsPowerShellEnvironment,
245
+ protectPrivateDirectory,
246
+ assertStorageAncestors,
247
+ PERSISTENCE_TABLES_SQL,
248
+ openStorageDatabase,
249
+ withLocalDatabase,
250
+ getLocalRecord,
251
+ listLocalRecords,
252
+ putLocalRecord,
253
+ deleteLocalRecord
254
+ };
@@ -3,14 +3,16 @@ import {
3
3
  resolveWebLaunchMessages,
4
4
  runOpenPondAppServerCli,
5
5
  runOpenPondServerCli
6
- } from "./chunk-P6JLLWMI.js";
7
- import "./chunk-5TKZBMQM.js";
8
- import "./chunk-AN2EYCN3.js";
9
- import "./chunk-EFET7LB7.js";
10
- import "./chunk-6G6MDZLM.js";
6
+ } from "./chunk-OCBRPU2K.js";
7
+ import "./chunk-X6F4LBTQ.js";
8
+ import "./chunk-6SMNG6YA.js";
9
+ import "./chunk-KCRCIQPD.js";
10
+ import "./chunk-XA4KBDMY.js";
11
11
  import "./chunk-NTK22KJD.js";
12
12
  import "./chunk-R3C3MNSI.js";
13
13
  import "./chunk-X7ZG4TSW.js";
14
+ import "./chunk-4KA25HUP.js";
15
+ import "./chunk-ZNQEROWP.js";
14
16
  import "./chunk-JTHL5XJ2.js";
15
17
  import "./chunk-FQS2QL5F.js";
16
18
  import "./chunk-UACZUFIA.js";
@@ -0,0 +1,187 @@
1
+ import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
+ import {
3
+ CliUsageError
4
+ } from "./chunk-PS37DB5F.js";
5
+ import {
6
+ MigrationResolutionsSchema,
7
+ atomicWriteFile,
8
+ clearCache,
9
+ collectArtifactOrphans,
10
+ configEditorSchema,
11
+ configRecoveryRevisions,
12
+ exportRecoveryBackup,
13
+ exportSettings,
14
+ fileRevision,
15
+ initializeHome,
16
+ patchConfig,
17
+ readConfig,
18
+ readOptionalFile,
19
+ recoverMigration,
20
+ replaceConfigText,
21
+ resolveEffectiveConfig,
22
+ restartMigration,
23
+ restoreConfigRevision,
24
+ restoreRecoveryBackup,
25
+ setProjectTrust,
26
+ validateConfigText
27
+ } from "./chunk-4KA25HUP.js";
28
+ import {
29
+ persistenceIssue,
30
+ resolveOpenPondHome,
31
+ storagePaths
32
+ } from "./chunk-ZNQEROWP.js";
33
+ import "./chunk-7RIGZB7N.js";
34
+ import "./chunk-FQS2QL5F.js";
35
+ import "./chunk-MUMPWI4O.js";
36
+ import "./chunk-UACZUFIA.js";
37
+
38
+ // src/cli/configuration-command.ts
39
+ import path from "node:path";
40
+ import { readFile } from "node:fs/promises";
41
+ var stringOption = (options, name) => typeof options[name] === "string" ? options[name] : void 0;
42
+ function print(value) {
43
+ console.log(JSON.stringify(value, null, 2));
44
+ }
45
+ function keyPath(options, fallback) {
46
+ const explicit = stringOption(options, "keyPath");
47
+ if (explicit) {
48
+ const parts = JSON.parse(explicit);
49
+ if (Array.isArray(parts) && parts.length && parts.every((part) => typeof part === "string" && part.length)) return parts;
50
+ throw new CliUsageError("--key-path must be a JSON array of key segments.");
51
+ }
52
+ if (!fallback) throw new CliUsageError("Specify a setting key, or --key-path for keys containing dots.");
53
+ return fallback.split(".");
54
+ }
55
+ async function runConfigurationCommand(options, rest) {
56
+ const home = resolveOpenPondHome({ home: stringOption(options, "home") });
57
+ const command = rest[0] ?? "get";
58
+ const file = storagePaths(home).config;
59
+ if (command === "path") {
60
+ console.log(file);
61
+ return;
62
+ }
63
+ if (command === "export") {
64
+ const value = await exportSettings(home), destination = stringOption(options, "file");
65
+ if (destination) {
66
+ await atomicWriteFile(path.resolve(destination), JSON.stringify(value, null, 2), { privateParent: false });
67
+ print({ path: path.resolve(destination), requiresRebinding: value.requiresRebinding });
68
+ } else print(value);
69
+ return;
70
+ }
71
+ if (command === "backup" || command === "restore") {
72
+ const file2 = stringOption(options, "file"), keyFile = stringOption(options, "keyFile");
73
+ if (!file2 || !keyFile) throw new CliUsageError(`config ${command} requires --file <encrypted-backup> and --key-file <separate-32-byte-key-file>.`);
74
+ const bytes = await readFile(keyFile);
75
+ const key = bytes.length === 32 ? bytes : Buffer.from(bytes.toString("utf8").trim(), "base64");
76
+ try {
77
+ print(command === "backup" ? await exportRecoveryBackup(home, file2, key) : await restoreRecoveryBackup(file2, home, key));
78
+ } finally {
79
+ key.fill(0);
80
+ bytes.fill(0);
81
+ }
82
+ return;
83
+ }
84
+ if (command === "collect-orphans") {
85
+ print(await collectArtifactOrphans(home));
86
+ return;
87
+ }
88
+ if (command === "schema") {
89
+ print(configEditorSchema());
90
+ return;
91
+ }
92
+ if (command === "migrate") {
93
+ const resolutionFile = stringOption(options, "resolutionFile");
94
+ const resolutions = resolutionFile ? MigrationResolutionsSchema.parse(JSON.parse(await readFile(resolutionFile, "utf8"))) : void 0;
95
+ print(await initializeHome(home, { resolutions, sourceAppHome: stringOption(options, "sourceAppHome"), sourceConfig: stringOption(options, "sourceConfig"), sourceBrowserState: stringOption(options, "sourceBrowserState"), dryRun: options.dryRun === true || options.dryRun === "true" }));
96
+ return;
97
+ }
98
+ if (command === "recover") {
99
+ const revision = stringOption(options, "revision");
100
+ if (revision) print(await restoreConfigRevision(home, revision, stringOption(options, "expectedRevision") ?? fileRevision(await readOptionalFile(file))));
101
+ else print(await recoverMigration(home));
102
+ return;
103
+ }
104
+ if (command === "restart-migration") {
105
+ print(await restartMigration(home));
106
+ return;
107
+ }
108
+ if (command === "effective") {
109
+ print(await resolveEffectiveConfig(home, { projectRoot: stringOption(options, "projectRoot"), accountId: stringOption(options, "accountId") }));
110
+ return;
111
+ }
112
+ if (command === "trust" || command === "untrust") {
113
+ const root = stringOption(options, "projectRoot") ?? rest[1];
114
+ if (!root) throw new CliUsageError("Specify the canonical project root with --project-root.");
115
+ await setProjectTrust(home, root, stringOption(options, "accountId") ?? "local", command === "trust");
116
+ print({ root, trusted: command === "trust" });
117
+ return;
118
+ }
119
+ if (command === "revisions") {
120
+ print(await configRecoveryRevisions(home));
121
+ return;
122
+ }
123
+ if (command === "validate") {
124
+ const inputFile = stringOption(options, "file") ?? file;
125
+ validateConfigText(await readFile(inputFile, "utf8"), inputFile, options.project === true || options.project === "true" ? "project" : "user");
126
+ print({ valid: true, path: inputFile });
127
+ return;
128
+ }
129
+ if (command === "replace") {
130
+ const source = stringOption(options, "file");
131
+ if (!source) throw new CliUsageError("config replace requires --file <validated-toml-file>.");
132
+ print(await replaceConfigText(home, stringOption(options, "expectedRevision") ?? fileRevision(await readOptionalFile(file)), await readFile(source, "utf8")));
133
+ return;
134
+ }
135
+ if (command === "doctor") {
136
+ const text = await readOptionalFile(file);
137
+ let issue = null;
138
+ try {
139
+ await readConfig(home);
140
+ } catch (error) {
141
+ issue = persistenceIssue(error, file);
142
+ }
143
+ print({ home, path: file, rawRevision: fileRevision(text), issue, recoverableRevisions: await configRecoveryRevisions(home), migration: await readOptionalFile(path.join(storagePaths(home).runtime, "migration.json")) !== null });
144
+ if (issue) process.exitCode = 1;
145
+ return;
146
+ }
147
+ await initializeHome(home);
148
+ if (command === "clear-cache") {
149
+ await clearCache(home);
150
+ print({ cleared: true, path: storagePaths(home).cache });
151
+ return;
152
+ }
153
+ const snapshot = await readConfig(home);
154
+ if (command === "get") {
155
+ if (!rest[1] && !options.keyPath) {
156
+ print(snapshot);
157
+ return;
158
+ }
159
+ let value = snapshot.document;
160
+ for (const key of keyPath(options, rest[1])) value = value && typeof value === "object" ? value[key] : void 0;
161
+ print(value ?? null);
162
+ return;
163
+ }
164
+ if (command === "set" || command === "unset") {
165
+ const at = keyPath(options, rest[1]);
166
+ let value;
167
+ if (command === "set") {
168
+ const raw = stringOption(options, "value") ?? rest[2];
169
+ if (raw === void 0) throw new CliUsageError("config set requires a value. Use JSON for arrays, tables, numbers and booleans.");
170
+ try {
171
+ value = JSON.parse(raw);
172
+ } catch {
173
+ value = raw;
174
+ }
175
+ }
176
+ print(await patchConfig(
177
+ home,
178
+ stringOption(options, "expectedRevision") ?? snapshot.rawRevision,
179
+ [command === "set" ? { op: "set", path: at, value } : { op: "unset", path: at }]
180
+ ));
181
+ return;
182
+ }
183
+ throw new CliUsageError(`Unknown config command: ${command}`);
184
+ }
185
+ export {
186
+ runConfigurationCommand
187
+ };
@@ -1,11 +1,11 @@
1
1
  import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
- import {
3
- DEFAULT_LOCAL_TRAINING_API_URL,
4
- createLocalAuthenticatedRequest
5
- } from "./chunk-J7PYGDRY.js";
6
2
  import {
7
3
  ContinualBenchPanelRoleSchema
8
4
  } from "./chunk-R3C3MNSI.js";
5
+ import {
6
+ DEFAULT_LOCAL_TRAINING_API_URL,
7
+ createLocalAuthenticatedRequest
8
+ } from "./chunk-26AMV5ZI.js";
9
9
  import {
10
10
  yaml
11
11
  } from "./chunk-X7ZG4TSW.js";
@@ -16,15 +16,17 @@ import {
16
16
  runTemplateUpdate,
17
17
  runToolList,
18
18
  runToolRun
19
- } from "./chunk-CNTM26OW.js";
20
- import "./chunk-HFPUR4CQ.js";
21
- import "./chunk-2JABRRNR.js";
19
+ } from "./chunk-K4TZEHAW.js";
20
+ import "./chunk-3VEYNDHN.js";
21
+ import "./chunk-FJ2JGB2N.js";
22
22
  import "./chunk-SMNFI2FU.js";
23
- import "./chunk-N3TGCM7J.js";
23
+ import "./chunk-KSRWKXRB.js";
24
+ import "./chunk-PS37DB5F.js";
25
+ import "./chunk-4KA25HUP.js";
26
+ import "./chunk-ZNQEROWP.js";
27
+ import "./chunk-7RIGZB7N.js";
24
28
  import "./chunk-4L3ZJS2T.js";
25
29
  import "./chunk-JTHL5XJ2.js";
26
- import "./chunk-D7BO5Y5J.js";
27
- import "./chunk-KSRWKXRB.js";
28
30
  import "./chunk-FQS2QL5F.js";
29
31
  import "./chunk-MUMPWI4O.js";
30
32
  import "./chunk-UACZUFIA.js";
@@ -0,0 +1,20 @@
1
+ import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
+ import {
3
+ PERSISTENCE_TABLES_SQL,
4
+ deleteLocalRecord,
5
+ getLocalRecord,
6
+ listLocalRecords,
7
+ openStorageDatabase,
8
+ putLocalRecord,
9
+ withLocalDatabase
10
+ } from "./chunk-ZNQEROWP.js";
11
+ import "./chunk-UACZUFIA.js";
12
+ export {
13
+ PERSISTENCE_TABLES_SQL,
14
+ deleteLocalRecord,
15
+ getLocalRecord,
16
+ listLocalRecords,
17
+ openStorageDatabase,
18
+ putLocalRecord,
19
+ withLocalDatabase
20
+ };
@@ -1,16 +1,18 @@
1
1
  import { createRequire as __openpondCreateRequire } from "node:module"; var require = __openpondCreateRequire(import.meta.url);
2
2
  import {
3
3
  runProcessCommand
4
- } from "./chunk-HFPUR4CQ.js";
4
+ } from "./chunk-3VEYNDHN.js";
5
+ import "./chunk-FJ2JGB2N.js";
6
+ import "./chunk-SMNFI2FU.js";
7
+ import "./chunk-KSRWKXRB.js";
5
8
  import {
6
9
  CliUsageError
7
- } from "./chunk-2JABRRNR.js";
8
- import "./chunk-SMNFI2FU.js";
9
- import "./chunk-N3TGCM7J.js";
10
+ } from "./chunk-PS37DB5F.js";
11
+ import "./chunk-4KA25HUP.js";
12
+ import "./chunk-ZNQEROWP.js";
13
+ import "./chunk-7RIGZB7N.js";
10
14
  import "./chunk-4L3ZJS2T.js";
11
15
  import "./chunk-JTHL5XJ2.js";
12
- import "./chunk-D7BO5Y5J.js";
13
- import "./chunk-KSRWKXRB.js";
14
16
  import "./chunk-FQS2QL5F.js";
15
17
  import {
16
18
  optionString,