@marifold/core 0.67.0 → 0.70.5

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 (126) hide show
  1. package/dist/agent/AgentRunner.d.ts +7 -1
  2. package/dist/agent/AgentRunner.d.ts.map +1 -1
  3. package/dist/agent/AgentRunner.js +50 -16
  4. package/dist/agent/AgentRunner.js.map +1 -1
  5. package/dist/agent/RunArtifacts.d.ts +6 -1
  6. package/dist/agent/RunArtifacts.d.ts.map +1 -1
  7. package/dist/agent/RunArtifacts.js +16 -3
  8. package/dist/agent/RunArtifacts.js.map +1 -1
  9. package/dist/agent/RunWorkspace.d.ts +3 -0
  10. package/dist/agent/RunWorkspace.d.ts.map +1 -1
  11. package/dist/agent/RunWorkspace.js +5 -0
  12. package/dist/agent/RunWorkspace.js.map +1 -1
  13. package/dist/agent/ScopedProcess.d.ts.map +1 -1
  14. package/dist/agent/ScopedProcess.js +1 -0
  15. package/dist/agent/ScopedProcess.js.map +1 -1
  16. package/dist/agent/ToolRegistry.d.ts +6 -1
  17. package/dist/agent/ToolRegistry.d.ts.map +1 -1
  18. package/dist/agent/ToolRegistry.js +4 -1
  19. package/dist/agent/ToolRegistry.js.map +1 -1
  20. package/dist/agent/tools/ReadFileTool.d.ts.map +1 -1
  21. package/dist/agent/tools/ReadFileTool.js +4 -0
  22. package/dist/agent/tools/ReadFileTool.js.map +1 -1
  23. package/dist/agent/tools/SkillManagementTool.d.ts +10 -1
  24. package/dist/agent/tools/SkillManagementTool.d.ts.map +1 -1
  25. package/dist/agent/tools/SkillManagementTool.js +95 -42
  26. package/dist/agent/tools/SkillManagementTool.js.map +1 -1
  27. package/dist/agent/tools/WriteFileTool.d.ts.map +1 -1
  28. package/dist/agent/tools/WriteFileTool.js +4 -0
  29. package/dist/agent/tools/WriteFileTool.js.map +1 -1
  30. package/dist/app/SkillAppInstanceRegistry.d.ts.map +1 -1
  31. package/dist/app/SkillAppInstanceRegistry.js +5 -0
  32. package/dist/app/SkillAppInstanceRegistry.js.map +1 -1
  33. package/dist/channels/TelegramBridge.d.ts +0 -1
  34. package/dist/channels/TelegramBridge.d.ts.map +1 -1
  35. package/dist/channels/TelegramBridge.js +8 -26
  36. package/dist/channels/TelegramBridge.js.map +1 -1
  37. package/dist/config/ChatGptCatalogVersion.d.ts +3 -0
  38. package/dist/config/ChatGptCatalogVersion.d.ts.map +1 -0
  39. package/dist/config/ChatGptCatalogVersion.js +55 -0
  40. package/dist/config/ChatGptCatalogVersion.js.map +1 -0
  41. package/dist/config/ConfigManager.d.ts.map +1 -1
  42. package/dist/config/ConfigManager.js +0 -1
  43. package/dist/config/ConfigManager.js.map +1 -1
  44. package/dist/config/ConfigSchema.d.ts +13 -4
  45. package/dist/config/ConfigSchema.d.ts.map +1 -1
  46. package/dist/config/ProviderInspector.d.ts.map +1 -1
  47. package/dist/config/ProviderInspector.js +2 -5
  48. package/dist/config/ProviderInspector.js.map +1 -1
  49. package/dist/errors/MarifoldError.d.ts +1 -1
  50. package/dist/errors/MarifoldError.d.ts.map +1 -1
  51. package/dist/errors/MarifoldError.js.map +1 -1
  52. package/dist/images/AvatarThumbnail.d.ts +3 -0
  53. package/dist/images/AvatarThumbnail.d.ts.map +1 -0
  54. package/dist/images/AvatarThumbnail.js +16 -0
  55. package/dist/images/AvatarThumbnail.js.map +1 -0
  56. package/dist/index.d.ts +13 -2
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +19 -4
  59. package/dist/index.js.map +1 -1
  60. package/dist/memory/MemoryControls.js +1 -1
  61. package/dist/memory/MemoryControls.js.map +1 -1
  62. package/dist/profiles/ProfileInstructions.d.ts +15 -0
  63. package/dist/profiles/ProfileInstructions.d.ts.map +1 -0
  64. package/dist/profiles/ProfileInstructions.js +101 -0
  65. package/dist/profiles/ProfileInstructions.js.map +1 -0
  66. package/dist/profiles/ProfileManager.d.ts +15 -6
  67. package/dist/profiles/ProfileManager.d.ts.map +1 -1
  68. package/dist/profiles/ProfileManager.js +78 -21
  69. package/dist/profiles/ProfileManager.js.map +1 -1
  70. package/dist/profiles/ProfileResolver.d.ts.map +1 -1
  71. package/dist/profiles/ProfileResolver.js +37 -8
  72. package/dist/profiles/ProfileResolver.js.map +1 -1
  73. package/dist/runs/RunRegistry.d.ts +27 -1
  74. package/dist/runs/RunRegistry.d.ts.map +1 -1
  75. package/dist/runs/RunRegistry.js +75 -16
  76. package/dist/runs/RunRegistry.js.map +1 -1
  77. package/dist/runtime/MarifoldRuntime.d.ts +13 -4
  78. package/dist/runtime/MarifoldRuntime.d.ts.map +1 -1
  79. package/dist/runtime/MarifoldRuntime.js +36 -7
  80. package/dist/runtime/MarifoldRuntime.js.map +1 -1
  81. package/dist/runtime/MarifoldTypes.d.ts +1 -1
  82. package/dist/skill/BuiltInSkillManager.d.ts.map +1 -1
  83. package/dist/skill/BuiltInSkillManager.js +2 -1
  84. package/dist/skill/BuiltInSkillManager.js.map +1 -1
  85. package/dist/skill/BuiltInSkills.js +10 -10
  86. package/dist/skill/BuiltInSkills.js.map +1 -1
  87. package/dist/workspace/DeviceDelegateTool.d.ts +40 -0
  88. package/dist/workspace/DeviceDelegateTool.d.ts.map +1 -0
  89. package/dist/workspace/DeviceDelegateTool.js +79 -0
  90. package/dist/workspace/DeviceDelegateTool.js.map +1 -0
  91. package/dist/workspace/WorkspaceArtifactTransfer.d.ts +8 -0
  92. package/dist/workspace/WorkspaceArtifactTransfer.d.ts.map +1 -0
  93. package/dist/workspace/WorkspaceArtifactTransfer.js +45 -0
  94. package/dist/workspace/WorkspaceArtifactTransfer.js.map +1 -0
  95. package/dist/workspace/WorkspaceExecutor.d.ts +19 -0
  96. package/dist/workspace/WorkspaceExecutor.d.ts.map +1 -0
  97. package/dist/workspace/WorkspaceExecutor.js +212 -0
  98. package/dist/workspace/WorkspaceExecutor.js.map +1 -0
  99. package/dist/workspace/WorkspaceInitializer.d.ts.map +1 -1
  100. package/dist/workspace/WorkspaceInitializer.js +10 -13
  101. package/dist/workspace/WorkspaceInitializer.js.map +1 -1
  102. package/dist/workspace/WorkspaceManager.d.ts +43 -0
  103. package/dist/workspace/WorkspaceManager.d.ts.map +1 -0
  104. package/dist/workspace/WorkspaceManager.js +378 -0
  105. package/dist/workspace/WorkspaceManager.js.map +1 -0
  106. package/dist/workspace/WorkspaceRuns.d.ts +18 -0
  107. package/dist/workspace/WorkspaceRuns.d.ts.map +1 -0
  108. package/dist/workspace/WorkspaceRuns.js +152 -0
  109. package/dist/workspace/WorkspaceRuns.js.map +1 -0
  110. package/dist/workspace/WorkspaceStore.d.ts +49 -0
  111. package/dist/workspace/WorkspaceStore.d.ts.map +1 -0
  112. package/dist/workspace/WorkspaceStore.js +419 -0
  113. package/dist/workspace/WorkspaceStore.js.map +1 -0
  114. package/dist/workspace/WorkspaceTerminal.d.ts +4 -0
  115. package/dist/workspace/WorkspaceTerminal.d.ts.map +1 -0
  116. package/dist/workspace/WorkspaceTerminal.js +80 -0
  117. package/dist/workspace/WorkspaceTerminal.js.map +1 -0
  118. package/dist/workspace/bridge/BridgePeer.d.ts +48 -0
  119. package/dist/workspace/bridge/BridgePeer.d.ts.map +1 -0
  120. package/dist/workspace/bridge/BridgePeer.js +307 -0
  121. package/dist/workspace/bridge/BridgePeer.js.map +1 -0
  122. package/dist/workspace/bridge/ChunkTransfers.d.ts +19 -0
  123. package/dist/workspace/bridge/ChunkTransfers.d.ts.map +1 -0
  124. package/dist/workspace/bridge/ChunkTransfers.js +125 -0
  125. package/dist/workspace/bridge/ChunkTransfers.js.map +1 -0
  126. package/package.json +6 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceStore.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceStore.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAEV,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC;IAC3E,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AACD,qBAAa,cAAc;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8D;IACxF,OAAO,CAAC,UAAU,CAAK;IACvB,YAAY,UAAU,EAAE,MAAM,EA4C7B;IACD,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,WAAW;IAOnB,KAAK,IAAI,IAAI,CASZ;IACD,OAAO,CAAC,KAAK;IAYb,QAAQ,CAAC,UAAU;QACjB,IAAI,QAAM,KAAK,CAAC;YACd,MAAM,EAAE,OAAO,qBAAqB,EAAE,SAAS,CAAC;YAChD,MAAM,EAAE,OAAO,qBAAqB,EAAE,cAAc,EAAE,CAAC;SACxD,CAAC;QAsBF,IAAI,WACM,OAAO,qBAAqB,EAAE,SAAS,UACvC,OAAO,qBAAqB,EAAE,cAAc,KACnD,IAAI;MAgBP;IACF,IAAI,IAAI,mBAAmB,EAAE,CAM5B;IACD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAKzC;IACD,IAAI,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAS1C;IACK,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA8B9F;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAmBzB;IACD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAY3D;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,gBAAgB,CA0B7G;IACD,SAAS,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAO7C;IACD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,WAAW,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAOrF;IACD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGhD;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGrC;IACD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CASvB;IACD,SAAS,IAAI,MAAM,CAKlB;IACD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAK3B;IACD,iBAAiB,IAAI,IAAI,CAExB;IACK,IAAI,CAAC,CAAC,EACV,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB,OAAO,CAAC,CAAC,CAAC,CA4CZ;IACD,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,aAAa;CAgBtB"}
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.WorkspaceStore = void 0;
40
+ const fs = __importStar(require("node:fs"));
41
+ const path = __importStar(require("node:path"));
42
+ const node_crypto_1 = require("node:crypto");
43
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
44
+ const workspace_protocol_1 = require("@marifold/workspace-protocol");
45
+ class WorkspaceStore {
46
+ directory;
47
+ db;
48
+ closed = false;
49
+ lockPath;
50
+ lockValue = JSON.stringify({ pid: process.pid, instance: (0, workspace_protocol_1.randomId)() });
51
+ lastPruned = 0;
52
+ constructor(configPath) {
53
+ this.directory = path.join(path.dirname(path.resolve(configPath)), 'workspaces', (0, workspace_protocol_1.digest)(path.basename(configPath)).slice(0, 16));
54
+ const parent = path.dirname(this.directory);
55
+ fs.mkdirSync(parent, { recursive: true, mode: 0o700 });
56
+ if (fs.lstatSync(parent).isSymbolicLink())
57
+ throw new Error('Workspace state parent must not be a symlink.');
58
+ fs.mkdirSync(this.directory, { recursive: true, mode: 0o700 });
59
+ if (fs.lstatSync(this.directory).isSymbolicLink())
60
+ throw new Error('Workspace state directory must not be a symlink.');
61
+ fs.chmodSync(this.directory, 0o700);
62
+ this.lockPath = path.join(this.directory, 'service.lock');
63
+ this.acquireLock();
64
+ try {
65
+ const dbPath = path.join(this.directory, 'control.db');
66
+ for (const file of [dbPath, `${dbPath}-wal`, `${dbPath}-shm`]) {
67
+ try {
68
+ const stat = fs.lstatSync(file);
69
+ if (!stat.isFile() || stat.isSymbolicLink())
70
+ throw new Error('Workspace control files must be regular files.');
71
+ fs.chmodSync(file, 0o600);
72
+ }
73
+ catch (error) {
74
+ if (error.code !== 'ENOENT')
75
+ throw error;
76
+ }
77
+ }
78
+ this.db = new better_sqlite3_1.default(dbPath);
79
+ fs.chmodSync(dbPath, 0o600);
80
+ this.db.pragma('journal_mode = WAL');
81
+ this.db.pragma('busy_timeout = 5000');
82
+ this.db.exec(`
83
+ CREATE TABLE IF NOT EXISTS run_records (id TEXT PRIMARY KEY, record TEXT NOT NULL, expires INTEGER NOT NULL);
84
+ CREATE TABLE IF NOT EXISTS run_events (run TEXT NOT NULL, seq INTEGER NOT NULL, event TEXT NOT NULL, PRIMARY KEY(run,seq));
85
+ CREATE TABLE IF NOT EXISTS connections (id TEXT PRIMARY KEY, metadata TEXT NOT NULL);
86
+ CREATE TABLE IF NOT EXISTS invitations (workspace TEXT PRIMARY KEY, verifier TEXT NOT NULL, expires INTEGER NOT NULL);
87
+ CREATE TABLE IF NOT EXISTS devices (workspace TEXT NOT NULL, id TEXT NOT NULL, certificate TEXT NOT NULL, revoked INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(workspace,id));
88
+ CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT NOT NULL);
89
+ CREATE TABLE IF NOT EXISTS requests (workspace TEXT NOT NULL, sender TEXT NOT NULL, id TEXT NOT NULL, hash TEXT NOT NULL, state TEXT NOT NULL, result TEXT, created INTEGER NOT NULL, PRIMARY KEY(workspace,sender,id));
90
+ `);
91
+ }
92
+ catch (error) {
93
+ this.releaseLock();
94
+ throw error;
95
+ }
96
+ }
97
+ acquireLock() {
98
+ for (let attempt = 0; attempt < 2; attempt++) {
99
+ try {
100
+ fs.writeFileSync(this.lockPath, this.lockValue, { flag: 'wx', mode: 0o600 });
101
+ return;
102
+ }
103
+ catch (error) {
104
+ if (error.code !== 'EEXIST')
105
+ throw error;
106
+ }
107
+ const fd = fs.openSync(this.lockPath, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
108
+ let pid;
109
+ try {
110
+ if (fs.fstatSync(fd).size > 1024)
111
+ throw new Error('Invalid workspace service lock.');
112
+ pid = JSON.parse(fs.readFileSync(fd, 'utf8')).pid;
113
+ }
114
+ finally {
115
+ fs.closeSync(fd);
116
+ }
117
+ if (typeof pid !== 'number' || !Number.isSafeInteger(pid) || pid <= 0)
118
+ throw new Error('Invalid workspace service lock.');
119
+ try {
120
+ process.kill(pid, 0);
121
+ }
122
+ catch (error) {
123
+ if (error.code === 'ESRCH') {
124
+ fs.unlinkSync(this.lockPath);
125
+ continue;
126
+ }
127
+ throw error;
128
+ }
129
+ throw new Error('This configuration already has an active workspace service.');
130
+ }
131
+ throw new Error('Could not acquire the workspace service lock.');
132
+ }
133
+ releaseLock() {
134
+ try {
135
+ if (fs.readFileSync(this.lockPath, 'utf8') === this.lockValue)
136
+ fs.unlinkSync(this.lockPath);
137
+ }
138
+ catch {
139
+ /* Already released. */
140
+ }
141
+ }
142
+ close() {
143
+ if (!this.closed) {
144
+ this.closed = true;
145
+ try {
146
+ this.db.close();
147
+ }
148
+ finally {
149
+ this.releaseLock();
150
+ }
151
+ }
152
+ }
153
+ prune() {
154
+ if (Date.now() - this.lastPruned < 60000)
155
+ return;
156
+ this.lastPruned = Date.now();
157
+ this.db
158
+ .prepare('DELETE FROM run_events WHERE run IN (SELECT id FROM run_records WHERE expires < ?)')
159
+ .run(Date.now());
160
+ this.db.prepare('DELETE FROM run_records WHERE expires < ?').run(Date.now());
161
+ // Keep request tombstones: forgetting an old id would authorize its replay.
162
+ this.db
163
+ .prepare("UPDATE requests SET result=NULL,state='expired' WHERE created < ? AND state IN ('complete','failed')")
164
+ .run(Date.now() - 86400000);
165
+ }
166
+ runJournal = {
167
+ load: () => {
168
+ this.db
169
+ .prepare('DELETE FROM run_events WHERE run IN (SELECT id FROM run_records WHERE expires < ?)')
170
+ .run(Date.now());
171
+ this.db.prepare('DELETE FROM run_records WHERE expires < ?').run(Date.now());
172
+ return this.db.prepare('SELECT id,record FROM run_records ORDER BY expires DESC LIMIT 55').all().map((row) => ({
173
+ record: JSON.parse(row.record),
174
+ events: this.db.prepare('SELECT seq,event FROM run_events WHERE run=? ORDER BY seq DESC LIMIT 10000').all(row.id)
175
+ .reverse()
176
+ .map((e) => ({ seq: e.seq, event: JSON.parse(e.event) })),
177
+ }));
178
+ },
179
+ save: (record, event) => {
180
+ if (this.closed)
181
+ return;
182
+ this.prune();
183
+ this.db.transaction(() => {
184
+ this.db
185
+ .prepare('INSERT INTO run_records VALUES (?,?,?) ON CONFLICT(id) DO UPDATE SET record=excluded.record,expires=excluded.expires')
186
+ .run(record.id, JSON.stringify(record), Date.now() + 86400000);
187
+ if (event)
188
+ this.db
189
+ .prepare('INSERT OR REPLACE INTO run_events VALUES (?,?,?)')
190
+ .run(record.id, event.seq, JSON.stringify(event.event));
191
+ this.db.prepare('DELETE FROM run_events WHERE run=? AND seq<=?').run(record.id, record.eventCount - 10000);
192
+ })();
193
+ },
194
+ };
195
+ list() {
196
+ const rows = this.db.prepare('SELECT id,metadata FROM connections ORDER BY id').all();
197
+ return rows.map((row) => ({ ...JSON.parse(row.metadata), identity: this.readIdentity(row.id) }));
198
+ }
199
+ get(idOrName) {
200
+ const matches = this.list().filter((c) => c.id === idOrName || c.name === idOrName);
201
+ if (matches.length !== 1)
202
+ throw new Error(matches.length ? 'Workspace name is ambiguous; use its ID.' : 'Workspace not found.');
203
+ return matches[0];
204
+ }
205
+ save(connection) {
206
+ (0, workspace_protocol_1.identifier)(connection.id);
207
+ (0, workspace_protocol_1.label)(connection.name);
208
+ (0, workspace_protocol_1.bridgeOrigin)(connection.bridgeUrl);
209
+ this.writeIdentity(connection.id, connection.identity);
210
+ const { identity: _identity, ...metadata } = connection;
211
+ this.db
212
+ .prepare('INSERT INTO connections VALUES (?,?) ON CONFLICT(id) DO UPDATE SET metadata=excluded.metadata')
213
+ .run(connection.id, JSON.stringify(metadata));
214
+ }
215
+ async create(name, bridgeUrl, deviceName) {
216
+ if (this.list().some((c) => c.role === 'host'))
217
+ throw new Error('This configuration already hosts a workspace.');
218
+ const identity = await (0, workspace_protocol_1.createIdentity)();
219
+ const id = (0, workspace_protocol_1.randomId)();
220
+ const deviceId = (0, workspace_protocol_1.randomId)();
221
+ const host = (0, workspace_protocol_1.publicIdentity)(identity);
222
+ const certificate = (0, workspace_protocol_1.issueMembership)(identity, {
223
+ version: 1,
224
+ workspaceId: id,
225
+ deviceId,
226
+ name: (0, workspace_protocol_1.label)(deviceName),
227
+ identity: host,
228
+ host,
229
+ issuedAt: Date.now(),
230
+ });
231
+ const connection = {
232
+ id,
233
+ name: (0, workspace_protocol_1.label)(name),
234
+ bridgeUrl: (0, workspace_protocol_1.bridgeOrigin)(bridgeUrl),
235
+ deviceId,
236
+ hostDeviceId: deviceId,
237
+ role: 'host',
238
+ host,
239
+ identity,
240
+ certificate,
241
+ executor: true,
242
+ };
243
+ this.save(connection);
244
+ this.addDevice(certificate);
245
+ return connection;
246
+ }
247
+ invite(id) {
248
+ const c = this.get(id);
249
+ if (c.role !== 'host')
250
+ throw new Error('Invitations must be issued by the host.');
251
+ const secret = (0, node_crypto_1.randomBytes)(32).toString('base64url');
252
+ const expiresAt = Date.now() + workspace_protocol_1.INVITATION_TTL_MS;
253
+ this.db
254
+ .prepare('INSERT INTO invitations VALUES (?,?,?) ON CONFLICT(workspace) DO UPDATE SET verifier=excluded.verifier,expires=excluded.expires')
255
+ .run(c.id, (0, workspace_protocol_1.digest)(secret), expiresAt);
256
+ const invitation = {
257
+ version: 1,
258
+ workspaceId: c.id,
259
+ bridgeUrl: c.bridgeUrl,
260
+ host: c.host,
261
+ secret,
262
+ expiresAt,
263
+ };
264
+ return Buffer.from(JSON.stringify(invitation)).toString('base64url');
265
+ }
266
+ validateInvitation(workspace, secret) {
267
+ const invitation = this.db.prepare('SELECT verifier,expires FROM invitations WHERE workspace=?').get(workspace);
268
+ if (typeof secret !== 'string' ||
269
+ secret.length > 100 ||
270
+ !invitation ||
271
+ invitation.expires < Date.now() ||
272
+ !(0, node_crypto_1.timingSafeEqual)(Buffer.from(invitation.verifier), Buffer.from((0, workspace_protocol_1.digest)(secret))))
273
+ throw new Error('Invitation is invalid or expired.');
274
+ }
275
+ enroll(id, secret, deviceId, name, identity) {
276
+ const c = this.get(id);
277
+ if (c.role !== 'host')
278
+ throw new Error('Only a host may enroll a device.');
279
+ return this.db.transaction(() => {
280
+ const invitation = this.db.prepare('SELECT verifier,expires FROM invitations WHERE workspace=?').get(c.id);
281
+ if (!invitation ||
282
+ invitation.expires < Date.now() ||
283
+ !(0, node_crypto_1.timingSafeEqual)(Buffer.from(invitation.verifier), Buffer.from((0, workspace_protocol_1.digest)(secret))))
284
+ throw new Error('Invitation is invalid or expired.');
285
+ const certificate = (0, workspace_protocol_1.issueMembership)(c.identity, {
286
+ version: 1,
287
+ workspaceId: c.id,
288
+ deviceId: (0, workspace_protocol_1.identifier)(deviceId),
289
+ name: (0, workspace_protocol_1.label)(name),
290
+ identity,
291
+ host: c.host,
292
+ issuedAt: Date.now(),
293
+ });
294
+ this.addDevice(certificate);
295
+ this.db.prepare('DELETE FROM invitations WHERE workspace=?').run(c.id);
296
+ return certificate;
297
+ })();
298
+ }
299
+ addDevice(certificate) {
300
+ const m = certificate.membership;
301
+ this.db
302
+ .prepare('INSERT INTO devices VALUES (?,?,?,0) ON CONFLICT(workspace,id) DO UPDATE SET certificate=excluded.certificate,revoked=0')
303
+ .run(m.workspaceId, m.deviceId, JSON.stringify(certificate));
304
+ }
305
+ devices(workspace) {
306
+ return this.db.prepare('SELECT certificate,revoked FROM devices WHERE workspace=?').all(workspace).map((r) => ({ certificate: JSON.parse(r.certificate), revoked: Boolean(r.revoked) }));
307
+ }
308
+ revoke(workspace, deviceId) {
309
+ if (this.get(workspace).hostDeviceId === deviceId)
310
+ throw new Error('Remove the hosted workspace to stop sharing.');
311
+ this.db.prepare('UPDATE devices SET revoked=1 WHERE workspace=? AND id=?').run(workspace, deviceId);
312
+ }
313
+ rename(id, name) {
314
+ const c = this.get(id);
315
+ this.save({ ...c, name: (0, workspace_protocol_1.label)(name) });
316
+ }
317
+ remove(id) {
318
+ const c = this.get(id);
319
+ this.db.transaction(() => {
320
+ for (const table of ['devices', 'invitations', 'requests'])
321
+ this.db.prepare(`DELETE FROM ${table} WHERE workspace=?`).run(c.id);
322
+ this.db.prepare('DELETE FROM connections WHERE id=?').run(c.id);
323
+ if (this.defaultId() === c.id)
324
+ this.setDefault('local');
325
+ })();
326
+ fs.rmSync(path.join(this.directory, `${c.id}.credentials.json`), { force: true });
327
+ }
328
+ defaultId() {
329
+ return (this.db.prepare("SELECT value FROM settings WHERE key='default'").get()
330
+ ?.value ?? 'local');
331
+ }
332
+ setDefault(id) {
333
+ const value = id === 'local' ? id : this.get(id).id;
334
+ this.db
335
+ .prepare("INSERT INTO settings VALUES ('default',?) ON CONFLICT(key) DO UPDATE SET value=excluded.value")
336
+ .run(value);
337
+ }
338
+ interruptRequests() {
339
+ this.db.prepare("UPDATE requests SET state='interrupted' WHERE state='running'").run();
340
+ }
341
+ async once(workspace, sender, id, input, operation, validate) {
342
+ (0, workspace_protocol_1.identifier)(id);
343
+ const hash = (0, workspace_protocol_1.digest)(JSON.stringify(input));
344
+ const row = this.db
345
+ .prepare('SELECT hash,state,result FROM requests WHERE workspace=? AND sender=? AND id=?')
346
+ .get(workspace, sender, id);
347
+ if (row) {
348
+ if (row.hash !== hash)
349
+ throw new Error('Request ID was reused with different input.');
350
+ if (row.state === 'complete')
351
+ return JSON.parse(row.result);
352
+ if (row.state === 'failed')
353
+ throw new Error(JSON.parse(row.result));
354
+ if (row.state === 'expired')
355
+ throw new Error('The previous request result has expired. The operation will not be repeated.');
356
+ throw new Error(row.state === 'running'
357
+ ? 'Request is still running; query its status.'
358
+ : 'Request was interrupted; its outcome is unknown. It will not be repeated.');
359
+ }
360
+ validate?.();
361
+ this.prune();
362
+ if (this.db.prepare('SELECT COUNT(*) AS count FROM requests').get().count >= 100000)
363
+ throw new Error('Workspace operation journal capacity reached. Re-pair a new workspace before accepting more operations.');
364
+ this.db
365
+ .prepare('INSERT INTO requests VALUES (?,?,?,?,?,NULL,?)')
366
+ .run(workspace, sender, id, hash, 'running', Date.now());
367
+ try {
368
+ const result = await operation();
369
+ if (!this.closed) {
370
+ const saved = JSON.stringify(result ?? null);
371
+ const retain = Buffer.byteLength(saved) <= 8 * 1024 * 1024;
372
+ this.db
373
+ .prepare('UPDATE requests SET state=?,result=? WHERE workspace=? AND sender=? AND id=?')
374
+ .run(retain ? 'complete' : 'expired', retain ? saved : null, workspace, sender, id);
375
+ }
376
+ return result;
377
+ }
378
+ catch (error) {
379
+ if (!this.closed)
380
+ this.db
381
+ .prepare("UPDATE requests SET state='failed',result=? WHERE workspace=? AND sender=? AND id=?")
382
+ .run(JSON.stringify(error instanceof Error ? error.message : 'Operation failed.'), workspace, sender, id);
383
+ throw error;
384
+ }
385
+ }
386
+ readIdentity(id) {
387
+ const file = path.join(this.directory, `${(0, workspace_protocol_1.identifier)(id)}.credentials.json`);
388
+ const fd = fs.openSync(file, fs.constants.O_RDONLY | fs.constants.O_NOFOLLOW);
389
+ try {
390
+ const stat = fs.fstatSync(fd);
391
+ if (!stat.isFile() || stat.size > 16_384 || (stat.mode & 0o077) !== 0)
392
+ throw new Error('Workspace credentials must be an owner-only regular file.');
393
+ return JSON.parse(fs.readFileSync(fd, 'utf8'));
394
+ }
395
+ finally {
396
+ fs.closeSync(fd);
397
+ }
398
+ }
399
+ writeIdentity(id, identity) {
400
+ const target = path.join(this.directory, `${(0, workspace_protocol_1.identifier)(id)}.credentials.json`);
401
+ const temp = `${target}.${(0, workspace_protocol_1.randomId)()}.tmp`;
402
+ const fd = fs.openSync(temp, 'wx', 0o600);
403
+ try {
404
+ fs.writeFileSync(fd, JSON.stringify(identity));
405
+ fs.fsyncSync(fd);
406
+ }
407
+ finally {
408
+ fs.closeSync(fd);
409
+ }
410
+ try {
411
+ fs.renameSync(temp, target);
412
+ }
413
+ finally {
414
+ fs.rmSync(temp, { force: true });
415
+ }
416
+ }
417
+ }
418
+ exports.WorkspaceStore = WorkspaceStore;
419
+ //# sourceMappingURL=WorkspaceStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceStore.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MarifoldRuntime } from '../runtime/MarifoldRuntime';
2
+ /** Explicit terminal operations; deliberately no arbitrary runtime-method RPC. */
3
+ export declare function workspaceTerminal(runtime: MarifoldRuntime, operation: string, value: unknown): Promise<unknown>;
4
+ //# sourceMappingURL=WorkspaceTerminal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceTerminal.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceTerminal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,kFAAkF;AAClF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAuErH"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.workspaceTerminal = workspaceTerminal;
4
+ const workspace_protocol_1 = require("@marifold/workspace-protocol");
5
+ /** Explicit terminal operations; deliberately no arbitrary runtime-method RPC. */
6
+ async function workspaceTerminal(runtime, operation, value) {
7
+ const b = (0, workspace_protocol_1.record)(value);
8
+ const text = (key, optional = false) => {
9
+ const v = b[key];
10
+ if (optional && v === undefined)
11
+ return '';
12
+ if (typeof v !== 'string' || v.length > 1024 * 1024)
13
+ throw new Error(`Invalid ${key}.`);
14
+ return v;
15
+ };
16
+ const profile = () => {
17
+ const name = text('profile');
18
+ runtime.getProfile(name);
19
+ return name;
20
+ };
21
+ const scope = () => {
22
+ if (b.scope !== 'global' && b.scope !== 'profile')
23
+ throw new Error('Invalid skill scope.');
24
+ return b.scope;
25
+ };
26
+ switch (operation) {
27
+ case 'snapshot':
28
+ return runtime.listProfiles().map((p) => {
29
+ let settings;
30
+ try {
31
+ settings = runtime.resolveSettings({ profile: p.name });
32
+ }
33
+ catch {
34
+ /* Unconfigured profiles remain selectable for configuration. */
35
+ }
36
+ return {
37
+ summary: p,
38
+ detail: runtime.getProfile(p.name),
39
+ settings,
40
+ agent: runtime.resolveAgentConfigForProfile(p.name),
41
+ skills: {
42
+ all: runtime.listSkills(p.name),
43
+ global: runtime.listSkills(p.name, 'global'),
44
+ profile: runtime.listSkills(p.name, 'profile'),
45
+ },
46
+ };
47
+ });
48
+ case 'skill.install':
49
+ return runtime.installSkillFromText(text('text'), scope(), profile());
50
+ case 'skill.remove':
51
+ return runtime.removeSkill(text('name'), profile(), scope());
52
+ case 'profile.migrate':
53
+ return runtime.migrateProfileInstructions(profile());
54
+ case 'profile.approval': {
55
+ const kind = text('kind');
56
+ const mode = text('mode');
57
+ if (!['read', 'write', 'shell', 'network', 'delegate'].includes(kind) || !['allow', 'ask', 'deny'].includes(mode))
58
+ throw new Error('Invalid approval policy.');
59
+ return runtime.setProfileAgentApproval(profile(), kind, mode);
60
+ }
61
+ case 'profile.trust':
62
+ return runtime.addProfileTrustedFolder(profile(), text('folder'));
63
+ case 'profile.context': {
64
+ if (b.tokens !== undefined &&
65
+ b.tokens !== null &&
66
+ (typeof b.tokens !== 'number' || !Number.isSafeInteger(b.tokens) || b.tokens <= 0))
67
+ throw new Error('Invalid context budget.');
68
+ return runtime.setProfileMaxContextTokens(profile(), typeof b.tokens === 'number' ? b.tokens : undefined);
69
+ }
70
+ case 'memory.remember':
71
+ return runtime.rememberMemory(profile(), 'auto_short', text('text'), text('sessionId', true) || undefined);
72
+ case 'memory.forget':
73
+ return runtime.forgetMemories(profile(), text('query'));
74
+ case 'memory.delete':
75
+ return runtime.deleteMemories(profile(), text('query'));
76
+ default:
77
+ throw new Error('Unsupported terminal operation.');
78
+ }
79
+ }
80
+ //# sourceMappingURL=WorkspaceTerminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceTerminal.js","sourceRoot":"","sources":["../../src/workspace/WorkspaceTerminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { PrivateIdentity, PublicIdentity, SignedMembership, WorkspaceRequest } from '@marifold/workspace-protocol';
2
+ export interface PeerOptions {
3
+ bridgeUrl: string;
4
+ workspaceId: string;
5
+ deviceId: string;
6
+ hostDeviceId?: string;
7
+ identity: PrivateIdentity;
8
+ host: PublicIdentity;
9
+ certificate?: SignedMembership;
10
+ accept?: (certificate: SignedMembership) => boolean;
11
+ onRequest: (request: WorkspaceRequest, sender: {
12
+ id: string;
13
+ identity: PublicIdentity;
14
+ certificate?: SignedMembership;
15
+ }) => Promise<unknown>;
16
+ onStatus?: (online: boolean) => void;
17
+ }
18
+ export declare class BridgePeer {
19
+ private readonly options;
20
+ private socket?;
21
+ private stopped;
22
+ private connected;
23
+ private retry?;
24
+ private ping?;
25
+ private retryMs;
26
+ private pending;
27
+ private controls;
28
+ private seen;
29
+ private transfers;
30
+ private transferWindow;
31
+ private inflight;
32
+ private lastPong;
33
+ private hostDeviceId?;
34
+ constructor(options: PeerOptions);
35
+ get online(): boolean;
36
+ get hostId(): string;
37
+ start(): void;
38
+ close(): void;
39
+ ready(timeoutMs?: number): Promise<void>;
40
+ request(operation: string, input: unknown, recipient?: string, identity?: PublicIdentity, id?: string, timeoutMs?: number): Promise<unknown>;
41
+ revoke(deviceId: string): Promise<void>;
42
+ private connect;
43
+ private receive;
44
+ private dispatch;
45
+ private transmit;
46
+ private send;
47
+ }
48
+ //# sourceMappingURL=BridgePeer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BridgePeer.d.ts","sourceRoot":"","sources":["../../../src/workspace/bridge/BridgePeer.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAEV,eAAe,EACf,cAAc,EACd,gBAAgB,EAEhB,gBAAgB,EAEjB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,KAAK,OAAO,CAAC;IACpD,SAAS,EAAE,CACT,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC;QAAC,WAAW,CAAC,EAAE,gBAAgB,CAAA;KAAE,KAC7E,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AASD,qBAAa,UAAU;IAeT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAdpC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAiC;IAC9C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAkE;IAClF,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAA8D;IAC9E,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,YAA6B,OAAO,EAAE,WAAW,EAEhD;IACD,IAAI,MAAM,IAAI,OAAO,CAEpB;IACD,IAAI,MAAM,IAAI,MAAM,CAGnB;IACD,KAAK,IAAI,IAAI,CAGZ;IACD,KAAK,IAAI,IAAI,CAcZ;IACK,KAAK,CAAC,SAAS,SAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5C;IACD,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,SAAS,SAAc,EACvB,QAAQ,iBAAoB,EAC5B,EAAE,SAAa,EACf,SAAS,SAAS,GACjB,OAAO,CAAC,OAAO,CAAC,CAmBlB;IACD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBtC;IACD,OAAO,CAAC,OAAO;YA4BD,OAAO;YAiGP,QAAQ;YA0CR,QAAQ;YAQR,IAAI;CAmBnB"}