@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.
Files changed (148) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-DjEDu38T.js → activity-store-CkUp1qvf.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVuLzaJi.js → agent-avatar-dicebear-DDuem4HM.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agents-tF_QTWxn.js → agents-BiaQhiQp.js} +2 -2
  6. package/dist/gateway/static/root/assets/{api-DwVCuPOb.js → api-BnuPQhJW.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-spzVBvAu.js → app-management-settings-panel-DdZw8Hi1.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-CetimI47.js → appearance-settings-BN8Vk2bX.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-HDyN6Fjx.js → apps-page-CuL8Q4yF.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-TOmQ2XKc.js → archive-plugin-C82MaDQj.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-NFNEWVLJ.js → attachment-load-uilrwSdW.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automation-suggestion-card-B0FnLpSl.js → automation-suggestion-card-CkDZjAmy.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-DVevVD6A.js → automations-page-TZOluRNp.js} +1 -1
  14. package/dist/gateway/static/root/assets/{binary-plugins-Csc4xkR9.js → binary-plugins-B7NTL0_T.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-C6Xgrbse.js → block-editor-D_LDNlB-.js} +1 -1
  16. package/dist/gateway/static/root/assets/{browser-settings-page-CyDDEKxB.js → browser-settings-page-C-l6O68Z.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-DaxyAai1.js → browser-workflow-inputs-UFVUzn4v.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-CaX6iIJA.js → browser-workflows-page-CGgC0N92.js} +1 -1
  19. package/dist/gateway/static/root/assets/{capabilities-settings-panel-EXZv96j1.js → capabilities-settings-panel-BW8c0xPp.js} +6 -6
  20. package/dist/gateway/static/root/assets/{capability-presets-api-DdCHSzcA.js → capability-presets-api-DUIorGUd.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-PTz00nR4.js +1 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-BOkLI89e.js → channel-recipient-api-BYwSB8c6.js} +1 -1
  23. package/dist/gateway/static/root/assets/{channels-settings-aCN05KdJ.js → channels-settings-h9CsE0GT.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-status-swr-C058Mcfr.js +1 -0
  25. package/dist/gateway/static/root/assets/{chunk-KS7C4IRE-uQ0fehio.js → chunk-KS7C4IRE-BMhrPKJC.js} +2 -2
  26. package/dist/gateway/static/root/assets/{connector-logo-Mp40HWsb.js → connector-logo-CsbegNqi.js} +1 -1
  27. package/dist/gateway/static/root/assets/{connectors-page-i0cu5rg5.js → connectors-page-BWALafGW.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-BtzUJ0d7.js → desktop-pet-CkT98fPT.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-Dg0Duj8B.js → desktop-pet-settings-DkbIzdA3.js} +1 -1
  30. package/dist/gateway/static/root/assets/{directory-picker-path-field-9f0k1wZq.js → directory-picker-path-field-dBQvj1sG.js} +1 -1
  31. package/dist/gateway/static/root/assets/{dreaming-settings-rdW7dsGP.js → dreaming-settings-DkdnKMZx.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-C9zUnn-z.js → extension-debug-page-BfxoIiNo.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-Cy5rfU0h.js → extension-page-EIJ3wIb7.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-settings-page-BjIquAw6.js → extension-settings-page-DBBec51N.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-config-api-AQQmI6SW.js → gateway-config-api-4_u53Ufq.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-CYNmbqHj.js → gateway-settings-v9kJM59H.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-qnEmj-vL.js → gateway-startup-retry-CXITih5d.js} +1 -1
  38. package/dist/gateway/static/root/assets/{goal-create-dialog-CkXaDfN3.js → goal-create-dialog-y2Y3p7_k.js} +1 -1
  39. package/dist/gateway/static/root/assets/{goal-detail-page-FqDa5bfO.js → goal-detail-page-DuzL-alv.js} +3 -3
  40. package/dist/gateway/static/root/assets/{goals-config-api-CaVGtM6n.js → goals-config-api-D54YQPon.js} +1 -1
  41. package/dist/gateway/static/root/assets/{goals-page-B-uBRGN6.js → goals-page-OeLtfKI2.js} +1 -1
  42. package/dist/gateway/static/root/assets/{goals-settings-C9J3MX0F.js → goals-settings-DDezXaVi.js} +1 -1
  43. package/dist/gateway/static/root/assets/{heartbeat-settings-C0qFLyew.js → heartbeat-settings-CRsIUeZN.js} +1 -1
  44. package/dist/gateway/static/root/assets/image-generation-api-CY6cQUHL.js +1 -0
  45. package/dist/gateway/static/root/assets/index-Dfq2laZe.js +212 -0
  46. package/dist/gateway/static/root/assets/index-o4uaOGKT.css +1 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BAZlRZMd.js → keyboard-shortcuts-settings-D9k7EDdY.js} +1 -1
  48. package/dist/gateway/static/root/assets/{local-app-workbench-page-DkJUQRyC.js → local-app-workbench-page-3ssYIEK6.js} +1 -1
  49. package/dist/gateway/static/root/assets/{local-apps-page-PcQABi7F.js → local-apps-page-DbaiBolh.js} +1 -1
  50. package/dist/gateway/static/root/assets/{locale-store-tnRLWdx2.js → locale-store-Dqp9H2Uf.js} +1 -1
  51. package/dist/gateway/static/root/assets/{logs-page-B-nXM29t.js → logs-page-DoCY0Mm9.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-split-B6W1H0Fj.js → markdown-split-BGlQR-Be.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-B-r9Tj74.js → media-plugins-BpaeV6f_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{messages-B1EG4gdu.js → messages-KEk-hTFt.js} +2 -2
  55. package/dist/gateway/static/root/assets/notes-page-Cd2HpciM.js +1 -0
  56. package/dist/gateway/static/root/assets/{notes-workbench-Be97S0Im.js → notes-workbench-CatZNAPc.js} +2 -2
  57. package/dist/gateway/static/root/assets/{page-tabs-BmUWVWO9.js → page-tabs-DyimBUp_.js} +1 -1
  58. package/dist/gateway/static/root/assets/{preview-open-alternatives-a76A8p5R.js → preview-open-alternatives-BKZulEYr.js} +1 -1
  59. package/dist/gateway/static/root/assets/{product-open-page-BWhYrt-U.js → product-open-page-Bjz9BxBY.js} +1 -1
  60. package/dist/gateway/static/root/assets/project-detail-page-DJUOgqm4.js +1 -0
  61. package/dist/gateway/static/root/assets/{projects-page-D1MNrLcy.js → projects-page-BQQAD_nu.js} +1 -1
  62. package/dist/gateway/static/root/assets/{remote-access-hub-GTuiqlJO.js → remote-access-hub-fIGXTTnA.js} +1 -1
  63. package/dist/gateway/static/root/assets/{save-bar-controls-_ZMLDSUw.js → save-bar-controls-BPTqb2_r.js} +1 -1
  64. package/dist/gateway/static/root/assets/{schedule-field-D4ErObRc.js → schedule-field-YN0D81Dk.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-PqNSGlcH.js → schema-form-BmY5PSS2.js} +1 -1
  66. package/dist/gateway/static/root/assets/{sessions-page-Ct0MVjNv.js → sessions-page-BuU-8FCe.js} +1 -1
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-DlKoeZm3.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-BCKaoLhJ.js → settings-form-section-B-RhgD_p.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-Dn95fked.js → settings-loading-skeleton-DkPupX2B.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-C8MPUl2Q.js → settings-page-2QBMvaxj.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-page-layout-Bigc8-GR.js → settings-page-layout-CtrW-LD6.js} +1 -1
  72. package/dist/gateway/static/root/assets/{setup-status-panel-DFTcAHsd.js → setup-status-panel-BSUcDFnb.js} +1 -1
  73. package/dist/gateway/static/root/assets/{share-preview-page-xAjqaV4y.js → share-preview-page-BezIW1n9.js} +1 -1
  74. package/dist/gateway/static/root/assets/{shares-settings-D2uvC_aM.js → shares-settings-Bk2-SwGJ.js} +1 -1
  75. package/dist/gateway/static/root/assets/skill-reload-api-e_Fx1kVC.js +1 -0
  76. package/dist/gateway/static/root/assets/{skills-page-6dr3RRVW.js → skills-page-D_cCADfj.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-BJJQulg9.js → system-settings-panel-WAFhKyAu.js} +1 -1
  78. package/dist/gateway/static/root/assets/{theme-store-H9T49Iar.js → theme-store-BiC0gIBa.js} +1 -1
  79. package/dist/gateway/static/root/assets/{time-picker-DsuPUbRE.js → time-picker-fqRXpNJV.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-Djk3F3EL.js → typed-models-lib-WAQO3F_8.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-UACJTyH0.js → use-channel-catalog-CKlfsSeU.js} +1 -1
  82. package/dist/gateway/static/root/assets/{user-context-page-BC585kHK.js → user-context-page-9Ov4htPW.js} +1 -1
  83. package/dist/gateway/static/root/assets/{voice-api-key-field-CvocOFat.js → voice-api-key-field-BAFHF0_v.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-discovery-page-DiMn6nrT.js → work-discovery-page-DGN2FxWv.js} +1 -1
  85. package/dist/gateway/static/root/assets/{work-item-detail-page-CFBlQbPy.js → work-item-detail-page-HmyWSgUo.js} +1 -1
  86. package/dist/gateway/static/root/assets/work-page-D3iKVjFq.js +1 -0
  87. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DbQwWPjv.js → workflow-run-setup-panel-1OP4HyvS.js} +1 -1
  88. package/dist/gateway/static/root/assets/workflows-page-B5L4SFw4.js +11 -0
  89. package/dist/gateway/static/root/index.html +8 -8
  90. package/dist/package.js +1 -1
  91. package/dist/src/agent/service/process-direct-one-shot.js +2 -1
  92. package/dist/src/agent/service/process-direct-streaming.js +2 -1
  93. package/dist/src/agent/workflow/builtins/index.js +2 -2
  94. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  95. package/dist/src/cli/commands/onboard/model.d.ts +2 -0
  96. package/dist/src/cli/commands/onboard/model.js +16 -3
  97. package/dist/src/config/schema.d.ts +2 -4
  98. package/dist/src/config/schema.js +1 -2
  99. package/dist/src/gateway/heartbeat/service.js +1 -1
  100. package/dist/src/gateway/hono/routes/composer-history.d.ts +3 -0
  101. package/dist/src/gateway/hono/routes/composer-history.js +28 -0
  102. package/dist/src/gateway/hono/routes/index.js +2 -0
  103. package/dist/src/gateway/hono/routes/sessions.js +13 -2
  104. package/dist/src/gateway/service/sessions-api.js +2 -2
  105. package/dist/src/heartbeat/index.js +1 -1
  106. package/dist/src/session/client-history.d.ts +2 -0
  107. package/dist/src/session/client-history.js +2 -0
  108. package/dist/src/session/reset-policy.js +3 -5
  109. package/dist/src/session/store.d.ts +1 -0
  110. package/dist/src/session/store.js +19 -8
  111. package/dist/src/storage/sqlite/composer-input-history-repository.d.ts +12 -0
  112. package/dist/src/storage/sqlite/composer-input-history-repository.js +42 -0
  113. package/dist/src/storage/sqlite/index.d.ts +2 -1
  114. package/dist/src/storage/sqlite/index.js +3 -2
  115. package/dist/src/storage/sqlite/migrations/059_composer_input_history.sql +8 -0
  116. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  117. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  118. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  119. package/dist/src/storage/sqlite/schema.js +1 -1
  120. package/dist/src/storage/sqlite/transcript-repository.d.ts +4 -3
  121. package/dist/src/storage/sqlite/transcript-repository.js +31 -22
  122. package/dist/src/tui/backends/embedded-backend.d.ts +3 -1
  123. package/dist/src/tui/backends/embedded-backend.js +7 -0
  124. package/dist/src/tui/backends/gateway-sse-backend.d.ts +3 -1
  125. package/dist/src/tui/backends/gateway-sse-backend.js +13 -0
  126. package/dist/src/tui/components/custom-editor.d.ts +1 -0
  127. package/dist/src/tui/components/custom-editor.js +6 -0
  128. package/dist/src/tui/tui-backend.d.ts +9 -0
  129. package/dist/src/tui/tui-submit.d.ts +1 -0
  130. package/dist/src/tui/tui-submit.js +1 -1
  131. package/dist/src/tui/tui.js +58 -1
  132. package/dist/src/workflows/domain/result.d.ts +4 -15
  133. package/dist/src/workflows/engine/workflow-engine.js +5 -14
  134. package/dist/src/workflows/runtime/graph-workflow-runtime.js +7 -11
  135. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  136. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  137. package/dist/src/workflows/store/run-index-store.js +1 -6
  138. package/package.json +1 -1
  139. package/dist/gateway/static/root/assets/capability-presets-settings-panel-o08SXqM4.js +0 -2
  140. package/dist/gateway/static/root/assets/channels-status-swr-ZrqadU60.js +0 -1
  141. package/dist/gateway/static/root/assets/index-DchbD-qM.js +0 -199
  142. package/dist/gateway/static/root/assets/index-DfE2j0g8.css +0 -1
  143. package/dist/gateway/static/root/assets/notes-page-BNECY6Oy.js +0 -1
  144. package/dist/gateway/static/root/assets/project-detail-page-md0ANZ-f.js +0 -1
  145. package/dist/gateway/static/root/assets/settings-advanced-gate-QOUph2Oq.js +0 -1
  146. package/dist/gateway/static/root/assets/skill-reload-api-DYtfQXB-.js +0 -1
  147. package/dist/gateway/static/root/assets/work-page-CLJLKqsf.js +0 -1
  148. 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-DchbD-qM.js"></script>
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-uQ0fehio.js">
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-B1EG4gdu.js">
28
- <link rel="modulepreload" crossorigin href="/assets/locale-store-tnRLWdx2.js">
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-qnEmj-vL.js">
35
- <link rel="modulepreload" crossorigin href="/assets/activity-store-DjEDu38T.js">
36
- <link rel="modulepreload" crossorigin href="/assets/theme-store-H9T49Iar.js">
37
- <link rel="stylesheet" crossorigin href="/assets/index-DfE2j0g8.css">
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
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.168";
2
+ var version = "0.0.170";
3
3
  //#endregion
