@jungjaehoon/mama-os 0.24.2 → 0.26.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.
- package/CHANGELOG.md +17 -0
- package/README.md +46 -23
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +10 -0
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/code-act/constants.js +2 -2
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +91 -4
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/code-act/tool-policy.d.ts +3 -1
- package/dist/agent/code-act/tool-policy.d.ts.map +1 -1
- package/dist/agent/code-act/tool-policy.js +3 -1
- package/dist/agent/code-act/tool-policy.js.map +1 -1
- package/dist/agent/code-act/type-definition-generator.d.ts.map +1 -1
- package/dist/agent/code-act/type-definition-generator.js +2 -4
- package/dist/agent/code-act/type-definition-generator.js.map +1 -1
- package/dist/agent/context-compile-service.d.ts +2 -0
- package/dist/agent/context-compile-service.d.ts.map +1 -1
- package/dist/agent/context-compile-service.js +26 -7
- package/dist/agent/context-compile-service.js.map +1 -1
- package/dist/agent/drive-tools.d.ts +53 -0
- package/dist/agent/drive-tools.d.ts.map +1 -0
- package/dist/agent/drive-tools.js +261 -0
- package/dist/agent/drive-tools.js.map +1 -0
- package/dist/agent/gateway-tool-executor.d.ts +3 -0
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +362 -19
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +9 -3
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +38 -3
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +45 -6
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/operator-tasks-handler.d.ts.map +1 -1
- package/dist/api/operator-tasks-handler.js +23 -1
- package/dist/api/operator-tasks-handler.js.map +1 -1
- package/dist/cli/commands/start.d.ts +7 -3
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +113 -65
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +7 -3
- package/dist/cli/config/types.js.map +1 -1
- package/dist/cli/runtime/agent-loop-init.d.ts +2 -0
- package/dist/cli/runtime/agent-loop-init.d.ts.map +1 -1
- package/dist/cli/runtime/agent-loop-init.js +37 -12
- package/dist/cli/runtime/agent-loop-init.js.map +1 -1
- package/dist/cli/runtime/api-routes-init.js +3 -3
- package/dist/cli/runtime/api-routes-init.js.map +1 -1
- package/dist/cli/runtime/envelope-bootstrap.d.ts.map +1 -1
- package/dist/cli/runtime/envelope-bootstrap.js +8 -1
- package/dist/cli/runtime/envelope-bootstrap.js.map +1 -1
- package/dist/cli/runtime/temporal-init.d.ts +28 -0
- package/dist/cli/runtime/temporal-init.d.ts.map +1 -0
- package/dist/cli/runtime/temporal-init.js +74 -0
- package/dist/cli/runtime/temporal-init.js.map +1 -0
- package/dist/connectors/drive/index.d.ts +1 -1
- package/dist/connectors/drive/index.d.ts.map +1 -1
- package/dist/connectors/drive/index.js +100 -56
- package/dist/connectors/drive/index.js.map +1 -1
- package/dist/connectors/framework/gws-utils.d.ts +3 -0
- package/dist/connectors/framework/gws-utils.d.ts.map +1 -1
- package/dist/connectors/framework/gws-utils.js +17 -0
- package/dist/connectors/framework/gws-utils.js.map +1 -1
- package/dist/db/migrations/operator-task-temporal.d.ts +8 -0
- package/dist/db/migrations/operator-task-temporal.d.ts.map +1 -0
- package/dist/db/migrations/operator-task-temporal.js +209 -0
- package/dist/db/migrations/operator-task-temporal.js.map +1 -0
- package/dist/envelope/enforcer.d.ts.map +1 -1
- package/dist/envelope/enforcer.js +24 -9
- package/dist/envelope/enforcer.js.map +1 -1
- package/dist/envelope/reactive-config.d.ts +1 -1
- package/dist/envelope/reactive-config.d.ts.map +1 -1
- package/dist/envelope/reactive-config.js +10 -2
- package/dist/envelope/reactive-config.js.map +1 -1
- package/dist/envelope/types.d.ts +1 -1
- package/dist/envelope/types.d.ts.map +1 -1
- package/dist/envelope/types.js.map +1 -1
- package/dist/gateways/message-router.d.ts +1 -0
- package/dist/gateways/message-router.d.ts.map +1 -1
- package/dist/gateways/message-router.js +7 -1
- package/dist/gateways/message-router.js.map +1 -1
- package/dist/gateways/telegram-media.d.ts +28 -0
- package/dist/gateways/telegram-media.d.ts.map +1 -0
- package/dist/gateways/telegram-media.js +165 -0
- package/dist/gateways/telegram-media.js.map +1 -0
- package/dist/gateways/telegram-response-presenter.d.ts +31 -0
- package/dist/gateways/telegram-response-presenter.d.ts.map +1 -0
- package/dist/gateways/telegram-response-presenter.js +153 -0
- package/dist/gateways/telegram-response-presenter.js.map +1 -0
- package/dist/gateways/telegram.d.ts +10 -3
- package/dist/gateways/telegram.d.ts.map +1 -1
- package/dist/gateways/telegram.js +174 -90
- package/dist/gateways/telegram.js.map +1 -1
- package/dist/gateways/types.d.ts +4 -2
- package/dist/gateways/types.d.ts.map +1 -1
- package/dist/multi-agent/dashboard-agent-persona.d.ts.map +1 -1
- package/dist/multi-agent/dashboard-agent-persona.js +9 -4
- package/dist/multi-agent/dashboard-agent-persona.js.map +1 -1
- package/dist/operator/action-verifier.d.ts +23 -0
- package/dist/operator/action-verifier.d.ts.map +1 -1
- package/dist/operator/action-verifier.js +76 -0
- package/dist/operator/action-verifier.js.map +1 -1
- package/dist/operator/board-reconcile.d.ts.map +1 -1
- package/dist/operator/board-reconcile.js +3 -0
- package/dist/operator/board-reconcile.js.map +1 -1
- package/dist/operator/board-slot-instructions.d.ts +3 -3
- package/dist/operator/board-slot-instructions.d.ts.map +1 -1
- package/dist/operator/board-slot-instructions.js +17 -8
- package/dist/operator/board-slot-instructions.js.map +1 -1
- package/dist/operator/briefs.d.ts.map +1 -1
- package/dist/operator/briefs.js +3 -0
- package/dist/operator/briefs.js.map +1 -1
- package/dist/operator/task-ledger.d.ts +134 -8
- package/dist/operator/task-ledger.d.ts.map +1 -1
- package/dist/operator/task-ledger.js +1166 -65
- package/dist/operator/task-ledger.js.map +1 -1
- package/dist/operator/task-temporal.d.ts +21 -0
- package/dist/operator/task-temporal.d.ts.map +1 -0
- package/dist/operator/task-temporal.js +111 -0
- package/dist/operator/task-temporal.js.map +1 -0
- package/dist/operator/temporal-effect.d.ts +62 -0
- package/dist/operator/temporal-effect.d.ts.map +1 -0
- package/dist/operator/temporal-effect.js +71 -0
- package/dist/operator/temporal-effect.js.map +1 -0
- package/dist/operator/temporal-reconcile.d.ts +48 -0
- package/dist/operator/temporal-reconcile.d.ts.map +1 -0
- package/dist/operator/temporal-reconcile.js +215 -0
- package/dist/operator/temporal-reconcile.js.map +1 -0
- package/dist/operator/temporal-runtime.d.ts +54 -0
- package/dist/operator/temporal-runtime.d.ts.map +1 -0
- package/dist/operator/temporal-runtime.js +110 -0
- package/dist/operator/temporal-runtime.js.map +1 -0
- package/dist/operator/temporal-worker.d.ts +19 -0
- package/dist/operator/temporal-worker.d.ts.map +1 -0
- package/dist/operator/temporal-worker.js +105 -0
- package/dist/operator/temporal-worker.js.map +1 -0
- package/dist/operator/worker-run.d.ts +6 -2
- package/dist/operator/worker-run.d.ts.map +1 -1
- package/dist/operator/worker-run.js +14 -0
- package/dist/operator/worker-run.js.map +1 -1
- package/dist/operator/workorder-consumer.d.ts +27 -10
- package/dist/operator/workorder-consumer.d.ts.map +1 -1
- package/dist/operator/workorder-consumer.js +195 -14
- package/dist/operator/workorder-consumer.js.map +1 -1
- package/dist/operator/workorder-hooks.d.ts +3 -0
- package/dist/operator/workorder-hooks.d.ts.map +1 -1
- package/dist/operator/workorder-hooks.js +23 -0
- package/dist/operator/workorder-hooks.js.map +1 -1
- package/dist/operator/workorder-publishers.d.ts +10 -1
- package/dist/operator/workorder-publishers.d.ts.map +1 -1
- package/dist/operator/workorder-publishers.js +40 -3
- package/dist/operator/workorder-publishers.js.map +1 -1
- package/package.json +1 -1
- package/public/ui/assets/{index-OSgiwL24.js → index-BDXDGEV6.js} +15 -15
- package/public/ui/assets/index-po2tN0xq.css +1 -0
- package/public/ui/index.html +2 -2
- package/public/ui/assets/index-CKOJQYXA.css +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* DriveConnector — polls Google Drive changes via the gws CLI tool.
|
|
4
|
-
* Uses
|
|
4
|
+
* Uses short synchronous gws checks during setup and asynchronous calls while polling.
|
|
5
5
|
* Emits file_change NormalizedItems for files modified in configured folders.
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -11,6 +11,7 @@ const fs_1 = require("fs");
|
|
|
11
11
|
const path_1 = require("path");
|
|
12
12
|
const os_1 = require("os");
|
|
13
13
|
const gws_utils_js_1 = require("../framework/gws-utils.js");
|
|
14
|
+
const MAX_CHANGE_PAGES_PER_POLL = 2;
|
|
14
15
|
class DriveConnector {
|
|
15
16
|
name = 'drive';
|
|
16
17
|
type = 'api';
|
|
@@ -41,7 +42,9 @@ class DriveConnector {
|
|
|
41
42
|
this.pageTokens.set(k, v);
|
|
42
43
|
}
|
|
43
44
|
}
|
|
44
|
-
catch {
|
|
45
|
+
catch {
|
|
46
|
+
/* ignore corrupt state */
|
|
47
|
+
}
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
saveState() {
|
|
@@ -116,7 +119,7 @@ class DriveConnector {
|
|
|
116
119
|
* Poll changes from a single drive (personal or shared).
|
|
117
120
|
* Returns items and updates the page token.
|
|
118
121
|
*/
|
|
119
|
-
pollDrive(tokenKey, driveId) {
|
|
122
|
+
async pollDrive(tokenKey, driveId) {
|
|
120
123
|
// Get or initialize page token
|
|
121
124
|
let pageToken = this.pageTokens.get(tokenKey);
|
|
122
125
|
if (!pageToken) {
|
|
@@ -125,67 +128,103 @@ class DriveConnector {
|
|
|
125
128
|
tokenParams.driveId = driveId;
|
|
126
129
|
tokenParams.supportsAllDrives = true;
|
|
127
130
|
}
|
|
128
|
-
const tokenResult = (0, gws_utils_js_1.
|
|
131
|
+
const tokenResult = (await (0, gws_utils_js_1.execGwsAsync)([
|
|
132
|
+
'drive',
|
|
133
|
+
'changes',
|
|
134
|
+
'getStartPageToken',
|
|
135
|
+
'--params',
|
|
136
|
+
JSON.stringify(tokenParams),
|
|
137
|
+
]));
|
|
129
138
|
pageToken = tokenResult.startPageToken;
|
|
130
139
|
this.pageTokens.set(tokenKey, pageToken);
|
|
131
140
|
}
|
|
132
|
-
const params = {
|
|
133
|
-
pageToken,
|
|
134
|
-
pageSize: 100,
|
|
135
|
-
fields: 'changes(fileId,time,removed,file(name,mimeType,modifiedTime,lastModifyingUser,parents,driveId)),newStartPageToken',
|
|
136
|
-
includeRemoved: false,
|
|
137
|
-
includeItemsFromAllDrives: true,
|
|
138
|
-
supportsAllDrives: true,
|
|
139
|
-
};
|
|
140
|
-
if (driveId) {
|
|
141
|
-
params.driveId = driveId;
|
|
142
|
-
}
|
|
143
|
-
const changeList = (0, gws_utils_js_1.execGws)(`drive changes list --params '${JSON.stringify(params)}'`);
|
|
144
141
|
const items = [];
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
142
|
+
const visitedPageTokens = new Set();
|
|
143
|
+
let requestPageToken = pageToken;
|
|
144
|
+
let terminalStartPageToken;
|
|
145
|
+
let reachedTerminalPage = false;
|
|
146
|
+
for (let page = 0; page < MAX_CHANGE_PAGES_PER_POLL; page += 1) {
|
|
147
|
+
if (visitedPageTokens.has(requestPageToken)) {
|
|
148
|
+
throw new Error(`Drive changes pagination repeated a page token for ${tokenKey}`);
|
|
149
|
+
}
|
|
150
|
+
visitedPageTokens.add(requestPageToken);
|
|
151
|
+
const params = {
|
|
152
|
+
pageToken: requestPageToken,
|
|
153
|
+
pageSize: 100,
|
|
154
|
+
fields: 'changes(fileId,time,removed,file(name,mimeType,modifiedTime,lastModifyingUser,parents,driveId)),nextPageToken,newStartPageToken',
|
|
155
|
+
includeRemoved: false,
|
|
156
|
+
includeItemsFromAllDrives: true,
|
|
157
|
+
supportsAllDrives: true,
|
|
158
|
+
};
|
|
159
|
+
if (driveId) {
|
|
160
|
+
params.driveId = driveId;
|
|
155
161
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
+
const changeList = (await (0, gws_utils_js_1.execGwsAsync)([
|
|
163
|
+
'drive',
|
|
164
|
+
'changes',
|
|
165
|
+
'list',
|
|
166
|
+
'--params',
|
|
167
|
+
JSON.stringify(params),
|
|
168
|
+
]));
|
|
169
|
+
for (const change of changeList.changes) {
|
|
170
|
+
if (!change.file)
|
|
171
|
+
continue;
|
|
172
|
+
const file = change.file;
|
|
173
|
+
const parents = file.parents ?? [];
|
|
174
|
+
// Match by parent folder or by shared drive ID
|
|
175
|
+
let channelName = null;
|
|
176
|
+
const folderMatch = this.findChannelByParent(parents);
|
|
177
|
+
if (folderMatch) {
|
|
178
|
+
channelName = folderMatch[1];
|
|
179
|
+
}
|
|
180
|
+
else if (driveId) {
|
|
181
|
+
// For shared drives: use the channel key as channel name
|
|
182
|
+
for (const [key, cfg] of Object.entries(this.config.channels)) {
|
|
183
|
+
if (cfg.driveId === driveId) {
|
|
184
|
+
channelName = cfg.name ?? key;
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
162
187
|
}
|
|
163
188
|
}
|
|
189
|
+
if (!channelName)
|
|
190
|
+
continue;
|
|
191
|
+
const author = file.lastModifyingUser?.displayName ?? 'unknown';
|
|
192
|
+
items.push({
|
|
193
|
+
source: 'drive',
|
|
194
|
+
sourceId: `${change.fileId}:${change.time}`,
|
|
195
|
+
channel: channelName,
|
|
196
|
+
author,
|
|
197
|
+
content: `modified: ${file.name} (${file.mimeType})`,
|
|
198
|
+
timestamp: new Date(change.time),
|
|
199
|
+
type: 'file_change',
|
|
200
|
+
metadata: {
|
|
201
|
+
fileId: change.fileId,
|
|
202
|
+
fileName: file.name,
|
|
203
|
+
mimeType: file.mimeType,
|
|
204
|
+
modifiedTime: file.modifiedTime,
|
|
205
|
+
parents,
|
|
206
|
+
driveId: driveId || undefined,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
164
209
|
}
|
|
165
|
-
if (!
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
fileName: file.name,
|
|
179
|
-
mimeType: file.mimeType,
|
|
180
|
-
modifiedTime: file.modifiedTime,
|
|
181
|
-
parents,
|
|
182
|
-
driveId: driveId || undefined,
|
|
183
|
-
},
|
|
184
|
-
});
|
|
210
|
+
if (!changeList.nextPageToken) {
|
|
211
|
+
terminalStartPageToken = changeList.newStartPageToken;
|
|
212
|
+
reachedTerminalPage = true;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
if (visitedPageTokens.has(changeList.nextPageToken)) {
|
|
216
|
+
throw new Error(`Drive changes pagination repeated a page token for ${tokenKey}`);
|
|
217
|
+
}
|
|
218
|
+
requestPageToken = changeList.nextPageToken;
|
|
219
|
+
}
|
|
220
|
+
if (!reachedTerminalPage) {
|
|
221
|
+
this.pageTokens.set(tokenKey, requestPageToken);
|
|
222
|
+
return items;
|
|
185
223
|
}
|
|
186
|
-
if (
|
|
187
|
-
|
|
224
|
+
if (typeof terminalStartPageToken !== 'string' || terminalStartPageToken.length === 0) {
|
|
225
|
+
throw new Error(`Drive changes terminal page omitted the new start page token for ${tokenKey}`);
|
|
188
226
|
}
|
|
227
|
+
this.pageTokens.set(tokenKey, terminalStartPageToken);
|
|
189
228
|
return items;
|
|
190
229
|
}
|
|
191
230
|
async poll(_since) {
|
|
@@ -195,14 +234,19 @@ class DriveConnector {
|
|
|
195
234
|
// 1. Poll personal drive (for folder-based channels)
|
|
196
235
|
const hasFolderChannels = Object.values(this.config.channels).some((c) => c.folderId && !c.driveId);
|
|
197
236
|
if (hasFolderChannels) {
|
|
198
|
-
allItems.push(...this.pollDrive('drive'));
|
|
237
|
+
allItems.push(...(await this.pollDrive('drive')));
|
|
199
238
|
}
|
|
200
239
|
// 2. Poll each shared drive
|
|
201
240
|
for (const { driveId, channelKey } of this.getSharedDriveIds()) {
|
|
202
241
|
try {
|
|
203
|
-
allItems.push(...this.pollDrive(`shared:${driveId}`, driveId));
|
|
242
|
+
allItems.push(...(await this.pollDrive(`shared:${driveId}`, driveId)));
|
|
204
243
|
}
|
|
205
244
|
catch (err) {
|
|
245
|
+
hadError = true;
|
|
246
|
+
this.lastError =
|
|
247
|
+
err instanceof Error
|
|
248
|
+
? `Shared drive ${channelKey}: ${err.message}`
|
|
249
|
+
: `Shared drive ${channelKey}: ${String(err)}`;
|
|
206
250
|
console.error(`[drive] Shared drive ${channelKey} poll error:`, err);
|
|
207
251
|
}
|
|
208
252
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/drive/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iDAAyC;AACzC,2BAAwE;AACxE,+BAA4B;AAC5B,2BAA6B;AAS7B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/drive/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,iDAAyC;AACzC,2BAAwE;AACxE,+BAA4B;AAC5B,2BAA6B;AAS7B,4DAAyD;AAEzD,MAAM,yBAAyB,GAAG,CAAC,CAAC;AA6BpC,MAAa,cAAc;IAChB,IAAI,GAAG,OAAO,CAAC;IACf,IAAI,GAAG,KAAc,CAAC;IAEvB,MAAM,CAAkB;IACxB,YAAY,GAAgB,IAAI,CAAC;IACjC,aAAa,GAAG,CAAC,CAAC;IAClB,SAAS,GAAuB,SAAS,CAAC;IAElD,sFAAsF;IAC9E,UAAU,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEnC,aAAa,GAAG,IAAA,WAAI,EACnC,IAAA,YAAO,GAAE,EACT,OAAO,EACP,YAAY,EACZ,OAAO,EACP,kBAAkB,CACnB,CAAC;IAEF,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAEO,SAAS;QACf,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;gBACnE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAW,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,SAAS;QACf,MAAM,GAAG,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAA,cAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjD,IAAA,kBAAa,EAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,IAAI,CAAC,SAAS;SACtB,CAAC;IACJ,CAAC;IAED,mBAAmB;QACjB,OAAO;YACL;gBACE,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,KAAK;gBACV,cAAc,EAAE,gBAAgB;gBAChC,WAAW,EAAE,0DAA0D;aACxE;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,IAAA,wBAAQ,EAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,mBAAmB,CAAC,OAAiB;QAC3C,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5E,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAC3C,IAAI,CAAC,UAAU,CAAC,QAAQ;gBAAE,SAAS;YACnC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACK,iBAAiB;QACvB,MAAM,MAAM,GAAmD,EAAE,CAAC;QAClE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,OAA6B,CAAC;YAClD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAgB;QACxD,+BAA+B;QAC/B,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,WAAW,GAA4B,EAAE,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC9B,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC;YACvC,CAAC;YACD,MAAM,WAAW,GAAG,CAAC,MAAM,IAAA,2BAAY,EAAC;gBACtC,OAAO;gBACP,SAAS;gBACT,mBAAmB;gBACnB,UAAU;gBACV,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;aAC5B,CAAC,CAAyB,CAAC;YAC5B,SAAS,GAAG,WAAW,CAAC,cAAc,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,KAAK,GAAqB,EAAE,CAAC;QACnC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC5C,IAAI,gBAAgB,GAAG,SAAS,CAAC;QACjC,IAAI,sBAA0C,CAAC;QAC/C,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAEhC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,yBAAyB,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;YAC/D,IAAI,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,sDAAsD,QAAQ,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAExC,MAAM,MAAM,GAA4B;gBACtC,SAAS,EAAE,gBAAgB;gBAC3B,QAAQ,EAAE,GAAG;gBACb,MAAM,EACJ,iIAAiI;gBACnI,cAAc,EAAE,KAAK;gBACrB,yBAAyB,EAAE,IAAI;gBAC/B,iBAAiB,EAAE,IAAI;aACxB,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YAC3B,CAAC;YAED,MAAM,UAAU,GAAG,CAAC,MAAM,IAAA,2BAAY,EAAC;gBACrC,OAAO;gBACP,SAAS;gBACT,MAAM;gBACN,UAAU;gBACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;aACvB,CAAC,CAAoB,CAAC;YAEvB,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,IAAI;oBAAE,SAAS;gBAE3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;gBAEnC,+CAA+C;gBAC/C,IAAI,WAAW,GAAkB,IAAI,CAAC;gBACtC,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,WAAW,EAAE,CAAC;oBAChB,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gBAC/B,CAAC;qBAAM,IAAI,OAAO,EAAE,CAAC;oBACnB,yDAAyD;oBACzD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9D,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;4BAC5B,WAAW,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;4BAC9B,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,WAAW;oBAAE,SAAS;gBAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,IAAI,SAAS,CAAC;gBAChE,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,OAAO;oBACf,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE;oBAC3C,OAAO,EAAE,WAAW;oBACpB,MAAM;oBACN,OAAO,EAAE,aAAa,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,GAAG;oBACpD,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAChC,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE;wBACR,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,OAAO;wBACP,OAAO,EAAE,OAAO,IAAI,SAAS;qBAC9B;iBACF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;gBAC9B,sBAAsB,GAAG,UAAU,CAAC,iBAAiB,CAAC;gBACtD,mBAAmB,GAAG,IAAI,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,sDAAsD,QAAQ,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,sBAAsB,KAAK,QAAQ,IAAI,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtF,MAAM,IAAI,KAAK,CACb,oEAAoE,QAAQ,EAAE,CAC/E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;QAEtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAY;QACrB,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,IAAI,CAAC;YACH,qDAAqD;YACrD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,CAChC,CAAC;YACF,IAAI,iBAAiB,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC;YAED,4BAA4B;YAC5B,KAAK,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC/D,IAAI,CAAC;oBACH,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;gBACzE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,QAAQ,GAAG,IAAI,CAAC;oBAChB,IAAI,CAAC,SAAS;wBACZ,GAAG,YAAY,KAAK;4BAClB,CAAC,CAAC,gBAAgB,UAAU,KAAK,GAAG,CAAC,OAAO,EAAE;4BAC9C,CAAC,CAAC,gBAAgB,UAAU,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnD,OAAO,CAAC,KAAK,CAAC,wBAAwB,UAAU,cAAc,EAAE,GAAG,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,CAAC,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE1C,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA3RD,wCA2RC"}
|
|
@@ -7,4 +7,7 @@ export declare function parseGwsOutput(raw: string): unknown;
|
|
|
7
7
|
export declare function execGws(args: string, options?: {
|
|
8
8
|
maxBuffer?: number;
|
|
9
9
|
}): unknown;
|
|
10
|
+
export declare function execGwsAsync(args: string[], options?: {
|
|
11
|
+
maxBuffer?: number;
|
|
12
|
+
}): Promise<unknown>;
|
|
10
13
|
//# sourceMappingURL=gws-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gws-utils.d.ts","sourceRoot":"","sources":["../../../src/connectors/framework/gws-utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAQ/E"}
|
|
1
|
+
{"version":3,"file":"gws-utils.d.ts","sourceRoot":"","sources":["../../../src/connectors/framework/gws-utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAQ/E;AAED,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseGwsOutput = parseGwsOutput;
|
|
4
4
|
exports.execGws = execGws;
|
|
5
|
+
exports.execGwsAsync = execGwsAsync;
|
|
5
6
|
const child_process_1 = require("child_process");
|
|
6
7
|
function parseGwsOutput(raw) {
|
|
7
8
|
const lines = raw.split('\n');
|
|
@@ -25,4 +26,20 @@ function execGws(args, options) {
|
|
|
25
26
|
});
|
|
26
27
|
return parseGwsOutput(raw);
|
|
27
28
|
}
|
|
29
|
+
async function execGwsAsync(args, options) {
|
|
30
|
+
const stdout = await new Promise((resolve, reject) => {
|
|
31
|
+
(0, child_process_1.execFile)('gws', args, {
|
|
32
|
+
encoding: 'utf8',
|
|
33
|
+
maxBuffer: options?.maxBuffer,
|
|
34
|
+
timeout: 60_000,
|
|
35
|
+
}, (error, value) => {
|
|
36
|
+
if (error) {
|
|
37
|
+
reject(error);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
resolve(value);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
return parseGwsOutput(stdout);
|
|
44
|
+
}
|
|
28
45
|
//# sourceMappingURL=gws-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gws-utils.js","sourceRoot":"","sources":["../../../src/connectors/framework/gws-utils.ts"],"names":[],"mappings":";;AAEA,wCASC;AAOD,0BAQC;
|
|
1
|
+
{"version":3,"file":"gws-utils.js","sourceRoot":"","sources":["../../../src/connectors/framework/gws-utils.ts"],"names":[],"mappings":";;AAEA,wCASC;AAOD,0BAQC;AAED,oCAuBC;AAnDD,iDAAmD;AAEnD,SAAgB,cAAc,CAAC,GAAW;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAC/B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAC/E,CAAC;IACF,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,SAAgB,OAAO,CAAC,IAAY,EAAE,OAAgC;IACpE,MAAM,GAAG,GAAG,IAAA,wBAAQ,EAAC,OAAO,IAAI,EAAE,EAAE;QAClC,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,OAAO,EAAE,MAAM;KAChB,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,IAAc,EACd,OAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3D,IAAA,wBAAQ,EACN,KAAK,EACL,IAAI,EACJ;YACE,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,OAAO,EAAE,MAAM;SAChB,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACf,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SQLiteDatabase } from '../../sqlite.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adds temporal task storage inside TaskLedger's existing BEGIN IMMEDIATE.
|
|
4
|
+
* This function deliberately owns no transaction so it cannot commit a
|
|
5
|
+
* partially upgraded legacy copy-swap.
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyOperatorTaskTemporalMigration(db: SQLiteDatabase): void;
|
|
8
|
+
//# sourceMappingURL=operator-task-temporal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-task-temporal.d.ts","sourceRoot":"","sources":["../../../src/db/migrations/operator-task-temporal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAatD;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAyM3E"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyOperatorTaskTemporalMigration = applyOperatorTaskTemporalMigration;
|
|
4
|
+
const TEMPORAL_TASK_COLUMNS = [
|
|
5
|
+
['due_at', 'INTEGER'],
|
|
6
|
+
['deadline_offset_minutes', 'INTEGER CHECK (deadline_offset_minutes BETWEEN -840 AND 840)'],
|
|
7
|
+
['revision', 'INTEGER NOT NULL DEFAULT 0 CHECK (revision >= 0)'],
|
|
8
|
+
['temporal_epoch', 'INTEGER NOT NULL DEFAULT 0 CHECK (temporal_epoch >= 0)'],
|
|
9
|
+
['temporal_reconciled_occurrence_key', 'TEXT'],
|
|
10
|
+
['last_temporal_checked_at', 'INTEGER'],
|
|
11
|
+
['next_temporal_check_at', 'INTEGER'],
|
|
12
|
+
['last_temporal_attempt_id', 'INTEGER'],
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Adds temporal task storage inside TaskLedger's existing BEGIN IMMEDIATE.
|
|
16
|
+
* This function deliberately owns no transaction so it cannot commit a
|
|
17
|
+
* partially upgraded legacy copy-swap.
|
|
18
|
+
*/
|
|
19
|
+
function applyOperatorTaskTemporalMigration(db) {
|
|
20
|
+
const columns = new Set(db.prepare('PRAGMA table_info(operator_tasks)').all().map((column) => column.name));
|
|
21
|
+
for (const [name, definition] of TEMPORAL_TASK_COLUMNS) {
|
|
22
|
+
if (!columns.has(name)) {
|
|
23
|
+
db.exec(`ALTER TABLE operator_tasks ADD COLUMN ${name} ${definition}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
db.exec(`
|
|
27
|
+
DROP INDEX IF EXISTS idx_operator_temporal_generations_task_occurrence;
|
|
28
|
+
DROP INDEX IF EXISTS idx_operator_tasks_temporal_candidates;
|
|
29
|
+
|
|
30
|
+
CREATE TABLE IF NOT EXISTS operator_temporal_generations (
|
|
31
|
+
generation_key TEXT PRIMARY KEY,
|
|
32
|
+
task_id INTEGER NOT NULL REFERENCES operator_tasks(id),
|
|
33
|
+
temporal_epoch INTEGER NOT NULL CHECK (temporal_epoch >= 0),
|
|
34
|
+
occurrence_key TEXT NOT NULL,
|
|
35
|
+
check_at INTEGER NOT NULL,
|
|
36
|
+
disposition TEXT NOT NULL DEFAULT 'active'
|
|
37
|
+
CHECK (disposition IN ('active','resolved','final_no_update','deferred','exhausted','superseded')),
|
|
38
|
+
last_workorder_id INTEGER REFERENCES operator_tasks(id),
|
|
39
|
+
reason TEXT,
|
|
40
|
+
created_at INTEGER NOT NULL,
|
|
41
|
+
updated_at INTEGER NOT NULL
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE TABLE IF NOT EXISTS operator_temporal_effects (
|
|
45
|
+
workorder_attempt_id INTEGER PRIMARY KEY REFERENCES operator_tasks(id),
|
|
46
|
+
task_id INTEGER NOT NULL REFERENCES operator_tasks(id),
|
|
47
|
+
generation_key TEXT NOT NULL REFERENCES operator_temporal_generations(generation_key),
|
|
48
|
+
occurrence_key TEXT NOT NULL,
|
|
49
|
+
outcome TEXT NOT NULL
|
|
50
|
+
CHECK (outcome IN ('resolved','final_no_update','deferred')),
|
|
51
|
+
before_revision INTEGER NOT NULL CHECK (before_revision >= 0),
|
|
52
|
+
after_revision INTEGER NOT NULL CHECK (after_revision >= 0),
|
|
53
|
+
changed_fields TEXT NOT NULL,
|
|
54
|
+
reason TEXT NOT NULL,
|
|
55
|
+
attestation_version INTEGER NOT NULL DEFAULT 0 CHECK (attestation_version IN (0, 1)),
|
|
56
|
+
context_packet_id TEXT NOT NULL,
|
|
57
|
+
context_packet_sha256 TEXT NOT NULL,
|
|
58
|
+
next_temporal_check_at INTEGER,
|
|
59
|
+
created_at INTEGER NOT NULL
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
CREATE INDEX IF NOT EXISTS idx_operator_tasks_temporal_scan_id
|
|
63
|
+
ON operator_tasks(id)
|
|
64
|
+
WHERE kind = 'owner' AND status IN ('pending','in_progress','review','blocked')
|
|
65
|
+
AND (due_at IS NOT NULL OR deadline IS NOT NULL OR next_temporal_check_at IS NOT NULL);
|
|
66
|
+
CREATE INDEX IF NOT EXISTS idx_operator_tasks_temporal_open_event
|
|
67
|
+
ON operator_tasks(source_event_id, id)
|
|
68
|
+
WHERE kind = 'system' AND source_channel = 'workorder:temporal'
|
|
69
|
+
AND status IN ('pending','in_progress');
|
|
70
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_operator_temporal_generations_identity
|
|
71
|
+
ON operator_temporal_generations(task_id, temporal_epoch, occurrence_key, check_at);
|
|
72
|
+
CREATE INDEX IF NOT EXISTS idx_operator_temporal_generations_active
|
|
73
|
+
ON operator_temporal_generations(generation_key, last_workorder_id)
|
|
74
|
+
WHERE disposition = 'active' AND last_workorder_id IS NOT NULL;
|
|
75
|
+
CREATE INDEX IF NOT EXISTS idx_operator_temporal_generations_workorder
|
|
76
|
+
ON operator_temporal_generations(last_workorder_id);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_operator_temporal_effects_task_occurrence
|
|
78
|
+
ON operator_temporal_effects(task_id, occurrence_key, created_at);
|
|
79
|
+
|
|
80
|
+
CREATE TRIGGER IF NOT EXISTS trg_operator_tasks_legacy_deadline_write
|
|
81
|
+
AFTER UPDATE OF deadline ON operator_tasks
|
|
82
|
+
WHEN NEW.kind = 'owner'
|
|
83
|
+
AND NEW.deadline IS NOT OLD.deadline
|
|
84
|
+
AND NEW.due_at IS OLD.due_at
|
|
85
|
+
AND NEW.temporal_epoch = OLD.temporal_epoch
|
|
86
|
+
BEGIN
|
|
87
|
+
UPDATE operator_tasks
|
|
88
|
+
SET due_at = NULL,
|
|
89
|
+
deadline_offset_minutes = NULL,
|
|
90
|
+
revision = OLD.revision + 1,
|
|
91
|
+
temporal_epoch = OLD.temporal_epoch + 1,
|
|
92
|
+
temporal_reconciled_occurrence_key = NULL,
|
|
93
|
+
last_temporal_checked_at = NULL,
|
|
94
|
+
next_temporal_check_at = NULL,
|
|
95
|
+
last_temporal_attempt_id = NULL
|
|
96
|
+
WHERE id = NEW.id;
|
|
97
|
+
UPDATE operator_temporal_generations
|
|
98
|
+
SET disposition = 'superseded', reason = 'legacy-deadline-write', updated_at = NEW.updated_at
|
|
99
|
+
WHERE task_id = NEW.id AND disposition = 'active';
|
|
100
|
+
UPDATE operator_tasks
|
|
101
|
+
SET status = 'cancelled', latest_event = 'legacy-deadline-write', updated_at = NEW.updated_at
|
|
102
|
+
WHERE kind = 'system' AND source_channel = 'workorder:temporal'
|
|
103
|
+
AND status IN ('pending','in_progress')
|
|
104
|
+
AND source_event_id IN (
|
|
105
|
+
SELECT generation_key FROM operator_temporal_generations WHERE task_id = NEW.id
|
|
106
|
+
);
|
|
107
|
+
END;
|
|
108
|
+
|
|
109
|
+
CREATE TRIGGER IF NOT EXISTS trg_operator_tasks_legacy_status_write
|
|
110
|
+
AFTER UPDATE OF status ON operator_tasks
|
|
111
|
+
WHEN NEW.kind = 'owner'
|
|
112
|
+
AND NEW.status IS NOT OLD.status
|
|
113
|
+
AND NEW.revision = OLD.revision
|
|
114
|
+
BEGIN
|
|
115
|
+
UPDATE operator_tasks
|
|
116
|
+
SET revision = OLD.revision + 1,
|
|
117
|
+
temporal_epoch = CASE
|
|
118
|
+
WHEN OLD.status IN ('done','cancelled')
|
|
119
|
+
AND NEW.status NOT IN ('done','cancelled')
|
|
120
|
+
THEN OLD.temporal_epoch + 1
|
|
121
|
+
ELSE OLD.temporal_epoch
|
|
122
|
+
END,
|
|
123
|
+
temporal_reconciled_occurrence_key = CASE
|
|
124
|
+
WHEN OLD.status IN ('done','cancelled')
|
|
125
|
+
AND NEW.status NOT IN ('done','cancelled')
|
|
126
|
+
THEN NULL
|
|
127
|
+
ELSE NEW.temporal_reconciled_occurrence_key
|
|
128
|
+
END,
|
|
129
|
+
last_temporal_checked_at = CASE
|
|
130
|
+
WHEN OLD.status IN ('done','cancelled')
|
|
131
|
+
AND NEW.status NOT IN ('done','cancelled')
|
|
132
|
+
THEN NULL
|
|
133
|
+
ELSE NEW.last_temporal_checked_at
|
|
134
|
+
END,
|
|
135
|
+
next_temporal_check_at = CASE
|
|
136
|
+
WHEN OLD.status IN ('done','cancelled')
|
|
137
|
+
AND NEW.status NOT IN ('done','cancelled')
|
|
138
|
+
THEN NULL
|
|
139
|
+
ELSE NEW.next_temporal_check_at
|
|
140
|
+
END,
|
|
141
|
+
last_temporal_attempt_id = CASE
|
|
142
|
+
WHEN OLD.status IN ('done','cancelled')
|
|
143
|
+
AND NEW.status NOT IN ('done','cancelled')
|
|
144
|
+
THEN NULL
|
|
145
|
+
ELSE NEW.last_temporal_attempt_id
|
|
146
|
+
END
|
|
147
|
+
WHERE id = NEW.id;
|
|
148
|
+
UPDATE operator_tasks
|
|
149
|
+
SET status = 'cancelled',
|
|
150
|
+
latest_event = CASE
|
|
151
|
+
WHEN NEW.status IN ('done','cancelled') THEN 'legacy-owner-task-closed'
|
|
152
|
+
ELSE 'legacy-owner-task-reopened'
|
|
153
|
+
END,
|
|
154
|
+
updated_at = NEW.updated_at
|
|
155
|
+
WHERE kind = 'system' AND source_channel = 'workorder:temporal'
|
|
156
|
+
AND status IN ('pending','in_progress')
|
|
157
|
+
AND source_event_id IN (
|
|
158
|
+
SELECT generation_key FROM operator_temporal_generations
|
|
159
|
+
WHERE task_id = NEW.id AND disposition = 'active'
|
|
160
|
+
)
|
|
161
|
+
AND (
|
|
162
|
+
(OLD.status IN ('done','cancelled') AND NEW.status NOT IN ('done','cancelled'))
|
|
163
|
+
OR
|
|
164
|
+
(OLD.status NOT IN ('done','cancelled') AND NEW.status IN ('done','cancelled'))
|
|
165
|
+
);
|
|
166
|
+
UPDATE operator_temporal_generations
|
|
167
|
+
SET disposition = 'superseded',
|
|
168
|
+
reason = CASE
|
|
169
|
+
WHEN NEW.status IN ('done','cancelled') THEN 'legacy-owner-task-closed'
|
|
170
|
+
ELSE 'legacy-owner-task-reopened'
|
|
171
|
+
END,
|
|
172
|
+
updated_at = NEW.updated_at
|
|
173
|
+
WHERE task_id = NEW.id AND disposition = 'active'
|
|
174
|
+
AND (
|
|
175
|
+
(OLD.status IN ('done','cancelled') AND NEW.status NOT IN ('done','cancelled'))
|
|
176
|
+
OR
|
|
177
|
+
(OLD.status NOT IN ('done','cancelled') AND NEW.status IN ('done','cancelled'))
|
|
178
|
+
);
|
|
179
|
+
END;
|
|
180
|
+
|
|
181
|
+
CREATE TRIGGER IF NOT EXISTS trg_operator_tasks_legacy_content_write
|
|
182
|
+
AFTER UPDATE OF title, priority, assignee, latest_event, confirmed ON operator_tasks
|
|
183
|
+
WHEN NEW.kind = 'owner'
|
|
184
|
+
AND NEW.revision = OLD.revision
|
|
185
|
+
AND (
|
|
186
|
+
NEW.title IS NOT OLD.title
|
|
187
|
+
OR NEW.priority IS NOT OLD.priority
|
|
188
|
+
OR NEW.assignee IS NOT OLD.assignee
|
|
189
|
+
OR NEW.latest_event IS NOT OLD.latest_event
|
|
190
|
+
OR NEW.confirmed IS NOT OLD.confirmed
|
|
191
|
+
)
|
|
192
|
+
BEGIN
|
|
193
|
+
UPDATE operator_tasks SET revision = OLD.revision + 1 WHERE id = NEW.id;
|
|
194
|
+
END;
|
|
195
|
+
`);
|
|
196
|
+
const effectColumns = new Set(db.prepare('PRAGMA table_info(operator_temporal_effects)').all().map((column) => column.name));
|
|
197
|
+
if (!effectColumns.has('context_packet_id')) {
|
|
198
|
+
db.exec(`ALTER TABLE operator_temporal_effects ADD COLUMN context_packet_id TEXT`);
|
|
199
|
+
}
|
|
200
|
+
if (!effectColumns.has('context_packet_sha256')) {
|
|
201
|
+
db.exec(`ALTER TABLE operator_temporal_effects ADD COLUMN context_packet_sha256 TEXT`);
|
|
202
|
+
}
|
|
203
|
+
if (!effectColumns.has('attestation_version')) {
|
|
204
|
+
db.exec(`ALTER TABLE operator_temporal_effects
|
|
205
|
+
ADD COLUMN attestation_version INTEGER NOT NULL DEFAULT 0
|
|
206
|
+
CHECK (attestation_version IN (0, 1))`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=operator-task-temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator-task-temporal.js","sourceRoot":"","sources":["../../../src/db/migrations/operator-task-temporal.ts"],"names":[],"mappings":";;AAkBA,gFAyMC;AAzND,MAAM,qBAAqB,GAAG;IAC5B,CAAC,QAAQ,EAAE,SAAS,CAAC;IACrB,CAAC,yBAAyB,EAAE,8DAA8D,CAAC;IAC3F,CAAC,UAAU,EAAE,kDAAkD,CAAC;IAChE,CAAC,gBAAgB,EAAE,wDAAwD,CAAC;IAC5E,CAAC,oCAAoC,EAAE,MAAM,CAAC;IAC9C,CAAC,0BAA0B,EAAE,SAAS,CAAC;IACvC,CAAC,wBAAwB,EAAE,SAAS,CAAC;IACrC,CAAC,0BAA0B,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEX;;;;GAIG;AACH,SAAgB,kCAAkC,CAAC,EAAkB;IACnE,MAAM,OAAO,GAAG,IAAI,GAAG,CACpB,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAA8B,CAAC,GAAG,CACpF,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CACxB,CACF,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,qBAAqB,EAAE,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,EAAE,CAAC,IAAI,CAAC,yCAAyC,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyKP,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAEzB,EAAE,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC,GAAG,EAC/D,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAC/B,CAAC;IACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5C,EAAE,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAChD,EAAE,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC9C,EAAE,CAAC,IAAI,CACL;;6CAEuC,CACxC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/envelope/enforcer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AAGxD,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAKzD;
|
|
1
|
+
{"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/envelope/enforcer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,YAAY,CAAC;AAGxD,qBAAa,iBAAkB,SAAQ,KAAK;aAGxB,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM;CAKzD;AAgDD,qBAAa,gBAAgB;IAC3B,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAYnF,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,iBAAiB;IAkDzB,OAAO,CAAC,SAAS;CAQlB"}
|
|
@@ -19,6 +19,15 @@ const SEND_TOOLS_TO_DESTINATION_KIND = {
|
|
|
19
19
|
chatwork_send: 'chatwork',
|
|
20
20
|
discord_send: 'discord',
|
|
21
21
|
webchat_send: 'webchat',
|
|
22
|
+
drive_upload: 'drive',
|
|
23
|
+
};
|
|
24
|
+
const DESTINATION_ID_FIELD_BY_TOOL = {
|
|
25
|
+
telegram_send: 'chat_id',
|
|
26
|
+
slack_send: 'channel_id',
|
|
27
|
+
chatwork_send: 'channel_id',
|
|
28
|
+
discord_send: 'channel_id',
|
|
29
|
+
webchat_send: 'session_id',
|
|
30
|
+
drive_upload: 'folderId',
|
|
22
31
|
};
|
|
23
32
|
const WRITE_OR_SEND_TOOLS = new Set([
|
|
24
33
|
'mama_save',
|
|
@@ -38,6 +47,7 @@ const WRITE_OR_SEND_TOOLS = new Set([
|
|
|
38
47
|
'report_publish',
|
|
39
48
|
'wiki_publish',
|
|
40
49
|
'human.correction',
|
|
50
|
+
'drive_upload',
|
|
41
51
|
]);
|
|
42
52
|
const MEMORY_SCOPED_TOOLS = new Set([
|
|
43
53
|
'mama_save',
|
|
@@ -62,24 +72,26 @@ class EnvelopeEnforcer {
|
|
|
62
72
|
expiresAt = (0, expiry_js_1.parseEnvelopeExpiresAt)(envelope.expires_at);
|
|
63
73
|
}
|
|
64
74
|
catch {
|
|
65
|
-
throw new EnvelopeViolation(
|
|
75
|
+
throw new EnvelopeViolation('Envelope expiry is invalid', 'invalid_expiry');
|
|
66
76
|
}
|
|
67
77
|
if (expiresAt <= Date.now()) {
|
|
68
|
-
throw new EnvelopeViolation(
|
|
78
|
+
throw new EnvelopeViolation('Envelope has expired', 'expired');
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
81
|
checkDestination(envelope, toolName, args) {
|
|
72
|
-
|
|
73
|
-
if (!destinationKind) {
|
|
82
|
+
if (!Object.hasOwn(SEND_TOOLS_TO_DESTINATION_KIND, toolName)) {
|
|
74
83
|
return;
|
|
75
84
|
}
|
|
76
|
-
const
|
|
85
|
+
const destinationToolName = toolName;
|
|
86
|
+
const destinationKind = SEND_TOOLS_TO_DESTINATION_KIND[destinationToolName];
|
|
87
|
+
const destinationField = DESTINATION_ID_FIELD_BY_TOOL[destinationToolName];
|
|
88
|
+
const destinationId = getStringArg(args, destinationField);
|
|
77
89
|
if (!destinationId) {
|
|
78
90
|
throw new EnvelopeViolation(`Tool ${toolName} called without destination id`, 'missing_destination');
|
|
79
91
|
}
|
|
80
92
|
const allowed = envelope.scope.allowed_destinations.some((destination) => destination.kind === destinationKind && destination.id === destinationId);
|
|
81
93
|
if (!allowed) {
|
|
82
|
-
throw new EnvelopeViolation(
|
|
94
|
+
throw new EnvelopeViolation('Requested destination is outside envelope.scope.allowed_destinations', 'destination_out_of_scope');
|
|
83
95
|
}
|
|
84
96
|
}
|
|
85
97
|
checkRawConnectors(envelope, toolName, args) {
|
|
@@ -89,7 +101,7 @@ class EnvelopeEnforcer {
|
|
|
89
101
|
}
|
|
90
102
|
const outOfScope = requestedConnectors.filter((connector) => !envelope.scope.raw_connectors.includes(connector));
|
|
91
103
|
if (outOfScope.length > 0) {
|
|
92
|
-
throw new EnvelopeViolation(
|
|
104
|
+
throw new EnvelopeViolation('Requested raw connector is outside envelope.scope.raw_connectors', 'connector_out_of_scope');
|
|
93
105
|
}
|
|
94
106
|
}
|
|
95
107
|
checkMemoryScopes(envelope, toolName, args) {
|
|
@@ -115,7 +127,7 @@ class EnvelopeEnforcer {
|
|
|
115
127
|
if (toolName === 'context_compile' && isRecord(args) && Array.isArray(args.scopes)) {
|
|
116
128
|
return;
|
|
117
129
|
}
|
|
118
|
-
throw new EnvelopeViolation('Memory tools must execute with an explicit envelope memory scope', 'memory_scope_out_of_scope'
|
|
130
|
+
throw new EnvelopeViolation('Memory tools must execute with an explicit envelope memory scope', 'memory_scope_out_of_scope');
|
|
119
131
|
}
|
|
120
132
|
const allowedScopeKeys = new Set(envelope.scope.memory_scopes.map((scope) => `${scope.kind}:${scope.id}`));
|
|
121
133
|
const outOfScope = requestedScopes.some((scope) => !allowedScopeKeys.has(`${scope.kind}:${scope.id}`));
|
|
@@ -125,12 +137,15 @@ class EnvelopeEnforcer {
|
|
|
125
137
|
}
|
|
126
138
|
checkTier(envelope, toolName) {
|
|
127
139
|
if (envelope.tier === 3 && WRITE_OR_SEND_TOOLS.has(toolName)) {
|
|
128
|
-
throw new EnvelopeViolation(`Tool ${toolName} not allowed at tier 3 (read-only)`, 'tier_violation'
|
|
140
|
+
throw new EnvelopeViolation(`Tool ${toolName} not allowed at tier 3 (read-only)`, 'tier_violation');
|
|
129
141
|
}
|
|
130
142
|
}
|
|
131
143
|
}
|
|
132
144
|
exports.EnvelopeEnforcer = EnvelopeEnforcer;
|
|
133
145
|
function requestedRawConnectorsForTool(toolName, args) {
|
|
146
|
+
if (toolName.startsWith('drive_')) {
|
|
147
|
+
return ['drive'];
|
|
148
|
+
}
|
|
134
149
|
if (toolName === 'context_compile') {
|
|
135
150
|
return uniqueStrings([
|
|
136
151
|
...(getStringArrayArg(args, 'connectors') ?? []),
|