@xopcai/xopc 0.0.168 → 0.0.170
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/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-DjEDu38T.js → activity-store-CkUp1qvf.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVuLzaJi.js → agent-avatar-dicebear-DDuem4HM.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-tF_QTWxn.js → agents-BiaQhiQp.js} +2 -2
- package/dist/gateway/static/root/assets/{api-DwVCuPOb.js → api-BnuPQhJW.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-spzVBvAu.js → app-management-settings-panel-DdZw8Hi1.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CetimI47.js → appearance-settings-BN8Vk2bX.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-HDyN6Fjx.js → apps-page-CuL8Q4yF.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-TOmQ2XKc.js → archive-plugin-C82MaDQj.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-NFNEWVLJ.js → attachment-load-uilrwSdW.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-B0FnLpSl.js → automation-suggestion-card-CkDZjAmy.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-DVevVD6A.js → automations-page-TZOluRNp.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-Csc4xkR9.js → binary-plugins-B7NTL0_T.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C6Xgrbse.js → block-editor-D_LDNlB-.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-CyDDEKxB.js → browser-settings-page-C-l6O68Z.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-DaxyAai1.js → browser-workflow-inputs-UFVUzn4v.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-CaX6iIJA.js → browser-workflows-page-CGgC0N92.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-EXZv96j1.js → capabilities-settings-panel-BW8c0xPp.js} +6 -6
- package/dist/gateway/static/root/assets/{capability-presets-api-DdCHSzcA.js → capability-presets-api-DUIorGUd.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-PTz00nR4.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BOkLI89e.js → channel-recipient-api-BYwSB8c6.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-settings-aCN05KdJ.js → channels-settings-h9CsE0GT.js} +1 -1
- package/dist/gateway/static/root/assets/channels-status-swr-C058Mcfr.js +1 -0
- package/dist/gateway/static/root/assets/{chunk-KS7C4IRE-uQ0fehio.js → chunk-KS7C4IRE-BMhrPKJC.js} +2 -2
- package/dist/gateway/static/root/assets/{connector-logo-Mp40HWsb.js → connector-logo-CsbegNqi.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-i0cu5rg5.js → connectors-page-BWALafGW.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-BtzUJ0d7.js → desktop-pet-CkT98fPT.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-Dg0Duj8B.js → desktop-pet-settings-DkbIzdA3.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-9f0k1wZq.js → directory-picker-path-field-dBQvj1sG.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-rdW7dsGP.js → dreaming-settings-DkdnKMZx.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-C9zUnn-z.js → extension-debug-page-BfxoIiNo.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Cy5rfU0h.js → extension-page-EIJ3wIb7.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BjIquAw6.js → extension-settings-page-DBBec51N.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-AQQmI6SW.js → gateway-config-api-4_u53Ufq.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-CYNmbqHj.js → gateway-settings-v9kJM59H.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-qnEmj-vL.js → gateway-startup-retry-CXITih5d.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-CkXaDfN3.js → goal-create-dialog-y2Y3p7_k.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-detail-page-FqDa5bfO.js → goal-detail-page-DuzL-alv.js} +3 -3
- package/dist/gateway/static/root/assets/{goals-config-api-CaVGtM6n.js → goals-config-api-D54YQPon.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-B-uBRGN6.js → goals-page-OeLtfKI2.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-settings-C9J3MX0F.js → goals-settings-DDezXaVi.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-C0qFLyew.js → heartbeat-settings-CRsIUeZN.js} +1 -1
- package/dist/gateway/static/root/assets/image-generation-api-CY6cQUHL.js +1 -0
- package/dist/gateway/static/root/assets/index-Dfq2laZe.js +212 -0
- package/dist/gateway/static/root/assets/index-o4uaOGKT.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BAZlRZMd.js → keyboard-shortcuts-settings-D9k7EDdY.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-DkJUQRyC.js → local-app-workbench-page-3ssYIEK6.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-PcQABi7F.js → local-apps-page-DbaiBolh.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-tnRLWdx2.js → locale-store-Dqp9H2Uf.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-B-nXM29t.js → logs-page-DoCY0Mm9.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-B6W1H0Fj.js → markdown-split-BGlQR-Be.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-B-r9Tj74.js → media-plugins-BpaeV6f_.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-B1EG4gdu.js → messages-KEk-hTFt.js} +2 -2
- package/dist/gateway/static/root/assets/notes-page-Cd2HpciM.js +1 -0
- package/dist/gateway/static/root/assets/{notes-workbench-Be97S0Im.js → notes-workbench-CatZNAPc.js} +2 -2
- package/dist/gateway/static/root/assets/{page-tabs-BmUWVWO9.js → page-tabs-DyimBUp_.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-a76A8p5R.js → preview-open-alternatives-BKZulEYr.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-BWhYrt-U.js → product-open-page-Bjz9BxBY.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DJUOgqm4.js +1 -0
- package/dist/gateway/static/root/assets/{projects-page-D1MNrLcy.js → projects-page-BQQAD_nu.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-GTuiqlJO.js → remote-access-hub-fIGXTTnA.js} +1 -1
- package/dist/gateway/static/root/assets/{save-bar-controls-_ZMLDSUw.js → save-bar-controls-BPTqb2_r.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-D4ErObRc.js → schedule-field-YN0D81Dk.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-PqNSGlcH.js → schema-form-BmY5PSS2.js} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-Ct0MVjNv.js → sessions-page-BuU-8FCe.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlKoeZm3.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-BCKaoLhJ.js → settings-form-section-B-RhgD_p.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-Dn95fked.js → settings-loading-skeleton-DkPupX2B.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C8MPUl2Q.js → settings-page-2QBMvaxj.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-Bigc8-GR.js → settings-page-layout-CtrW-LD6.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-DFTcAHsd.js → setup-status-panel-BSUcDFnb.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-xAjqaV4y.js → share-preview-page-BezIW1n9.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-D2uvC_aM.js → shares-settings-Bk2-SwGJ.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-e_Fx1kVC.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-6dr3RRVW.js → skills-page-D_cCADfj.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BJJQulg9.js → system-settings-panel-WAFhKyAu.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-H9T49Iar.js → theme-store-BiC0gIBa.js} +1 -1
- package/dist/gateway/static/root/assets/{time-picker-DsuPUbRE.js → time-picker-fqRXpNJV.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-Djk3F3EL.js → typed-models-lib-WAQO3F_8.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-UACJTyH0.js → use-channel-catalog-CKlfsSeU.js} +1 -1
- package/dist/gateway/static/root/assets/{user-context-page-BC585kHK.js → user-context-page-9Ov4htPW.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CvocOFat.js → voice-api-key-field-BAFHF0_v.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-DiMn6nrT.js → work-discovery-page-DGN2FxWv.js} +1 -1
- package/dist/gateway/static/root/assets/{work-item-detail-page-CFBlQbPy.js → work-item-detail-page-HmyWSgUo.js} +1 -1
- package/dist/gateway/static/root/assets/work-page-D3iKVjFq.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DbQwWPjv.js → workflow-run-setup-panel-1OP4HyvS.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-B5L4SFw4.js +11 -0
- package/dist/gateway/static/root/index.html +8 -8
- package/dist/package.js +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js +2 -1
- package/dist/src/agent/service/process-direct-streaming.js +2 -1
- package/dist/src/agent/workflow/builtins/index.js +2 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/onboard/model.d.ts +2 -0
- package/dist/src/cli/commands/onboard/model.js +16 -3
- package/dist/src/config/schema.d.ts +2 -4
- package/dist/src/config/schema.js +1 -2
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/routes/composer-history.d.ts +3 -0
- package/dist/src/gateway/hono/routes/composer-history.js +28 -0
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/sessions.js +13 -2
- package/dist/src/gateway/service/sessions-api.js +2 -2
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/session/client-history.d.ts +2 -0
- package/dist/src/session/client-history.js +2 -0
- package/dist/src/session/reset-policy.js +3 -5
- package/dist/src/session/store.d.ts +1 -0
- package/dist/src/session/store.js +19 -8
- package/dist/src/storage/sqlite/composer-input-history-repository.d.ts +12 -0
- package/dist/src/storage/sqlite/composer-input-history-repository.js +42 -0
- package/dist/src/storage/sqlite/index.d.ts +2 -1
- package/dist/src/storage/sqlite/index.js +3 -2
- package/dist/src/storage/sqlite/migrations/059_composer_input_history.sql +8 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/transcript-repository.d.ts +4 -3
- package/dist/src/storage/sqlite/transcript-repository.js +31 -22
- package/dist/src/tui/backends/embedded-backend.d.ts +3 -1
- package/dist/src/tui/backends/embedded-backend.js +7 -0
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +13 -0
- package/dist/src/tui/components/custom-editor.d.ts +1 -0
- package/dist/src/tui/components/custom-editor.js +6 -0
- package/dist/src/tui/tui-backend.d.ts +9 -0
- package/dist/src/tui/tui-submit.d.ts +1 -0
- package/dist/src/tui/tui-submit.js +1 -1
- package/dist/src/tui/tui.js +58 -1
- package/dist/src/workflows/domain/result.d.ts +4 -15
- package/dist/src/workflows/engine/workflow-engine.js +5 -14
- package/dist/src/workflows/runtime/graph-workflow-runtime.js +7 -11
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/dist/src/workflows/store/run-index-store.js +1 -6
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-o08SXqM4.js +0 -2
- package/dist/gateway/static/root/assets/channels-status-swr-ZrqadU60.js +0 -1
- package/dist/gateway/static/root/assets/index-DchbD-qM.js +0 -199
- package/dist/gateway/static/root/assets/index-DfE2j0g8.css +0 -1
- package/dist/gateway/static/root/assets/notes-page-BNECY6Oy.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-md0ANZ-f.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-QOUph2Oq.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DYtfQXB-.js +0 -1
- package/dist/gateway/static/root/assets/work-page-CLJLKqsf.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-BJOhlABF.js +0 -11
|
@@ -11,30 +11,30 @@
|
|
|
11
11
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260713-1" />
|
|
12
12
|
<link rel="manifest" href="/site.webmanifest?v=20260713-1" />
|
|
13
13
|
<title>XOPC — Turn goals into loops. Keep what matters moving.</title>
|
|
14
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
+
<script type="module" crossorigin src="/assets/index-Dfq2laZe.js"></script>
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
|
|
16
16
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
|
|
17
17
|
<link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
|
|
18
18
|
<link rel="modulepreload" crossorigin href="/assets/dist-CxGUk8J-.js">
|
|
19
19
|
<link rel="modulepreload" crossorigin href="/assets/Combination-14nmIgxH.js">
|
|
20
20
|
<link rel="modulepreload" crossorigin href="/assets/dist-C230izr8.js">
|
|
21
|
-
<link rel="modulepreload" crossorigin href="/assets/chunk-KS7C4IRE-
|
|
21
|
+
<link rel="modulepreload" crossorigin href="/assets/chunk-KS7C4IRE-BMhrPKJC.js">
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/vendor-swr-BIWyz7Rc.js">
|
|
23
23
|
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-DPHK1VkS.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/check-DUBLcKHA.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/circle-alert-BEjgurr2.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/messages-
|
|
28
|
-
<link rel="modulepreload" crossorigin href="/assets/locale-store-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/messages-KEk-hTFt.js">
|
|
28
|
+
<link rel="modulepreload" crossorigin href="/assets/locale-store-Dqp9H2Uf.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/cn-JdwAhgNB.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/schemas-DgQq6Z5S.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/product-delivery-BTRT9kCS.js">
|
|
32
32
|
<link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
|
|
34
|
-
<link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-
|
|
35
|
-
<link rel="modulepreload" crossorigin href="/assets/activity-store-
|
|
36
|
-
<link rel="modulepreload" crossorigin href="/assets/theme-store-
|
|
37
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
34
|
+
<link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-CXITih5d.js">
|
|
35
|
+
<link rel="modulepreload" crossorigin href="/assets/activity-store-CkUp1qvf.js">
|
|
36
|
+
<link rel="modulepreload" crossorigin href="/assets/theme-store-BiC0gIBa.js">
|
|
37
|
+
<link rel="stylesheet" crossorigin href="/assets/index-o4uaOGKT.css">
|
|
38
38
|
</head>
|
|
39
39
|
<body>
|
|
40
40
|
<div id="root"></div>
|
package/dist/package.js
CHANGED
|
@@ -17,7 +17,8 @@ async function runProcessDirect(deps, input) {
|
|
|
17
17
|
cfg: deps.config,
|
|
18
18
|
sessionKey: input.sessionKey,
|
|
19
19
|
body: input.content,
|
|
20
|
-
resetSession: deps.resetSession
|
|
20
|
+
resetSession: deps.resetSession,
|
|
21
|
+
skipImplicitExpiry: channel === "webchat"
|
|
21
22
|
});
|
|
22
23
|
resetTriggeredAtInit = turn.resetTriggered;
|
|
23
24
|
if (turn.bareReset && turn.ackMessage) return turn.ackMessage;
|
|
@@ -154,7 +154,8 @@ async function* runProcessDirectStreaming(deps, input) {
|
|
|
154
154
|
cfg,
|
|
155
155
|
sessionKey,
|
|
156
156
|
body: input.content,
|
|
157
|
-
resetSession: deps.resetSession
|
|
157
|
+
resetSession: deps.resetSession,
|
|
158
|
+
skipImplicitExpiry: channel === "webchat"
|
|
158
159
|
});
|
|
159
160
|
resetTriggeredAtInit = turn.resetTriggered;
|
|
160
161
|
if (turn.bareReset && turn.ackMessage) {
|
|
@@ -230,12 +230,12 @@ function createParallelGraph(spec) {
|
|
|
230
230
|
{
|
|
231
231
|
id: "output",
|
|
232
232
|
kind: "output",
|
|
233
|
-
title: "
|
|
233
|
+
title: "Deliverable",
|
|
234
234
|
position: {
|
|
235
235
|
x: 1280,
|
|
236
236
|
y: 260
|
|
237
237
|
},
|
|
238
|
-
config: {
|
|
238
|
+
config: {}
|
|
239
239
|
}
|
|
240
240
|
],
|
|
241
241
|
edges: [
|
|
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
|
|
|
52
52
|
id: "database-schema",
|
|
53
53
|
label: "Database schema",
|
|
54
54
|
status: "pass",
|
|
55
|
-
message: `SQLite schema v${status.dbVersion} (current release
|
|
55
|
+
message: `SQLite schema v${status.dbVersion} (current release v59).`,
|
|
56
56
|
hints: []
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -2,5 +2,7 @@
|
|
|
2
2
|
* Catalog-driven model configuration for onboarding.
|
|
3
3
|
*/
|
|
4
4
|
import type { Config } from '../../../config/schema.js';
|
|
5
|
+
import { XopcCloudModelSource } from '../../../providers/xopc-cloud-model-source.js';
|
|
5
6
|
import type { CLIContext } from '../../registry.js';
|
|
7
|
+
export declare function refreshOnboardModelCatalogIfNeeded(provider: string, hasCatalogModels: boolean, source?: Pick<XopcCloudModelSource, 'refresh'>): Promise<void>;
|
|
6
8
|
export declare function setupModel(existingConfig: Config | null, ctx: CLIContext): Promise<Config>;
|
|
@@ -9,6 +9,7 @@ import { getDomesticProviderBaseUrl, getDomesticProviderPreset, getDomesticProvi
|
|
|
9
9
|
import { getProviderHint, getRecommendedModelsForProvider, sortModelsForPicker, sortProvidersForPicker } from "../../../providers/presentation.js";
|
|
10
10
|
import { prepareUpdateGlobalDefaults } from "../../../gateway/global-defaults-admin.js";
|
|
11
11
|
import { discoverProviderModels, isProviderApiDiscoverable } from "../../../providers/model-discovery.js";
|
|
12
|
+
import { XopcCloudModelSource } from "../../../providers/xopc-cloud-model-source.js";
|
|
12
13
|
import { listProfilesForProvider } from "../../../auth/profiles/profiles.js";
|
|
13
14
|
import { getOAuthProvider } from "../../utils/oauth-providers.js";
|
|
14
15
|
import { colors } from "../../utils/colors.js";
|
|
@@ -89,6 +90,13 @@ function getModelsForProvider(provider) {
|
|
|
89
90
|
};
|
|
90
91
|
});
|
|
91
92
|
}
|
|
93
|
+
async function refreshOnboardModelCatalogIfNeeded(provider, hasCatalogModels, source) {
|
|
94
|
+
if (provider !== "xopc-cloud" || hasCatalogModels) return;
|
|
95
|
+
console.log("\n→ Loading models from XOPC Model Service...");
|
|
96
|
+
const result = await (source ?? new XopcCloudModelSource()).refresh();
|
|
97
|
+
if (result.status === "skipped") throw new Error("XOPC Model Service credentials are unavailable after OAuth login. Please sign in again.");
|
|
98
|
+
console.log(colors.green(`✓ Loaded ${result.modelCount} models`));
|
|
99
|
+
}
|
|
92
100
|
function discoveredModelsToChoices(provider, models) {
|
|
93
101
|
return models.filter((model) => !model.id.includes("/")).map((model) => ({
|
|
94
102
|
value: `${provider}/${model.id}`,
|
|
@@ -445,8 +453,13 @@ async function setupModel(existingConfig, ctx) {
|
|
|
445
453
|
console.error(`\n❌ Could not configure credentials for ${providerName}.`);
|
|
446
454
|
return config;
|
|
447
455
|
}
|
|
448
|
-
|
|
449
|
-
|
|
456
|
+
let modelChoices = getModelsForProvider(provider);
|
|
457
|
+
await refreshOnboardModelCatalogIfNeeded(provider, modelChoices.length > 0);
|
|
458
|
+
modelChoices = getModelsForProvider(provider);
|
|
459
|
+
if (modelChoices.length === 0) {
|
|
460
|
+
if (provider === "xopc-cloud") throw new Error(`No models are currently available for ${providerName}.`);
|
|
461
|
+
throw new Error(`No catalog models found for ${providerName}. Add a Custom API provider instead.`);
|
|
462
|
+
}
|
|
450
463
|
console.log(`\n📋 Models for ${providerName}:`);
|
|
451
464
|
const model = await select({
|
|
452
465
|
message: "Model:",
|
|
@@ -459,4 +472,4 @@ async function setupModel(existingConfig, ctx) {
|
|
|
459
472
|
return setPrimaryModel(config, ctx.workspacePath, model);
|
|
460
473
|
}
|
|
461
474
|
//#endregion
|
|
462
|
-
export { setupModel };
|
|
475
|
+
export { refreshOnboardModelCatalogIfNeeded, setupModel };
|
|
@@ -460,7 +460,6 @@ export declare const SessionConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
460
460
|
}>>;
|
|
461
461
|
identityLinks: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
462
462
|
resetTriggers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
463
|
-
idleMinutes: z.ZodOptional<z.ZodNumber>;
|
|
464
463
|
reset: z.ZodOptional<z.ZodObject<{
|
|
465
464
|
mode: z.ZodOptional<z.ZodEnum<{
|
|
466
465
|
idle: "idle";
|
|
@@ -507,7 +506,7 @@ export declare const SessionConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
507
506
|
pruneAfterMs: z.ZodOptional<z.ZodNumber>;
|
|
508
507
|
maxEntries: z.ZodOptional<z.ZodNumber>;
|
|
509
508
|
}, z.core.$strip>>;
|
|
510
|
-
}, z.core.$
|
|
509
|
+
}, z.core.$strict>>;
|
|
511
510
|
/** Channel buckets — shapes validated post-parse by registered channel plugins. */
|
|
512
511
|
export declare const ChannelsConfigSchema: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
513
512
|
export declare const SearchProviderEntrySchema: z.ZodObject<{
|
|
@@ -1905,7 +1904,6 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1905
1904
|
}>>;
|
|
1906
1905
|
identityLinks: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
|
|
1907
1906
|
resetTriggers: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1908
|
-
idleMinutes: z.ZodOptional<z.ZodNumber>;
|
|
1909
1907
|
reset: z.ZodOptional<z.ZodObject<{
|
|
1910
1908
|
mode: z.ZodOptional<z.ZodEnum<{
|
|
1911
1909
|
idle: "idle";
|
|
@@ -1952,7 +1950,7 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
|
|
|
1952
1950
|
pruneAfterMs: z.ZodOptional<z.ZodNumber>;
|
|
1953
1951
|
maxEntries: z.ZodOptional<z.ZodNumber>;
|
|
1954
1952
|
}, z.core.$strip>>;
|
|
1955
|
-
}, z.core.$
|
|
1953
|
+
}, z.core.$strict>>;
|
|
1956
1954
|
channels: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
1957
1955
|
gateway: z.ZodDefault<z.ZodObject<{
|
|
1958
1956
|
bind: z.ZodOptional<z.ZodEnum<{
|
|
@@ -263,12 +263,11 @@ var init_schema = __esmMin((() => {
|
|
|
263
263
|
dmScope: SessionDmScopeSchema.default("main"),
|
|
264
264
|
identityLinks: z.record(z.string(), z.array(z.string())).optional(),
|
|
265
265
|
resetTriggers: z.array(z.string()).optional(),
|
|
266
|
-
idleMinutes: z.number().int().positive().optional(),
|
|
267
266
|
reset: SessionResetConfigSchema.optional(),
|
|
268
267
|
resetByType: SessionResetByTypeSchema.optional(),
|
|
269
268
|
resetByChannel: z.record(z.string(), SessionResetConfigSchema).optional(),
|
|
270
269
|
storage: SessionStorageConfigSchema.optional()
|
|
271
|
-
}).default({
|
|
270
|
+
}).strict().default({
|
|
272
271
|
scope: "per-sender",
|
|
273
272
|
mainKey: "main",
|
|
274
273
|
dmScope: "main"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
|
|
4
|
+
import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
|
|
4
5
|
import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
|
|
5
6
|
import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
|
|
6
|
-
import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
|
|
7
7
|
import { createHeartbeatWake } from "../../heartbeat/wake.js";
|
|
8
8
|
import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
|
|
9
9
|
import { readFile } from "fs/promises";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory } from "../../../storage/sqlite/composer-input-history-repository.js";
|
|
2
|
+
import "../../../storage/sqlite/index.js";
|
|
3
|
+
//#region src/gateway/hono/routes/composer-history.ts
|
|
4
|
+
const MAX_TEXT_LENGTH = 1e5;
|
|
5
|
+
function registerComposerHistoryRoutes(authenticated, deps) {
|
|
6
|
+
authenticated.get("/api/composer-history", (c) => {
|
|
7
|
+
return c.json({ items: listComposerInputHistory() });
|
|
8
|
+
});
|
|
9
|
+
authenticated.post("/api/composer-history", deps.strictRateLimitMiddleware, async (c) => {
|
|
10
|
+
const body = await c.req.json().catch(() => null);
|
|
11
|
+
const text = body && typeof body === "object" && typeof body.text === "string" ? body.text.trim() : "";
|
|
12
|
+
if (!text) return c.json({ error: "text is required" }, 400);
|
|
13
|
+
if (text.length > MAX_TEXT_LENGTH) return c.json({ error: "text is too long" }, 413);
|
|
14
|
+
const result = appendComposerInputHistory(text);
|
|
15
|
+
if (result.inserted) deps.service.emit("composer-history.appended", result.item);
|
|
16
|
+
return c.json(result);
|
|
17
|
+
});
|
|
18
|
+
authenticated.delete("/api/composer-history", deps.strictRateLimitMiddleware, (c) => {
|
|
19
|
+
const cleared = clearComposerInputHistory();
|
|
20
|
+
if (cleared > 0) deps.service.emit("composer-history.cleared", { cleared });
|
|
21
|
+
return c.json({
|
|
22
|
+
ok: true,
|
|
23
|
+
cleared
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { registerComposerHistoryRoutes };
|
|
@@ -8,6 +8,7 @@ import { registerSearchRoutes } from "./search.js";
|
|
|
8
8
|
import { registerMobileRoutes } from "./mobile.js";
|
|
9
9
|
import { registerTaskOutcomeRoutes } from "./task-outcomes.js";
|
|
10
10
|
import { registerInteractionStateRoutes } from "./interaction-state.js";
|
|
11
|
+
import { registerComposerHistoryRoutes } from "./composer-history.js";
|
|
11
12
|
import { registerLocalAppsRoutes } from "./local-apps.js";
|
|
12
13
|
import { registerWorkDiscoveryRoutes } from "./work-discovery.js";
|
|
13
14
|
import { mountAppLazyRoutePrefixes, registerAuthenticatedLazyRouteFallback } from "./lazy-fallback.js";
|
|
@@ -25,6 +26,7 @@ function registerCoreAuthenticatedRoutes(authenticated, deps) {
|
|
|
25
26
|
registerMobileRoutes(authenticated, deps);
|
|
26
27
|
registerTaskOutcomeRoutes(authenticated, deps);
|
|
27
28
|
registerInteractionStateRoutes(authenticated, deps);
|
|
29
|
+
registerComposerHistoryRoutes(authenticated, deps);
|
|
28
30
|
}
|
|
29
31
|
function registerAuthenticatedRoutes(app, authenticated, deps) {
|
|
30
32
|
registerCoreAuthenticatedRoutes(authenticated, deps);
|
|
@@ -35,6 +35,10 @@ function parseOffset(value) {
|
|
|
35
35
|
const parsed = value ? Number.parseInt(value, 10) : 0;
|
|
36
36
|
return Number.isFinite(parsed) ? Math.max(0, parsed) : 0;
|
|
37
37
|
}
|
|
38
|
+
function isHistoryCursor(value) {
|
|
39
|
+
if (!/^(0|[1-9]\d*)$/.test(value)) return false;
|
|
40
|
+
return Number.isSafeInteger(Number(value));
|
|
41
|
+
}
|
|
38
42
|
function buildDirectSessionMetadata(params) {
|
|
39
43
|
return {
|
|
40
44
|
sourceChannel: params.source,
|
|
@@ -268,7 +272,12 @@ function registerSessionsRoutes(authenticated, deps) {
|
|
|
268
272
|
const limitRaw = c.req.query("limit");
|
|
269
273
|
const parsedLimit = limitRaw ? Number.parseInt(limitRaw, 10) : void 0;
|
|
270
274
|
const limit = parsedLimit !== void 0 && Number.isFinite(parsedLimit) ? Math.min(500, Math.max(1, parsedLimit)) : void 0;
|
|
271
|
-
const
|
|
275
|
+
const beforeRaw = c.req.query("before");
|
|
276
|
+
const before = beforeRaw?.trim();
|
|
277
|
+
if (beforeRaw !== void 0 && (!before || !isHistoryCursor(before))) return c.json({
|
|
278
|
+
ok: false,
|
|
279
|
+
error: "Invalid session history cursor"
|
|
280
|
+
}, 400);
|
|
272
281
|
const offsetRaw = c.req.query("offset");
|
|
273
282
|
const parsedOffset = offsetRaw ? Number.parseInt(offsetRaw, 10) : 0;
|
|
274
283
|
const offset = Number.isFinite(parsedOffset) ? Math.max(0, parsedOffset) : 0;
|
|
@@ -294,7 +303,9 @@ function registerSessionsRoutes(authenticated, deps) {
|
|
|
294
303
|
const key = c.req.param("key");
|
|
295
304
|
const offsetRaw = c.req.query("offset");
|
|
296
305
|
const limitRaw = c.req.query("limit");
|
|
297
|
-
const
|
|
306
|
+
const beforeRaw = c.req.query("before");
|
|
307
|
+
const before = beforeRaw?.trim();
|
|
308
|
+
if (beforeRaw !== void 0 && (!before || !isHistoryCursor(before))) return c.json({ error: "Invalid session history cursor" }, 400);
|
|
298
309
|
const parsedOffset = offsetRaw ? Number.parseInt(offsetRaw, 10) : 0;
|
|
299
310
|
const parsedLimit = limitRaw ? Number.parseInt(limitRaw, 10) : 50;
|
|
300
311
|
const offset = Number.isFinite(parsedOffset) ? Math.max(0, parsedOffset) : 0;
|
|
@@ -53,11 +53,11 @@ var GatewaySessionsApi = class {
|
|
|
53
53
|
}
|
|
54
54
|
async getTimeline(key) {
|
|
55
55
|
if (!await this.opts.sessionIndex.getSessionMetadata(key)) return null;
|
|
56
|
-
return buildSessionTimeline(await this.opts.sessionIndex.getStore().
|
|
56
|
+
return buildSessionTimeline(await this.opts.sessionIndex.getStore().loadTranscriptHistoryRows(key));
|
|
57
57
|
}
|
|
58
58
|
async getTranscriptWindow(key, options) {
|
|
59
59
|
if (!await this.opts.sessionIndex.getSessionMetadata(key)) return null;
|
|
60
|
-
const rows = await this.opts.sessionIndex.getStore().
|
|
60
|
+
const rows = await this.opts.sessionIndex.getStore().loadTranscriptHistoryRows(key);
|
|
61
61
|
const totalRows = rows.length;
|
|
62
62
|
if (totalRows === 0) return {
|
|
63
63
|
messages: [],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
|
|
2
|
+
import { appendCronEventLines } from "./event-prompt.js";
|
|
2
3
|
import { isWithinActiveHours } from "./active-hours.js";
|
|
3
4
|
import { isHeartbeatContentEmpty } from "./content-check.js";
|
|
4
|
-
import { appendCronEventLines } from "./event-prompt.js";
|
|
5
5
|
import { createHeartbeatWake } from "./wake.js";
|
|
6
6
|
export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
|
|
@@ -7,6 +7,8 @@ export interface ClientHistoryMessage {
|
|
|
7
7
|
content: string;
|
|
8
8
|
displayIndex?: number;
|
|
9
9
|
rawContent?: string | unknown[];
|
|
10
|
+
/** Persisted inbound attachment metadata used by chat clients to reload media. */
|
|
11
|
+
media?: Message['media'];
|
|
10
12
|
timestamp?: number;
|
|
11
13
|
kind?: 'message' | 'compaction' | 'context' | 'bash' | 'custom' | 'branch';
|
|
12
14
|
tokensBefore?: number;
|
|
@@ -111,6 +111,7 @@ function messagesToClientHistory(messages, opts) {
|
|
|
111
111
|
out.push({
|
|
112
112
|
role: m.role,
|
|
113
113
|
content: text,
|
|
114
|
+
...m.media?.length ? { media: m.media } : {},
|
|
114
115
|
timestamp: parseTimestamp(m.timestamp)
|
|
115
116
|
});
|
|
116
117
|
continue;
|
|
@@ -410,6 +411,7 @@ function transcriptRowsToClientHistory(rows, opts) {
|
|
|
410
411
|
role: messageRow.role,
|
|
411
412
|
kind: "message",
|
|
412
413
|
content: flattenMessageContent(messageRow.content ?? ""),
|
|
414
|
+
...messageRow.media?.length ? { media: messageRow.media } : {},
|
|
413
415
|
...displayIndex !== void 0 ? { displayIndex } : {},
|
|
414
416
|
timestamp: parseTimestampValue(messageRow.timestamp)
|
|
415
417
|
});
|
|
@@ -14,12 +14,10 @@ function resolveSessionResetPolicy(params) {
|
|
|
14
14
|
const sessionCfg = params.sessionCfg;
|
|
15
15
|
const baseReset = params.resetOverride ?? sessionCfg?.reset;
|
|
16
16
|
const typeReset = params.resetOverride ? void 0 : sessionCfg?.resetByType?.[params.resetType];
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
const configured = Boolean(baseReset || typeReset || legacyIdleMinutes != null);
|
|
20
|
-
const mode = typeReset?.mode ?? baseReset?.mode ?? (!hasExplicitReset && legacyIdleMinutes != null ? "idle" : "daily");
|
|
17
|
+
const configured = Boolean(baseReset || typeReset);
|
|
18
|
+
const mode = typeReset?.mode ?? baseReset?.mode ?? "daily";
|
|
21
19
|
const atHour = normalizeResetAtHour(typeReset?.atHour ?? baseReset?.atHour ?? 4);
|
|
22
|
-
const idleMinutesRaw = typeReset?.idleMinutes ?? baseReset?.idleMinutes
|
|
20
|
+
const idleMinutesRaw = typeReset?.idleMinutes ?? baseReset?.idleMinutes;
|
|
23
21
|
let idleMinutes;
|
|
24
22
|
if (idleMinutesRaw != null) {
|
|
25
23
|
const normalized = Math.floor(idleMinutesRaw);
|
|
@@ -60,6 +60,7 @@ export declare class SessionStore {
|
|
|
60
60
|
} | null>;
|
|
61
61
|
private buildSessionDetail;
|
|
62
62
|
loadTranscriptRows(key: string): Promise<TranscriptStoredRow[]>;
|
|
63
|
+
loadTranscriptHistoryRows(key: string): Promise<TranscriptStoredRow[]>;
|
|
63
64
|
getMetadata(key: string): Promise<SessionMetadata | null>;
|
|
64
65
|
resolveKeyBySessionId(sessionId: string): Promise<string | null>;
|
|
65
66
|
updateMetadata(key: string, updates: Partial<SessionMetadata>): Promise<void>;
|
|
@@ -6,7 +6,7 @@ import "./types.js";
|
|
|
6
6
|
import { buildSessionContextForLlm, buildSessionDisplayMessages, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
|
|
7
7
|
import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
|
|
8
8
|
import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
|
|
9
|
-
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "../storage/sqlite/transcript-repository.js";
|
|
9
|
+
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "../storage/sqlite/transcript-repository.js";
|
|
10
10
|
import "../storage/sqlite/index.js";
|
|
11
11
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
12
12
|
import { readPostCompactionContext } from "../agent/reply/post-compaction-context.js";
|
|
@@ -87,14 +87,15 @@ var SessionStore = class {
|
|
|
87
87
|
if (!metadata) return null;
|
|
88
88
|
const limit = Math.min(200, Math.max(1, Math.trunc(options.limit ?? 50)));
|
|
89
89
|
const offset = Math.max(0, Math.trunc(options.offset ?? 0));
|
|
90
|
-
const parsedBefore = options.before ?
|
|
91
|
-
const hasBeforeCursor = parsedBefore !== void 0
|
|
90
|
+
const parsedBefore = options.before === void 0 ? void 0 : parseHistoryBeforeIndex(options.before);
|
|
91
|
+
const hasBeforeCursor = parsedBefore !== void 0;
|
|
92
92
|
if (options.includeContextRows) {
|
|
93
93
|
const page = paginateTranscriptMessages(key, {
|
|
94
94
|
limit,
|
|
95
95
|
offset: hasBeforeCursor ? void 0 : offset,
|
|
96
|
-
|
|
97
|
-
includeContext: true
|
|
96
|
+
beforeIndex: hasBeforeCursor ? parsedBefore : void 0,
|
|
97
|
+
includeContext: true,
|
|
98
|
+
includeArchived: true
|
|
98
99
|
});
|
|
99
100
|
const messages = transcriptRowsToClientHistory(page.rows);
|
|
100
101
|
const endIndex = hasBeforeCursor ? Math.min(page.total, Math.max(0, parsedBefore)) : Math.max(0, page.total - offset);
|
|
@@ -121,7 +122,7 @@ var SessionStore = class {
|
|
|
121
122
|
const page = this.paginateDisplayMessages(displayMessages, {
|
|
122
123
|
limit,
|
|
123
124
|
offset: hasBeforeCursor ? void 0 : offset,
|
|
124
|
-
|
|
125
|
+
beforeIndex: hasBeforeCursor ? parsedBefore : void 0
|
|
125
126
|
});
|
|
126
127
|
const session = await this.buildSessionDetail(key, metadata, page.messages, options);
|
|
127
128
|
const nextBeforeCursor = page.startIndex > 0 ? String(page.startIndex) : void 0;
|
|
@@ -162,6 +163,10 @@ var SessionStore = class {
|
|
|
162
163
|
requireXopcDatabase();
|
|
163
164
|
return loadTranscriptRowsForSession(key);
|
|
164
165
|
}
|
|
166
|
+
async loadTranscriptHistoryRows(key) {
|
|
167
|
+
requireXopcDatabase();
|
|
168
|
+
return loadTranscriptHistoryRowsForSession(key);
|
|
169
|
+
}
|
|
165
170
|
async getMetadata(key) {
|
|
166
171
|
requireXopcDatabase();
|
|
167
172
|
return getSessionMetadata(key);
|
|
@@ -569,8 +574,8 @@ var SessionStore = class {
|
|
|
569
574
|
const offset = Math.max(0, Math.trunc(options.offset ?? 0));
|
|
570
575
|
let startIndex;
|
|
571
576
|
let endIndex;
|
|
572
|
-
if (options.
|
|
573
|
-
endIndex = Math.min(total, Math.max(0, Math.trunc(options.
|
|
577
|
+
if (options.beforeIndex !== void 0 && Number.isFinite(options.beforeIndex)) {
|
|
578
|
+
endIndex = Math.min(total, Math.max(0, Math.trunc(options.beforeIndex)));
|
|
574
579
|
startIndex = Math.max(0, endIndex - limit);
|
|
575
580
|
} else {
|
|
576
581
|
endIndex = Math.max(0, total - offset);
|
|
@@ -666,5 +671,11 @@ var SessionStore = class {
|
|
|
666
671
|
});
|
|
667
672
|
}
|
|
668
673
|
};
|
|
674
|
+
function parseHistoryBeforeIndex(value) {
|
|
675
|
+
if (!/^(0|[1-9]\d*)$/.test(value)) throw new Error("Invalid session history cursor");
|
|
676
|
+
const parsed = Number(value);
|
|
677
|
+
if (!Number.isSafeInteger(parsed)) throw new Error("Invalid session history cursor");
|
|
678
|
+
return parsed;
|
|
679
|
+
}
|
|
669
680
|
//#endregion
|
|
670
681
|
export { SessionStore };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const COMPOSER_INPUT_HISTORY_LIMIT = 100;
|
|
2
|
+
export interface ComposerInputHistoryItem {
|
|
3
|
+
id: number;
|
|
4
|
+
text: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function listComposerInputHistory(limit?: number): ComposerInputHistoryItem[];
|
|
8
|
+
export declare function appendComposerInputHistory(text: string, now?: number): {
|
|
9
|
+
item: ComposerInputHistoryItem;
|
|
10
|
+
inserted: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function clearComposerInputHistory(): number;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
|
+
//#region src/storage/sqlite/composer-input-history-repository.ts
|
|
3
|
+
const COMPOSER_INPUT_HISTORY_LIMIT = 100;
|
|
4
|
+
function fromRow(row) {
|
|
5
|
+
return {
|
|
6
|
+
id: row.id,
|
|
7
|
+
text: row.text,
|
|
8
|
+
createdAt: row.created_at
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function listComposerInputHistory(limit = 100) {
|
|
12
|
+
const boundedLimit = Number.isFinite(limit) ? Math.min(100, Math.max(1, Math.trunc(limit))) : 100;
|
|
13
|
+
return getSqliteDatabase().prepare("SELECT id, text, created_at FROM composer_input_history ORDER BY id DESC LIMIT ?").all(boundedLimit).map(fromRow);
|
|
14
|
+
}
|
|
15
|
+
function appendComposerInputHistory(text, now = Date.now()) {
|
|
16
|
+
const normalized = text.trim();
|
|
17
|
+
if (!normalized) throw new Error("Composer history text is required");
|
|
18
|
+
return runSqliteWriteTransaction((db) => {
|
|
19
|
+
const latest = db.prepare("SELECT id, text, created_at FROM composer_input_history ORDER BY id DESC LIMIT 1").get();
|
|
20
|
+
if (latest?.text === normalized) return {
|
|
21
|
+
item: fromRow(latest),
|
|
22
|
+
inserted: false
|
|
23
|
+
};
|
|
24
|
+
const result = db.prepare("INSERT INTO composer_input_history (text, created_at) VALUES (?, ?)").run(normalized, now);
|
|
25
|
+
const id = Number(result.lastInsertRowid);
|
|
26
|
+
db.prepare(`DELETE FROM composer_input_history
|
|
27
|
+
WHERE id NOT IN (SELECT id FROM composer_input_history ORDER BY id DESC LIMIT ?)`).run(100);
|
|
28
|
+
return {
|
|
29
|
+
item: {
|
|
30
|
+
id,
|
|
31
|
+
text: normalized,
|
|
32
|
+
createdAt: now
|
|
33
|
+
},
|
|
34
|
+
inserted: true
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function clearComposerInputHistory() {
|
|
39
|
+
return Number(runSqliteWriteTransaction((db) => db.prepare("DELETE FROM composer_input_history").run().changes));
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory };
|
|
@@ -5,13 +5,14 @@ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, } from './m
|
|
|
5
5
|
export { discoverSqlMigrations, listRegisteredMigrationTargets } from './migrations/discover.js';
|
|
6
6
|
export { closeXopcDatabase, getXopcDatabase, isXopcDatabaseOpen, openXopcDatabase, requireXopcDatabase, resetXopcDatabaseSingletonForTest, type OpenXopcDatabaseOptions, type XopcDatabase, } from './connection.js';
|
|
7
7
|
export { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';
|
|
8
|
+
export { appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory, COMPOSER_INPUT_HISTORY_LIMIT, type ComposerInputHistoryItem, } from './composer-input-history-repository.js';
|
|
8
9
|
export { getInteractionState, setInteractionState, updateInteractionStateFromMessage, type InteractionState, } from './interaction-state-repository.js';
|
|
9
10
|
export { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings, type RelationshipSettings, type SupportMode, } from './relationship-settings-repository.js';
|
|
10
11
|
export { completeTaskOutcome, findTaskOutcomeForAssistant, getTaskOutcome, listTaskOutcomes, setTaskOutcomeFeedback, startTaskOutcome, summarizeTaskOutcomes, updateTaskOutcome, type TaskContract, type TaskEvidence, type TaskFeedbackOutcome, type TaskOutcome, type TaskOutcomeMetrics, type TaskOutcomeStatus, } from './task-outcome-repository.js';
|
|
11
12
|
export { buildDefaultSessionMetadata, type SessionMetadataSeed, } from './session-metadata.js';
|
|
12
13
|
export { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow, type SessionConfigRow, type SessionRow, type TranscriptEntryRow, } from './row-mappers.js';
|
|
13
14
|
export { deleteSessionRecord, ensureSessionRecord, getCurrentSessionId, getGlobalSessionStats, findSessionKeyBySessionId, getSessionPersistedLevels, getSessionMetadata, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats, } from './session-repository.js';
|
|
14
|
-
export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint, } from './transcript-repository.js';
|
|
15
|
+
export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint, } from './transcript-repository.js';
|
|
15
16
|
export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } from './notes-repository.js';
|
|
16
17
|
export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
|
|
17
18
|
export { searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
|
|
@@ -6,13 +6,14 @@ import { XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, applyPendingMi
|
|
|
6
6
|
import { ensureXopcDatabaseSchema } from "./schema.js";
|
|
7
7
|
import { closeXopcDatabase, getXopcDatabase, isXopcDatabaseOpen, openXopcDatabase, requireXopcDatabase, resetXopcDatabaseSingletonForTest } from "./connection.js";
|
|
8
8
|
import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
|
|
9
|
+
import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory } from "./composer-input-history-repository.js";
|
|
9
10
|
import { getInteractionState, setInteractionState, updateInteractionStateFromMessage } from "./interaction-state-repository.js";
|
|
10
11
|
import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings } from "./relationship-settings-repository.js";
|
|
11
12
|
import { completeTaskOutcome, findTaskOutcomeForAssistant, getTaskOutcome, listTaskOutcomes, setTaskOutcomeFeedback, startTaskOutcome, summarizeTaskOutcomes, updateTaskOutcome } from "./task-outcome-repository.js";
|
|
12
13
|
import { buildDefaultSessionMetadata } from "./session-metadata.js";
|
|
13
14
|
import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow } from "./row-mappers.js";
|
|
14
15
|
import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getCurrentSessionId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
|
|
15
|
-
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "./transcript-repository.js";
|
|
16
|
+
import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "./transcript-repository.js";
|
|
16
17
|
import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
|
|
17
18
|
import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
|
|
18
19
|
import { searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
|
|
@@ -24,4 +25,4 @@ import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeC
|
|
|
24
25
|
import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
|
|
25
26
|
import { consumeMemoryReferenceConsent, decideMemoryReferenceConsent, ensureMemoryReferenceConsentRequest, hasMemoryReferenceConsent, listMemoryReferenceConsents, revokeMemoryReferenceConsent } from "./memory-reference-consent-repository.js";
|
|
26
27
|
import { getUserProfilePromptState, setUserProfilePromptState } from "./user-profile-setup-repository.js";
|
|
27
|
-
export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, captureCompactionCheckpoint, claimConnectorWebhookDelivery, claimKnowledgeSourceItems, classifyStoredRow, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, completeTaskOutcome, consumeConnectorApproval, consumeMemoryReferenceConsent, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, decideMemoryReferenceConsent, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureMemoryReferenceConsentRequest, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, findTaskOutcomeForAssistant, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getCompactionCheckpointDetail, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getTaskOutcome, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasMemoryReferenceConsent, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isProactiveSupportAllowed, isXopcDatabaseOpen, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionCheckpoints, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, revokeMemoryReferenceConsent, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setTaskOutcomeFeedback, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, startTaskOutcome, summarizeMemoryRecallFeedback, summarizeTaskOutcomes, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateTaskOutcome, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
|
|
28
|
+
export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, USER_UNDERSTANDING_REMEDIATION_POLICY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, captureCompactionCheckpoint, claimConnectorWebhookDelivery, claimKnowledgeSourceItems, classifyStoredRow, clearComposerInputHistory, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, completeTaskOutcome, consumeConnectorApproval, consumeMemoryReferenceConsent, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, decideMemoryReferenceConsent, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureMemoryReferenceConsentRequest, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, findTaskOutcomeForAssistant, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getCompactionCheckpointDetail, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getTaskOutcome, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasMemoryReferenceConsent, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isProactiveSupportAllowed, isXopcDatabaseOpen, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionCheckpoints, listComposerInputHistory, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, revokeMemoryReferenceConsent, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setTaskOutcomeFeedback, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, startTaskOutcome, summarizeMemoryRecallFeedback, summarizeTaskOutcomes, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateTaskOutcome, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
|
|
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
|
|
|
3
3
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
4
4
|
export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
|
|
5
5
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
6
|
-
export declare const XOPC_DB_SCHEMA_VERSION =
|
|
6
|
+
export declare const XOPC_DB_SCHEMA_VERSION = 59;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
|
|
|
12
12
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
13
13
|
const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
|
|
14
14
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
15
|
-
const XOPC_DB_SCHEMA_VERSION =
|
|
15
|
+
const XOPC_DB_SCHEMA_VERSION = 59;
|
|
16
16
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
17
17
|
function resolveMigrationsDir(override) {
|
|
18
18
|
if (override) return override;
|
|
@@ -46,7 +46,7 @@ function applySingleMigration(db, migration) {
|
|
|
46
46
|
* Each step runs in its own transaction and updates schema_meta on success.
|
|
47
47
|
*/
|
|
48
48
|
function applyPendingMigrations(db, options = {}) {
|
|
49
|
-
const targetVersion = options.targetVersion ??
|
|
49
|
+
const targetVersion = options.targetVersion ?? 59;
|
|
50
50
|
let currentVersion = readSchemaVersion(db);
|
|
51
51
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
52
52
|
if (currentVersion >= targetVersion) return currentVersion;
|
|
@@ -62,7 +62,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
62
62
|
}
|
|
63
63
|
/** Inspect schema version without mutating the database. */
|
|
64
64
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
65
|
-
const appVersion = options.targetVersion ??
|
|
65
|
+
const appVersion = options.targetVersion ?? 59;
|
|
66
66
|
const dbVersion = readSchemaVersion(db);
|
|
67
67
|
if (dbVersion > appVersion) return {
|
|
68
68
|
dbVersion,
|
|
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
|
|
|
19
19
|
export const XOPC_DB_BASELINE_SCHEMA_VERSION = 11;
|
|
20
20
|
|
|
21
21
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
22
|
-
export const XOPC_DB_SCHEMA_VERSION =
|
|
22
|
+
export const XOPC_DB_SCHEMA_VERSION = 59;
|
|
23
23
|
|
|
24
24
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
25
25
|
|