4
4
  export { version };
@@ -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: "Result",
233
+ title: "Deliverable",
234
234
  position: {
235
235
  x: 1280,
236
236
  y: 260
237
237
  },
238
- config: { title: "Final result" }
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 v58).`,
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
- const modelChoices = getModelsForProvider(provider);
449
- if (modelChoices.length === 0) throw new Error(`No catalog models found for ${providerName}. Add a Custom API provider instead.`);
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.$strip>>;
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.$strip>>;
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,3 @@
1
+ import type { Hono } from 'hono';
2
+ import type { AuthenticatedRouteDeps } from './deps.js';
3
+ export declare function registerComposerHistoryRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void;
@@ -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 before = c.req.query("before")?.trim();
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 before = c.req.query("before")?.trim();
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().loadTranscriptRows(key));
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().loadTranscriptRows(key);
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 hasExplicitReset = Boolean(baseReset || sessionCfg?.resetByType);
18
- const legacyIdleMinutes = params.resetOverride ? void 0 : sessionCfg?.idleMinutes;
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 ?? legacyIdleMinutes;
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 ? Number.parseInt(options.before, 10) : void 0;
91
- const hasBeforeCursor = parsedBefore !== void 0 && Number.isFinite(parsedBefore);
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
- beforeEndIndex: hasBeforeCursor ? parsedBefore : void 0,
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
- beforeEndIndex: hasBeforeCursor ? parsedBefore : void 0
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.beforeEndIndex !== void 0 && Number.isFinite(options.beforeEndIndex)) {
573
- endIndex = Math.min(total, Math.max(0, Math.trunc(options.beforeEndIndex)));
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 };
@@ -0,0 +1,8 @@
1
+ CREATE TABLE composer_input_history (
2
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
3
+ text TEXT NOT NULL,
4
+ created_at INTEGER NOT NULL
5
+ );
6
+
7
+ CREATE INDEX idx_composer_input_history_recent
8
+ ON composer_input_history(id DESC);
@@ -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 = 58;
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 = 58;
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 ?? 58;
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 ?? 58;
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 = 58;
22
+ export const XOPC_DB_SCHEMA_VERSION = 59;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25