@xopcai/xopc 0.0.171 → 0.0.173
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-BLz30jWq.js → activity-store-ByVA0N5n.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKZO0EFn.js → agent-avatar-dicebear-CJ5HvqE7.js} +1 -1
- package/dist/gateway/static/root/assets/agents--TQ9jM_1.js +2 -0
- package/dist/gateway/static/root/assets/{api-N2qKY-WI.js → api-BZtCKzg4.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CNZkpXCD.js → app-management-settings-panel-B0oNNcFn.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Drf5a563.js → appearance-settings-DbIj4NQ1.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BDsoZDEn.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-ChVwOXE5.js → archive-plugin-BICLQFWJ.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BVK3Y2d9.js → attachment-load-DV3PteSU.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-DH4N0SYR.js → automation-suggestion-card-CZUImis0.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-CHrNcppN.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CeHY6VVP.js → binary-plugins-D6zkab6N.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-zCzoQI-g.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-BQoRuQzH.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-femCtfpo.js → browser-workflow-inputs-CY3X83xQ.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-o0GVE_aF.js → browser-workflows-page-DDRtZLuM.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BOcU0qeM.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-Bx-JJC0R.js → capability-presets-api-pYLW6P7g.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CJ1F_hlX.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-CTw3ibx4.js → channel-recipient-api-DxyOH3BO.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-C4vDwRil.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B0Pgq5x2.js +1 -0
- package/dist/gateway/static/root/assets/connector-logo-BgANwjt-.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-D6JEqDEj.js +2 -0
- package/dist/gateway/static/root/assets/desktop-pet-BPjQbPeA.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeH4VyP.js → desktop-pet-settings-8CaU1Mhm.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Ddgt6c3K.js → directory-picker-path-field-BtNRUvzM.js} +1 -1
- package/dist/gateway/static/root/assets/dreaming-settings-Byv-h8XZ.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-CJGwUaQX.js → extension-debug-page-DFjTfx6f.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B3zHKJAB.js → extension-page-NyEYtWWg.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Cj9rrSr1.js → extension-settings-page-BynTCfgf.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-BdmtlJRP.js → gateway-config-api-BzOWImvU.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-C2RwKIsl.js → gateway-settings-DXepE_Jw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-mcMq_uu_.js → gateway-startup-retry-C2JXXtwg.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-5Ryd_rx4.js → goal-create-dialog-ClOZyG52.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-UbZB77De.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CAO1J4jn.js → goals-config-api-CU3JR9MI.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-GMqV8Fwv.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-Boj2izKZ.js → goals-settings-DSZguLEx.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DbPC9a_y.js → heartbeat-settings-KRkYziEF.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-DrLCLTXn.js → image-generation-api-Y-n6TaZ_.js} +1 -1
- package/dist/gateway/static/root/assets/index-BCkNJ5cR.css +1 -0
- package/dist/gateway/static/root/assets/{index-vHb2z7VS.js → index-CAZ9343h.js} +67 -67
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BrxfptgY.js → keyboard-shortcuts-settings-CwrQv952.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BP0_Ih0e.js → local-app-workbench-page-m5HEyrHT.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-DNCRlfFs.js → local-apps-page-DtITcS4K.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CzIfXqm8.js → locale-store-Ccv7tH8B.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Bf_nk75f.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-CIUH9Lor.js → markdown-split-D1oZlq1m.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-DX4AgkCs.js → media-plugins-BKz5V32t.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-CKZuaOeG.js → messages-DWrg3c4K.js} +2 -2
- package/dist/gateway/static/root/assets/{notes-page-D1KprtxL.js → notes-page-DLekBQPa.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-BTDmprHM.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-DjZPJGf6.js → page-tabs-pT4nLfqS.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DNiJTpwZ.js → preview-open-alternatives-OtAiaJm2.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CNfR17-g.js → product-open-page-CfryBKD9.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-C7kntu4H.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-3ubcbqHr.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DoUkN3ik.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BGZFVO9S.js → save-bar-controls-nP1SB3Lf.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-BAZiHtds.js → schedule-field-OEQTsUNz.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-CesBcwJH.js → schema-form-DIcAa7CJ.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-ElAAlZ-R.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CQn_KBqr.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-Bxc54BLj.js → settings-form-section-BxNcTbYO.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-CYrho7Db.js → settings-loading-skeleton-Dpdxu4sf.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C03X5fkh.js → settings-page-DwPeOm1c.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-CZAJbv4E.js → settings-page-layout-CqirFmMn.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-Jv8_bcOD.js → setup-status-panel-DX_LdcTN.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-DSC7tKKG.js → share-preview-page-D72gYeux.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-nSfe-5xK.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-1tYpZrJf.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BUJl8LJG.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BO89zw5H.js → system-settings-panel-U0tBgW46.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-1OkdVC8l.js → theme-store-DCKDVPFF.js} +1 -1
- package/dist/gateway/static/root/assets/time-picker-BpiBF5-d.js +1 -0
- package/dist/gateway/static/root/assets/{typed-models-lib-D-_vct_y.js → typed-models-lib-D0XCOCAM.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-VlFtjlET.js → use-channel-catalog-mq_Inao2.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-BOC6Hn19.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BhDk-UV_.js → voice-api-key-field-CKaDitO6.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-DWGYp5yV.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-CpeWcpSp.js +1 -0
- package/dist/gateway/static/root/assets/work-page-MsEKzmSt.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-uVw4Yoej.js → workflow-run-setup-panel-s_kS_FYA.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-ByhHaUHB.js +11 -0
- package/dist/gateway/static/root/index.html +7 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +3 -1
- package/dist/src/agent/agent-manager.js +4 -3
- package/dist/src/agent/capabilities/definitions.d.ts +2 -1
- package/dist/src/agent/capabilities/definitions.js +3 -1
- package/dist/src/agent/memory/builtin-provider.js +4 -4
- package/dist/src/agent/memory/manager.d.ts +4 -1
- package/dist/src/agent/memory/manager.js +8 -3
- package/dist/src/agent/memory/understanding/service.d.ts +2 -0
- package/dist/src/agent/memory/understanding/service.js +11 -9
- package/dist/src/agent/prompt/sections/tooling.js +4 -0
- package/dist/src/agent/service.d.ts +3 -1
- package/dist/src/agent/service.js +29 -0
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/index.js +1 -1
- package/dist/src/agent/skills/install-target.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.d.ts +64 -0
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +27 -18
- package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +1 -1
- package/dist/src/agent/skills/marketplace/search.d.ts +46 -0
- package/dist/src/agent/skills/marketplace/search.js +193 -0
- package/dist/src/agent/skills/skill-tool-gating.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js +2 -0
- package/dist/src/agent/tools/factory.d.ts +4 -2
- package/dist/src/agent/tools/factory.js +11 -5
- package/dist/src/agent/tools/index.d.ts +2 -1
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/skill-install-tool.d.ts +17 -0
- package/dist/src/agent/tools/skill-install-tool.js +76 -8
- package/dist/src/agent/tools/skills-marketplace-search-tool.d.ts +17 -0
- package/dist/src/agent/tools/skills-marketplace-search-tool.js +77 -0
- package/dist/src/automations/domain/validation.d.ts +8 -8
- package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +1 -1
- package/dist/src/capabilities/store-connector.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/connectors/composio-sessions.d.ts +1 -0
- package/dist/src/connectors/composio-sessions.js +14 -5
- package/dist/src/connectors/composio-triggers.d.ts +1 -1
- package/dist/src/connectors/composio-triggers.js +4 -3
- package/dist/src/connectors/composio.js +1 -0
- package/dist/src/connectors/{connector-memory-sync.d.ts → connected-source-ingestion.d.ts} +11 -4
- package/dist/src/connectors/{connector-memory-sync.js → connected-source-ingestion.js} +49 -101
- package/dist/src/connectors/connected-source-normalizers.d.ts +15 -0
- package/dist/src/connectors/connected-source-normalizers.js +186 -0
- package/dist/src/connectors/connector-identity.d.ts +2 -0
- package/dist/src/connectors/connector-identity.js +29 -0
- package/dist/src/connectors/learning-coordinator.d.ts +25 -0
- package/dist/src/connectors/learning-coordinator.js +214 -0
- package/dist/src/connectors/learning-recipes.d.ts +22 -0
- package/dist/src/connectors/learning-recipes.js +121 -0
- package/dist/src/connectors/runtime-status.d.ts +1 -8
- package/dist/src/connectors/runtime-status.js +4 -29
- package/dist/src/extensions/api.js +1 -1
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +2 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +2 -2
- package/dist/src/gateway/hono/routes/connectors.js +76 -118
- package/dist/src/gateway/hono/routes/local-apps.js +1 -1
- package/dist/src/gateway/hono/routes/models.js +24 -0
- package/dist/src/gateway/hono/routes/public-gateway.js +3 -2
- package/dist/src/gateway/hono/routes/you.js +86 -5
- package/dist/src/gateway/service/marketplace-service.js +1 -1
- package/dist/src/gateway/service.d.ts +5 -2
- package/dist/src/gateway/service.js +18 -13
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/knowledge/connected-understanding-pipeline.d.ts +19 -0
- package/dist/src/knowledge/connected-understanding-pipeline.js +268 -0
- package/dist/src/knowledge/index.d.ts +1 -0
- package/dist/src/knowledge/index.js +2 -1
- package/dist/src/knowledge/ingestion-service.d.ts +6 -4
- package/dist/src/knowledge/ingestion-service.js +13 -10
- package/dist/src/knowledge/local-folder-adapter.js +1 -0
- package/dist/src/knowledge/people-graph.js +43 -110
- package/dist/src/knowledge/types.d.ts +3 -0
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/providers/xopc-cloud-account-service.d.ts +40 -0
- package/dist/src/providers/xopc-cloud-account-service.js +65 -0
- package/dist/src/storage/sqlite/connector-learning-repository.d.ts +47 -0
- package/dist/src/storage/sqlite/connector-learning-repository.js +110 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -1
- package/dist/src/storage/sqlite/index.js +4 -2
- package/dist/src/storage/sqlite/knowledge-repository.d.ts +4 -2
- package/dist/src/storage/sqlite/knowledge-repository.js +24 -13
- package/dist/src/storage/sqlite/migrations/062_connector_learning_jobs.sql +27 -0
- package/dist/src/storage/sqlite/migrations/063_knowledge_collection_scopes.sql +14 -0
- package/dist/src/storage/sqlite/migrations/064_user_claims.sql +60 -0
- package/dist/src/storage/sqlite/migrations/065_knowledge_item_scope_identity.sql +116 -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/user-claims-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/user-claims-repository.js +241 -0
- package/dist/src/user-context/projection.d.ts +36 -1
- package/dist/src/user-context/projection.js +84 -6
- package/dist/src/work-discovery/service.js +1 -0
- package/package.json +1 -1
- package/skills/tools/find-skills/SKILL.md +18 -428
- package/dist/gateway/static/root/assets/agents-ZCIC8mhO.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-DJmgBaAm.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-Ddot8-Md.js +0 -6
- package/dist/gateway/static/root/assets/block-editor-D3GIllO3.js +0 -184
- package/dist/gateway/static/root/assets/browser-settings-page-DvETvRcg.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-ChXIYbys.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUekXsJy.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-CkhveNsQ.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DRTb8DBk.js +0 -1
- package/dist/gateway/static/root/assets/connector-logo-CQznQcd4.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DkSGIxWP.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-BtP-xUQ9.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-gd9W6SLj.js +0 -3
- package/dist/gateway/static/root/assets/goal-detail-page-DizZ6Cpl.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-Dqry_hi2.js +0 -2
- package/dist/gateway/static/root/assets/index-DEdyUjxM.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-mT48mcF4.js +0 -7
- package/dist/gateway/static/root/assets/notes-workbench-wgt2Osyk.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CDjHvxJm.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-kJZwQXfC.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-MJdI9ek_.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BqC7GDC_.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CYwz8MfF.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-h8tGDkA3.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-D2DGvRUn.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-vqhjSMhZ.js +0 -2
- package/dist/gateway/static/root/assets/time-picker-mtD64kFB.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-BgF0WxjM.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CP0Daig-.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-NEWZPKB_.js +0 -1
- package/dist/gateway/static/root/assets/work-page-BkWntcQh.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DRvhNQGe.js +0 -11
- package/dist/src/connectors/memory-sync-coordinator.d.ts +0 -28
- package/dist/src/connectors/memory-sync-coordinator.js +0 -162
- package/dist/src/connectors/memory-sync-profile.d.ts +0 -13
- package/dist/src/connectors/memory-sync-profile.js +0 -73
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getCredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region src/providers/xopc-cloud-account-service.ts
|
|
4
|
+
init_credentials();
|
|
5
|
+
const DEFAULT_ROUTER_URL = "https://router.xopc.ai/v1";
|
|
6
|
+
const accountSummarySchema = z.object({
|
|
7
|
+
balance: z.object({
|
|
8
|
+
credits: z.number().int().nonnegative(),
|
|
9
|
+
updatedAt: z.string().datetime()
|
|
10
|
+
}),
|
|
11
|
+
usage: z.object({
|
|
12
|
+
days: z.union([
|
|
13
|
+
z.literal(1),
|
|
14
|
+
z.literal(7),
|
|
15
|
+
z.literal(30)
|
|
16
|
+
]),
|
|
17
|
+
requests: z.number().int().nonnegative(),
|
|
18
|
+
inputTokens: z.number().int().nonnegative(),
|
|
19
|
+
outputTokens: z.number().int().nonnegative(),
|
|
20
|
+
totalTokens: z.number().int().nonnegative(),
|
|
21
|
+
errors: z.number().int().nonnegative(),
|
|
22
|
+
averageLatencyMs: z.number().nonnegative(),
|
|
23
|
+
chargedCredits: z.number().int().nonnegative()
|
|
24
|
+
}),
|
|
25
|
+
links: z.object({
|
|
26
|
+
details: z.string().url(),
|
|
27
|
+
purchase: z.string().url()
|
|
28
|
+
})
|
|
29
|
+
});
|
|
30
|
+
var XopcCloudAccountError = class extends Error {
|
|
31
|
+
constructor(message, status, code) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.status = status;
|
|
34
|
+
this.code = code;
|
|
35
|
+
this.name = "XopcCloudAccountError";
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var XopcCloudAccountService = class {
|
|
39
|
+
fetchImpl;
|
|
40
|
+
routerUrl;
|
|
41
|
+
credentials;
|
|
42
|
+
constructor(options = {}) {
|
|
43
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
44
|
+
this.routerUrl = (options.routerUrl ?? process.env.XOPC_MODEL_ROUTER_URL ?? DEFAULT_ROUTER_URL).replace(/\/+$/, "");
|
|
45
|
+
this.credentials = options.credentials ?? getCredentialResolver();
|
|
46
|
+
}
|
|
47
|
+
async getSummary(days = 7) {
|
|
48
|
+
const accessToken = await this.credentials.resolveApiKey("xopc-cloud");
|
|
49
|
+
if (!accessToken) return null;
|
|
50
|
+
const response = await this.fetchImpl(`${this.routerUrl}/account/summary?days=${days}`, {
|
|
51
|
+
headers: {
|
|
52
|
+
authorization: `Bearer ${accessToken}`,
|
|
53
|
+
accept: "application/json"
|
|
54
|
+
},
|
|
55
|
+
signal: AbortSignal.timeout(3e4)
|
|
56
|
+
});
|
|
57
|
+
const body = await response.json().catch(() => null);
|
|
58
|
+
if (!response.ok) throw new XopcCloudAccountError(typeof body?.error?.message === "string" ? body.error.message : `XOPC account summary failed (${response.status})`, response.status, typeof body?.error?.code === "string" ? body.error.code : void 0);
|
|
59
|
+
const parsed = accountSummarySchema.safeParse(body);
|
|
60
|
+
if (!parsed.success) throw new XopcCloudAccountError("XOPC account summary returned an invalid response", response.status, "invalid_response");
|
|
61
|
+
return parsed.data;
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
//#endregion
|
|
65
|
+
export { XopcCloudAccountError, XopcCloudAccountService };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export type ConnectorLearningMode = 'bootstrap' | 'incremental';
|
|
2
|
+
export type ConnectorLearningStatus = 'queued' | 'running' | 'completed' | 'failed' | 'paused';
|
|
3
|
+
export type ConnectorLearningPhase = 'queued' | 'fetching' | 'indexing' | 'deriving' | 'completed';
|
|
4
|
+
export type ConnectorLearningJob = {
|
|
5
|
+
id: string;
|
|
6
|
+
idempotencyKey: string;
|
|
7
|
+
connectorId: string;
|
|
8
|
+
connectionId: string;
|
|
9
|
+
sourceInstanceId: string;
|
|
10
|
+
agentId: string;
|
|
11
|
+
mode: ConnectorLearningMode;
|
|
12
|
+
status: ConnectorLearningStatus;
|
|
13
|
+
phase: ConnectorLearningPhase;
|
|
14
|
+
itemsDiscovered: number;
|
|
15
|
+
itemsIndexed: number;
|
|
16
|
+
candidatesCreated: number;
|
|
17
|
+
attemptCount: number;
|
|
18
|
+
error?: string;
|
|
19
|
+
nextRunAt?: string;
|
|
20
|
+
startedAt?: string;
|
|
21
|
+
finishedAt?: string;
|
|
22
|
+
createdAt: string;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
};
|
|
25
|
+
export declare function enqueueConnectorLearningJob(input: {
|
|
26
|
+
connectorId: string;
|
|
27
|
+
connectionId: string;
|
|
28
|
+
sourceInstanceId: string;
|
|
29
|
+
agentId: string;
|
|
30
|
+
mode: ConnectorLearningMode;
|
|
31
|
+
idempotencyKey: string;
|
|
32
|
+
nextRunAt?: number;
|
|
33
|
+
nowMs?: number;
|
|
34
|
+
}): ConnectorLearningJob;
|
|
35
|
+
export declare function claimNextConnectorLearningJob(nowMs?: number): ConnectorLearningJob | null;
|
|
36
|
+
export declare function recoverStaleConnectorLearningJobs(staleBeforeMs: number, nowMs?: number): number;
|
|
37
|
+
export declare function setConnectorLearningPaused(connectionId: string, paused: boolean, nowMs?: number): number;
|
|
38
|
+
export declare function updateConnectorLearningJob(id: string, patch: Partial<Pick<ConnectorLearningJob, 'status' | 'phase' | 'itemsDiscovered' | 'itemsIndexed' | 'candidatesCreated' | 'error'>> & {
|
|
39
|
+
nextRunAt?: number | null;
|
|
40
|
+
finished?: boolean;
|
|
41
|
+
nowMs?: number;
|
|
42
|
+
}): ConnectorLearningJob;
|
|
43
|
+
export declare function listConnectorLearningJobs(options?: {
|
|
44
|
+
sourceInstanceId?: string;
|
|
45
|
+
connectionId?: string;
|
|
46
|
+
limit?: number;
|
|
47
|
+
}): ConnectorLearningJob[];
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
//#region src/storage/sqlite/connector-learning-repository.ts
|
|
4
|
+
function iso(value) {
|
|
5
|
+
return value == null ? void 0 : new Date(value).toISOString();
|
|
6
|
+
}
|
|
7
|
+
function fromRow(row) {
|
|
8
|
+
return {
|
|
9
|
+
id: row.job_id,
|
|
10
|
+
idempotencyKey: row.idempotency_key,
|
|
11
|
+
connectorId: row.connector_id,
|
|
12
|
+
connectionId: row.connection_id,
|
|
13
|
+
sourceInstanceId: row.source_instance_id,
|
|
14
|
+
agentId: row.agent_id,
|
|
15
|
+
mode: row.mode,
|
|
16
|
+
status: row.status,
|
|
17
|
+
phase: row.phase,
|
|
18
|
+
itemsDiscovered: row.items_discovered,
|
|
19
|
+
itemsIndexed: row.items_indexed,
|
|
20
|
+
candidatesCreated: row.candidates_created,
|
|
21
|
+
attemptCount: row.attempt_count,
|
|
22
|
+
...row.error ? { error: row.error } : {},
|
|
23
|
+
...iso(row.next_run_at) ? { nextRunAt: iso(row.next_run_at) } : {},
|
|
24
|
+
...iso(row.started_at) ? { startedAt: iso(row.started_at) } : {},
|
|
25
|
+
...iso(row.finished_at) ? { finishedAt: iso(row.finished_at) } : {},
|
|
26
|
+
createdAt: new Date(row.created_at).toISOString(),
|
|
27
|
+
updatedAt: new Date(row.updated_at).toISOString()
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function enqueueConnectorLearningJob(input) {
|
|
31
|
+
const now = input.nowMs ?? Date.now();
|
|
32
|
+
runSqliteWriteTransaction((db) => {
|
|
33
|
+
db.prepare(`INSERT INTO connector_learning_jobs (
|
|
34
|
+
job_id, idempotency_key, connector_id, connection_id, source_instance_id,
|
|
35
|
+
agent_id, mode, status, phase, next_run_at, created_at, updated_at
|
|
36
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', 'queued', ?, ?, ?)
|
|
37
|
+
ON CONFLICT(idempotency_key) DO NOTHING`).run(randomUUID(), input.idempotencyKey, input.connectorId, input.connectionId, input.sourceInstanceId, input.agentId, input.mode, input.nextRunAt ?? now, now, now);
|
|
38
|
+
});
|
|
39
|
+
return fromRow(getSqliteDatabase().prepare("SELECT * FROM connector_learning_jobs WHERE idempotency_key = ?").get(input.idempotencyKey));
|
|
40
|
+
}
|
|
41
|
+
function claimNextConnectorLearningJob(nowMs = Date.now()) {
|
|
42
|
+
return runSqliteWriteTransaction((db) => {
|
|
43
|
+
const row = db.prepare(`SELECT * FROM connector_learning_jobs
|
|
44
|
+
WHERE status IN ('queued', 'failed') AND attempt_count < 5 AND COALESCE(next_run_at, 0) <= ?
|
|
45
|
+
ORDER BY next_run_at ASC, created_at ASC LIMIT 1`).get(nowMs);
|
|
46
|
+
if (!row) return null;
|
|
47
|
+
if (db.prepare(`UPDATE connector_learning_jobs SET
|
|
48
|
+
status = 'running', phase = 'fetching', attempt_count = attempt_count + 1,
|
|
49
|
+
error = NULL, started_at = COALESCE(started_at, ?), updated_at = ?
|
|
50
|
+
WHERE job_id = ? AND status IN ('queued', 'failed')`).run(nowMs, nowMs, row.job_id).changes !== 1) return null;
|
|
51
|
+
return fromRow(db.prepare("SELECT * FROM connector_learning_jobs WHERE job_id = ?").get(row.job_id));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function recoverStaleConnectorLearningJobs(staleBeforeMs, nowMs = Date.now()) {
|
|
55
|
+
return runSqliteWriteTransaction((db) => Number(db.prepare(`UPDATE connector_learning_jobs SET
|
|
56
|
+
status = CASE WHEN attempt_count >= 5 THEN 'paused' ELSE 'failed' END,
|
|
57
|
+
error = 'Interrupted while learning; queued for recovery.',
|
|
58
|
+
next_run_at = CASE WHEN attempt_count >= 5 THEN NULL ELSE ? END,
|
|
59
|
+
finished_at = ?, updated_at = ?
|
|
60
|
+
WHERE status = 'running' AND updated_at < ?`).run(nowMs, nowMs, nowMs, staleBeforeMs).changes));
|
|
61
|
+
}
|
|
62
|
+
function setConnectorLearningPaused(connectionId, paused, nowMs = Date.now()) {
|
|
63
|
+
return runSqliteWriteTransaction((db) => Number(db.prepare(paused ? `UPDATE connector_learning_jobs SET status = 'paused', next_run_at = NULL, updated_at = ?
|
|
64
|
+
WHERE connection_id = ? AND status IN ('queued', 'failed', 'running')` : `UPDATE connector_learning_jobs SET status = 'queued', next_run_at = ?, updated_at = ?
|
|
65
|
+
WHERE connection_id = ? AND status = 'paused'`).run(...paused ? [nowMs, connectionId] : [
|
|
66
|
+
nowMs,
|
|
67
|
+
nowMs,
|
|
68
|
+
connectionId
|
|
69
|
+
]).changes));
|
|
70
|
+
}
|
|
71
|
+
function updateConnectorLearningJob(id, patch) {
|
|
72
|
+
const now = patch.nowMs ?? Date.now();
|
|
73
|
+
const fields = ["updated_at = ?"];
|
|
74
|
+
const values = [now];
|
|
75
|
+
const add = (column, value) => {
|
|
76
|
+
if (value === void 0) return;
|
|
77
|
+
fields.push(`${column} = ?`);
|
|
78
|
+
values.push(value);
|
|
79
|
+
};
|
|
80
|
+
add("status", patch.status);
|
|
81
|
+
add("phase", patch.phase);
|
|
82
|
+
add("items_discovered", patch.itemsDiscovered);
|
|
83
|
+
add("items_indexed", patch.itemsIndexed);
|
|
84
|
+
add("candidates_created", patch.candidatesCreated);
|
|
85
|
+
add("error", patch.error);
|
|
86
|
+
add("next_run_at", patch.nextRunAt);
|
|
87
|
+
if (patch.finished) add("finished_at", now);
|
|
88
|
+
values.push(id);
|
|
89
|
+
getSqliteDatabase().prepare(`UPDATE connector_learning_jobs SET ${fields.join(", ")} WHERE job_id = ?`).run(...values);
|
|
90
|
+
const row = getSqliteDatabase().prepare("SELECT * FROM connector_learning_jobs WHERE job_id = ?").get(id);
|
|
91
|
+
if (!row) throw new Error(`Connector learning job not found: ${id}`);
|
|
92
|
+
return fromRow(row);
|
|
93
|
+
}
|
|
94
|
+
function listConnectorLearningJobs(options = {}) {
|
|
95
|
+
const clauses = [];
|
|
96
|
+
const values = [];
|
|
97
|
+
if (options.sourceInstanceId) {
|
|
98
|
+
clauses.push("source_instance_id = ?");
|
|
99
|
+
values.push(options.sourceInstanceId);
|
|
100
|
+
}
|
|
101
|
+
if (options.connectionId) {
|
|
102
|
+
clauses.push("connection_id = ?");
|
|
103
|
+
values.push(options.connectionId);
|
|
104
|
+
}
|
|
105
|
+
const limit = Math.max(1, Math.min(options.limit ?? 100, 500));
|
|
106
|
+
return getSqliteDatabase().prepare(`SELECT * FROM connector_learning_jobs ${clauses.length ? `WHERE ${clauses.join(" AND ")}` : ""}
|
|
107
|
+
ORDER BY created_at DESC LIMIT ?`).all(...values, limit).map(fromRow);
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob };
|
|
@@ -5,6 +5,8 @@ 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 { getUserClaim, linkUserClaimMemoryRecord, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, removeUserClaimEvidenceForSource, reinforceUserClaim, resolveUserEntity, setUserClaimDecision, type UserClaim, type UserClaimClass, type UserClaimState, type UserEntity, } from './user-claims-repository.js';
|
|
9
|
+
export { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob, type ConnectorLearningJob, type ConnectorLearningMode, type ConnectorLearningPhase, type ConnectorLearningStatus, } from './connector-learning-repository.js';
|
|
8
10
|
export { appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory, COMPOSER_INPUT_HISTORY_LIMIT, type ComposerInputHistoryItem, } from './composer-input-history-repository.js';
|
|
9
11
|
export { getInteractionState, setInteractionState, updateInteractionStateFromMessage, type InteractionState, } from './interaction-state-repository.js';
|
|
10
12
|
export { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings, type RelationshipSettings, type SupportMode, } from './relationship-settings-repository.js';
|
|
@@ -17,7 +19,7 @@ export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } f
|
|
|
17
19
|
export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
|
|
18
20
|
export { searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
|
|
19
21
|
export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, hasUnresolvedMemoryConflict, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, markMemoryRecordsConflicted, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, setLatestMemoryInjectFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, USER_UNDERSTANDING_REMEDIATION_POLICY, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type FindLatestMemoryInjectTraceInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemoryFeedbackRemediationResult, type MemorySignalRowPayload, type MemoryTraceFeedback, type MemoryTraceEventPayload, type UserUnderstandingQualityMetrics, type SearchMemoryRecordsOptions, type SetMemoryTraceFeedbackInput, type SetLatestMemoryInjectFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
|
|
20
|
-
export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
|
|
22
|
+
export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceItems, listKnowledgeSourceChanges, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeSourceItemSynthesisStatus, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems, } from './knowledge-repository.js';
|
|
21
23
|
export { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig, } from './config-repository.js';
|
|
22
24
|
export { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent, } from './activity-repository.js';
|
|
23
25
|
export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getConnectorConnection, getConnectorApproval, getConnectorInstallation, getCachedConnectorCatalogEntry, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, type CachedConnectorCatalogEntry, } from './connector-repository.js';
|
|
@@ -6,6 +6,8 @@ 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 { getUserClaim, linkUserClaimMemoryRecord, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, reinforceUserClaim, removeUserClaimEvidenceForSource, resolveUserEntity, setUserClaimDecision } from "./user-claims-repository.js";
|
|
10
|
+
import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "./connector-learning-repository.js";
|
|
9
11
|
import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposerInputHistory, listComposerInputHistory } from "./composer-input-history-repository.js";
|
|
10
12
|
import { getInteractionState, setInteractionState, updateInteractionStateFromMessage } from "./interaction-state-repository.js";
|
|
11
13
|
import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings } from "./relationship-settings-repository.js";
|
|
@@ -18,11 +20,11 @@ import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } fr
|
|
|
18
20
|
import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
|
|
19
21
|
import { searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
|
|
20
22
|
import { USER_UNDERSTANDING_REMEDIATION_POLICY, appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, findLatestMemoryInjectTrace, getMemoryProviderState, getMemoryRecord, hasUnresolvedMemoryConflict, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, markMemoryRecordsConflicted, searchMemoryRecords, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, summarizeUserUnderstandingQuality, upsertMemoryRecord } from "./memory-records-repository.js";
|
|
21
|
-
import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
|
|
23
|
+
import { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
|
|
22
24
|
import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
|
|
23
25
|
import { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
|
|
24
26
|
import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
|
|
25
27
|
import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
|
|
26
28
|
import { consumeMemoryReferenceConsent, decideMemoryReferenceConsent, ensureMemoryReferenceConsentRequest, hasMemoryReferenceConsent, listMemoryReferenceConsents, revokeMemoryReferenceConsent } from "./memory-reference-consent-repository.js";
|
|
27
29
|
import { getUserProfilePromptState, setUserProfilePromptState } from "./user-profile-setup-repository.js";
|
|
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, appendCompactionBoundary, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, 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, 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, listCompactionBoundaries, listComposerInputHistory, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, 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 };
|
|
30
|
+
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, appendCompactionBoundary, appendComposerInputHistory, appendConnectorExecutionAudit, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, attachMemoryEvidence, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRelationshipPrompt, claimConnectorWebhookDelivery, claimKnowledgeSourceItems, claimNextConnectorLearningJob, classifyStoredRow, clearComposerInputHistory, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, completeTaskOutcome, consumeConnectorApproval, consumeMemoryReferenceConsent, createConnectorApproval, createObjectLinkRecord, decideConnectorApproval, decideMemoryReferenceConsent, deleteConnectorConnection, deleteConnectorInstallation, deleteMemoryEvidenceForRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureMemoryReferenceConsentRequest, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findLatestMemoryInjectTrace, findSessionKeyBySessionId, findTaskOutcomeForAssistant, finishKnowledgeSyncRun, getActivityEventRecord, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getCurrentSessionId, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getRelationshipSettings, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getTaskOutcome, getUserClaim, getUserProfilePromptState, getUserTrustPolicy, getXopcDatabase, hasMemoryReferenceConsent, hasSessionConfig, hasUnresolvedMemoryConflict, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isProactiveSupportAllowed, isXopcDatabaseOpen, linkUserClaimMemoryRecord, listActivityRecords, listCachedConnectorCatalogEntries, listCompactionBoundaries, listComposerInputHistory, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, listMemoryRecords, listMemoryReferenceConsents, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskOutcomes, listUserClaimEvidence, listUserClaimStatsBySource, listUserClaims, listUserPeopleGraphRows, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, markMemoryRecordsConflicted, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, recoverStaleConnectorLearningJobs, reinforceUserClaim, releaseConnectorWebhookDelivery, removeUserClaimEvidenceForSource, replaceConnectorCatalogEntries, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveMigrationsDir, resolveSessionAgentId, resolveUserEntity, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeMemoryReferenceConsent, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setConnectorLearningPaused, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setLatestMemoryInjectFeedback, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, setTaskOutcomeFeedback, setUserClaimDecision, setUserProfilePromptState, setUserTrustPolicy, startKnowledgeSyncRun, startTaskOutcome, summarizeMemoryRecallFeedback, summarizeTaskOutcomes, summarizeUserUnderstandingQuality, syncMemoryIndex, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateTaskOutcome, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertKnowledgeSourceItems, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
|
|
@@ -21,8 +21,8 @@ export declare function listKnowledgeSyncRuns(options?: {
|
|
|
21
21
|
status?: KnowledgeSyncRunStatus;
|
|
22
22
|
limit?: number;
|
|
23
23
|
}): KnowledgeSyncRun[];
|
|
24
|
-
export declare function getKnowledgeSourceCursor(sourceInstanceId: string): string | undefined;
|
|
25
|
-
export declare function setKnowledgeSourceCursor(sourceInstanceId: string, cursor: string | undefined): void;
|
|
24
|
+
export declare function getKnowledgeSourceCursor(sourceInstanceId: string, collectionScope: string): string | undefined;
|
|
25
|
+
export declare function setKnowledgeSourceCursor(sourceInstanceId: string, collectionScope: string, cursor: string | undefined): void;
|
|
26
26
|
export declare function upsertKnowledgeSourceItems(inputs: KnowledgeSourceItemInput[], nowMs?: number): {
|
|
27
27
|
items: KnowledgeSourceItem[];
|
|
28
28
|
created: number;
|
|
@@ -39,12 +39,14 @@ export declare function getKnowledgeConsumerWatermark(consumerId: string, source
|
|
|
39
39
|
export declare function setKnowledgeConsumerWatermark(consumerId: string, sourceInstanceId: string, sequence: number, nowMs?: number): void;
|
|
40
40
|
export declare function listKnowledgeSourceItems(options?: {
|
|
41
41
|
sourceInstanceId?: string;
|
|
42
|
+
collectionScope?: string;
|
|
42
43
|
itemType?: string;
|
|
43
44
|
synthesisStatus?: KnowledgeSynthesisStatus;
|
|
44
45
|
includeDeleted?: boolean;
|
|
45
46
|
limit?: number;
|
|
46
47
|
offset?: number;
|
|
47
48
|
}): KnowledgeSourceItem[];
|
|
49
|
+
export declare function pruneBoundedKnowledgeSourceItems(sourceInstanceId: string, olderThanMs: number): number;
|
|
48
50
|
export declare function setKnowledgeSourceItemSynthesisStatus(itemIds: string[], status: KnowledgeSynthesisStatus, nowMs?: number): number;
|
|
49
51
|
export declare function claimKnowledgeSourceItems(options: {
|
|
50
52
|
workerId: string;
|
|
@@ -29,6 +29,7 @@ function sourceItemFromRow(row) {
|
|
|
29
29
|
return {
|
|
30
30
|
id: row.item_id,
|
|
31
31
|
sourceInstanceId: row.source_instance_id,
|
|
32
|
+
collectionScope: row.collection_scope,
|
|
32
33
|
externalId: row.external_id,
|
|
33
34
|
itemType: row.item_type,
|
|
34
35
|
...row.author_role ? { authorRole: row.author_role } : {},
|
|
@@ -127,16 +128,16 @@ function listKnowledgeSyncRuns(options = {}) {
|
|
|
127
128
|
${where.length > 0 ? `WHERE ${where.join(" AND ")}` : ""}
|
|
128
129
|
ORDER BY started_at DESC LIMIT ?`).all(...params, limit).map(syncRunFromRow);
|
|
129
130
|
}
|
|
130
|
-
function getKnowledgeSourceCursor(sourceInstanceId) {
|
|
131
|
-
return getSqliteDatabase().prepare(`SELECT cursor FROM
|
|
131
|
+
function getKnowledgeSourceCursor(sourceInstanceId, collectionScope) {
|
|
132
|
+
return getSqliteDatabase().prepare(`SELECT cursor FROM knowledge_collection_state WHERE source_instance_id = ? AND collection_scope = ?`).get(sourceInstanceId, collectionScope)?.cursor ?? void 0;
|
|
132
133
|
}
|
|
133
|
-
function setKnowledgeSourceCursor(sourceInstanceId, cursor) {
|
|
134
|
+
function setKnowledgeSourceCursor(sourceInstanceId, collectionScope, cursor) {
|
|
134
135
|
runSqliteWriteTransaction((db) => {
|
|
135
|
-
db.prepare(`INSERT INTO
|
|
136
|
-
VALUES (?, ?, ?)
|
|
137
|
-
ON CONFLICT(source_instance_id) DO UPDATE SET
|
|
136
|
+
db.prepare(`INSERT INTO knowledge_collection_state (source_instance_id, collection_scope, cursor, updated_at)
|
|
137
|
+
VALUES (?, ?, ?, ?)
|
|
138
|
+
ON CONFLICT(source_instance_id, collection_scope) DO UPDATE SET
|
|
138
139
|
cursor = excluded.cursor,
|
|
139
|
-
updated_at = excluded.updated_at`).run(sourceInstanceId, cursor ?? null, Date.now());
|
|
140
|
+
updated_at = excluded.updated_at`).run(sourceInstanceId, collectionScope, cursor ?? null, Date.now());
|
|
140
141
|
});
|
|
141
142
|
}
|
|
142
143
|
function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
|
|
@@ -147,7 +148,7 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
|
|
|
147
148
|
let unchanged = 0;
|
|
148
149
|
for (const input of inputs) {
|
|
149
150
|
const existing = db.prepare(`SELECT * FROM knowledge_source_items
|
|
150
|
-
WHERE source_instance_id = ? AND external_id = ?`).get(input.sourceInstanceId, input.externalId);
|
|
151
|
+
WHERE source_instance_id = ? AND collection_scope = ? AND external_id = ?`).get(input.sourceInstanceId, input.collectionScope, input.externalId);
|
|
151
152
|
const id = existing?.item_id ?? input.id ?? randomUUID();
|
|
152
153
|
if (existing?.content_hash === input.contentHash && existing.deleted_at === parseTimestamp(input.deletedAt)) {
|
|
153
154
|
unchanged += 1;
|
|
@@ -155,13 +156,14 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
|
|
|
155
156
|
continue;
|
|
156
157
|
}
|
|
157
158
|
db.prepare(`INSERT INTO knowledge_source_items (
|
|
158
|
-
item_id, source_instance_id, external_id, item_type, author_role,
|
|
159
|
+
item_id, source_instance_id, collection_scope, external_id, item_type, author_role,
|
|
159
160
|
occurred_at, source_updated_at, content_hash, normalized_text,
|
|
160
161
|
payload_ref, metadata_json, sensitivity, retention_class,
|
|
161
162
|
synthesis_pipeline, synthesis_status, deleted_at, created_at, updated_at
|
|
162
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
163
|
-
ON CONFLICT(source_instance_id, external_id) DO UPDATE SET
|
|
163
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
164
|
+
ON CONFLICT(source_instance_id, collection_scope, external_id) DO UPDATE SET
|
|
164
165
|
item_type = excluded.item_type,
|
|
166
|
+
collection_scope = excluded.collection_scope,
|
|
165
167
|
author_role = excluded.author_role,
|
|
166
168
|
occurred_at = excluded.occurred_at,
|
|
167
169
|
source_updated_at = excluded.source_updated_at,
|
|
@@ -178,7 +180,7 @@ function upsertKnowledgeSourceItems(inputs, nowMs = Date.now()) {
|
|
|
178
180
|
synthesis_claimed_by = NULL,
|
|
179
181
|
synthesis_error = NULL,
|
|
180
182
|
deleted_at = excluded.deleted_at,
|
|
181
|
-
updated_at = excluded.updated_at`).run(id, input.sourceInstanceId, input.externalId, input.itemType, input.authorRole ?? null, parseTimestamp(input.occurredAt), parseTimestamp(input.sourceUpdatedAt), input.contentHash, input.normalizedText ?? null, input.payloadRef ?? null, JSON.stringify(input.metadata ?? {}), input.sensitivity ?? "normal", input.retentionClass ?? "bounded", input.synthesisPipeline ?? "user_understanding", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
|
|
183
|
+
updated_at = excluded.updated_at`).run(id, input.sourceInstanceId, input.collectionScope, input.externalId, input.itemType, input.authorRole ?? null, parseTimestamp(input.occurredAt), parseTimestamp(input.sourceUpdatedAt), input.contentHash, input.normalizedText ?? null, input.payloadRef ?? null, JSON.stringify(input.metadata ?? {}), input.sensitivity ?? "normal", input.retentionClass ?? "bounded", input.synthesisPipeline ?? "user_understanding", input.synthesisStatus ?? "pending", parseTimestamp(input.deletedAt), existing?.created_at ?? nowMs, nowMs);
|
|
182
184
|
const row = db.prepare(`SELECT * FROM knowledge_source_items WHERE item_id = ?`).get(id);
|
|
183
185
|
items.push(sourceItemFromRow(row));
|
|
184
186
|
const changeKind = input.deletedAt ? "deleted" : existing ? "modified" : "added";
|
|
@@ -238,6 +240,10 @@ function listKnowledgeSourceItems(options = {}) {
|
|
|
238
240
|
where.push("source_instance_id = ?");
|
|
239
241
|
params.push(options.sourceInstanceId);
|
|
240
242
|
}
|
|
243
|
+
if (options.collectionScope) {
|
|
244
|
+
where.push("collection_scope = ?");
|
|
245
|
+
params.push(options.collectionScope);
|
|
246
|
+
}
|
|
241
247
|
if (options.itemType) {
|
|
242
248
|
where.push("item_type = ?");
|
|
243
249
|
params.push(options.itemType);
|
|
@@ -254,6 +260,11 @@ function listKnowledgeSourceItems(options = {}) {
|
|
|
254
260
|
ORDER BY COALESCE(source_updated_at, occurred_at, updated_at) DESC
|
|
255
261
|
LIMIT ? OFFSET ?`).all(...params, limit, offset).map(sourceItemFromRow);
|
|
256
262
|
}
|
|
263
|
+
function pruneBoundedKnowledgeSourceItems(sourceInstanceId, olderThanMs) {
|
|
264
|
+
return runSqliteWriteTransaction((db) => Number(db.prepare(`DELETE FROM knowledge_source_items
|
|
265
|
+
WHERE source_instance_id = ? AND retention_class = 'bounded'
|
|
266
|
+
AND COALESCE(source_updated_at, occurred_at, updated_at) < ?`).run(sourceInstanceId, olderThanMs).changes));
|
|
267
|
+
}
|
|
257
268
|
function setKnowledgeSourceItemSynthesisStatus(itemIds, status, nowMs = Date.now()) {
|
|
258
269
|
if (itemIds.length === 0) return 0;
|
|
259
270
|
return runSqliteWriteTransaction((db) => {
|
|
@@ -350,4 +361,4 @@ function listMemoryEvidence(recordId) {
|
|
|
350
361
|
}));
|
|
351
362
|
}
|
|
352
363
|
//#endregion
|
|
353
|
-
export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
|
|
364
|
+
export { attachMemoryEvidence, claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, deleteMemoryEvidenceForRecord, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listMemoryEvidence, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
CREATE TABLE connector_learning_jobs (
|
|
2
|
+
job_id TEXT PRIMARY KEY,
|
|
3
|
+
idempotency_key TEXT NOT NULL UNIQUE,
|
|
4
|
+
connector_id TEXT NOT NULL,
|
|
5
|
+
connection_id TEXT NOT NULL,
|
|
6
|
+
source_instance_id TEXT NOT NULL,
|
|
7
|
+
agent_id TEXT NOT NULL,
|
|
8
|
+
mode TEXT NOT NULL CHECK(mode IN ('bootstrap', 'incremental')),
|
|
9
|
+
status TEXT NOT NULL CHECK(status IN ('queued', 'running', 'completed', 'failed', 'paused')),
|
|
10
|
+
phase TEXT NOT NULL CHECK(phase IN ('queued', 'fetching', 'indexing', 'deriving', 'completed')),
|
|
11
|
+
items_discovered INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
items_indexed INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
candidates_created INTEGER NOT NULL DEFAULT 0,
|
|
14
|
+
attempt_count INTEGER NOT NULL DEFAULT 0,
|
|
15
|
+
error TEXT,
|
|
16
|
+
next_run_at INTEGER,
|
|
17
|
+
started_at INTEGER,
|
|
18
|
+
finished_at INTEGER,
|
|
19
|
+
created_at INTEGER NOT NULL,
|
|
20
|
+
updated_at INTEGER NOT NULL,
|
|
21
|
+
FOREIGN KEY(connection_id) REFERENCES connector_connections(id) ON DELETE CASCADE
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
CREATE INDEX idx_connector_learning_jobs_due
|
|
25
|
+
ON connector_learning_jobs(status, next_run_at, created_at);
|
|
26
|
+
CREATE INDEX idx_connector_learning_jobs_source
|
|
27
|
+
ON connector_learning_jobs(source_instance_id, created_at DESC);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
ALTER TABLE knowledge_source_items ADD COLUMN collection_scope TEXT NOT NULL DEFAULT 'primary';
|
|
2
|
+
|
|
3
|
+
DROP TABLE knowledge_source_state;
|
|
4
|
+
|
|
5
|
+
CREATE TABLE knowledge_collection_state (
|
|
6
|
+
source_instance_id TEXT NOT NULL,
|
|
7
|
+
collection_scope TEXT NOT NULL,
|
|
8
|
+
cursor TEXT,
|
|
9
|
+
updated_at INTEGER NOT NULL,
|
|
10
|
+
PRIMARY KEY(source_instance_id, collection_scope)
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
CREATE INDEX idx_knowledge_source_items_collection
|
|
14
|
+
ON knowledge_source_items(source_instance_id, collection_scope, updated_at DESC);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
CREATE TABLE user_entities (
|
|
2
|
+
entity_id TEXT PRIMARY KEY,
|
|
3
|
+
entity_type TEXT NOT NULL CHECK(entity_type IN ('person', 'project', 'organization')),
|
|
4
|
+
canonical_label TEXT NOT NULL,
|
|
5
|
+
created_at INTEGER NOT NULL,
|
|
6
|
+
updated_at INTEGER NOT NULL
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
CREATE TABLE user_entity_handles (
|
|
10
|
+
entity_id TEXT NOT NULL,
|
|
11
|
+
handle_type TEXT NOT NULL CHECK(handle_type IN ('email', 'provider_user', 'display_name')),
|
|
12
|
+
normalized_value TEXT NOT NULL,
|
|
13
|
+
source_scope TEXT NOT NULL,
|
|
14
|
+
verified INTEGER NOT NULL CHECK(verified IN (0, 1)),
|
|
15
|
+
created_at INTEGER NOT NULL,
|
|
16
|
+
PRIMARY KEY(handle_type, normalized_value, source_scope),
|
|
17
|
+
FOREIGN KEY(entity_id) REFERENCES user_entities(entity_id) ON DELETE CASCADE
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
CREATE INDEX idx_user_entity_handles_entity ON user_entity_handles(entity_id);
|
|
21
|
+
|
|
22
|
+
CREATE TABLE user_claims (
|
|
23
|
+
claim_id TEXT PRIMARY KEY,
|
|
24
|
+
agent_id TEXT NOT NULL,
|
|
25
|
+
claim_class TEXT NOT NULL CHECK(claim_class IN ('relationship', 'project', 'routine')),
|
|
26
|
+
claim_key TEXT NOT NULL,
|
|
27
|
+
subject_entity_id TEXT,
|
|
28
|
+
value_json TEXT NOT NULL,
|
|
29
|
+
state TEXT NOT NULL CHECK(state IN ('provisional', 'active', 'rejected', 'stale')),
|
|
30
|
+
user_state TEXT NOT NULL CHECK(user_state IN ('auto', 'confirmed', 'rejected')),
|
|
31
|
+
confidence REAL NOT NULL,
|
|
32
|
+
independent_evidence_count INTEGER NOT NULL,
|
|
33
|
+
active_day_count INTEGER NOT NULL,
|
|
34
|
+
first_observed_at INTEGER NOT NULL,
|
|
35
|
+
last_reinforced_at INTEGER NOT NULL,
|
|
36
|
+
memory_record_id TEXT,
|
|
37
|
+
created_at INTEGER NOT NULL,
|
|
38
|
+
updated_at INTEGER NOT NULL,
|
|
39
|
+
UNIQUE(agent_id, claim_class, claim_key),
|
|
40
|
+
FOREIGN KEY(subject_entity_id) REFERENCES user_entities(entity_id) ON DELETE SET NULL,
|
|
41
|
+
FOREIGN KEY(memory_record_id) REFERENCES memory_records(record_id) ON DELETE SET NULL
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
CREATE INDEX idx_user_claims_agent_state
|
|
45
|
+
ON user_claims(agent_id, state, confidence DESC, last_reinforced_at DESC);
|
|
46
|
+
|
|
47
|
+
CREATE TABLE user_claim_evidence (
|
|
48
|
+
claim_id TEXT NOT NULL,
|
|
49
|
+
logical_event_key TEXT NOT NULL,
|
|
50
|
+
source_item_id TEXT NOT NULL,
|
|
51
|
+
source_instance_id TEXT NOT NULL,
|
|
52
|
+
relation TEXT NOT NULL CHECK(relation IN ('supports', 'contradicts')),
|
|
53
|
+
observed_at INTEGER NOT NULL,
|
|
54
|
+
created_at INTEGER NOT NULL,
|
|
55
|
+
PRIMARY KEY(claim_id, logical_event_key),
|
|
56
|
+
FOREIGN KEY(claim_id) REFERENCES user_claims(claim_id) ON DELETE CASCADE,
|
|
57
|
+
FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
CREATE INDEX idx_user_claim_evidence_source ON user_claim_evidence(source_item_id);
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
CREATE TABLE memory_evidence_backup AS SELECT * FROM memory_evidence;
|
|
2
|
+
CREATE TABLE knowledge_source_changes_backup AS SELECT * FROM knowledge_source_changes;
|
|
3
|
+
CREATE TABLE user_claim_evidence_backup AS SELECT * FROM user_claim_evidence;
|
|
4
|
+
|
|
5
|
+
DROP TABLE memory_evidence;
|
|
6
|
+
DROP TABLE knowledge_source_changes;
|
|
7
|
+
DROP TABLE user_claim_evidence;
|
|
8
|
+
|
|
9
|
+
CREATE TABLE knowledge_source_items_v65 (
|
|
10
|
+
item_id TEXT PRIMARY KEY,
|
|
11
|
+
source_instance_id TEXT NOT NULL,
|
|
12
|
+
collection_scope TEXT NOT NULL,
|
|
13
|
+
external_id TEXT NOT NULL,
|
|
14
|
+
item_type TEXT NOT NULL,
|
|
15
|
+
author_role TEXT,
|
|
16
|
+
occurred_at INTEGER,
|
|
17
|
+
source_updated_at INTEGER,
|
|
18
|
+
content_hash TEXT NOT NULL,
|
|
19
|
+
normalized_text TEXT,
|
|
20
|
+
payload_ref TEXT,
|
|
21
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
22
|
+
sensitivity TEXT NOT NULL DEFAULT 'normal',
|
|
23
|
+
retention_class TEXT NOT NULL DEFAULT 'bounded',
|
|
24
|
+
synthesis_status TEXT NOT NULL DEFAULT 'pending',
|
|
25
|
+
synthesis_pipeline TEXT NOT NULL DEFAULT 'user_understanding'
|
|
26
|
+
CHECK(synthesis_pipeline IN ('user_understanding', 'connected_knowledge')),
|
|
27
|
+
synthesis_attempts INTEGER NOT NULL DEFAULT 0,
|
|
28
|
+
synthesis_claimed_at INTEGER,
|
|
29
|
+
synthesis_claimed_by TEXT,
|
|
30
|
+
synthesis_error TEXT,
|
|
31
|
+
deleted_at INTEGER,
|
|
32
|
+
created_at INTEGER NOT NULL,
|
|
33
|
+
updated_at INTEGER NOT NULL,
|
|
34
|
+
UNIQUE(source_instance_id, collection_scope, external_id)
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
INSERT INTO knowledge_source_items_v65 (
|
|
38
|
+
item_id, source_instance_id, collection_scope, external_id, item_type, author_role,
|
|
39
|
+
occurred_at, source_updated_at, content_hash, normalized_text, payload_ref, metadata_json,
|
|
40
|
+
sensitivity, retention_class, synthesis_status, synthesis_pipeline, synthesis_attempts,
|
|
41
|
+
synthesis_claimed_at, synthesis_claimed_by, synthesis_error, deleted_at, created_at, updated_at
|
|
42
|
+
)
|
|
43
|
+
SELECT
|
|
44
|
+
item_id, source_instance_id, collection_scope, external_id, item_type, author_role,
|
|
45
|
+
occurred_at, source_updated_at, content_hash, normalized_text, payload_ref, metadata_json,
|
|
46
|
+
sensitivity, retention_class, synthesis_status, synthesis_pipeline, synthesis_attempts,
|
|
47
|
+
synthesis_claimed_at, synthesis_claimed_by, synthesis_error, deleted_at, created_at, updated_at
|
|
48
|
+
FROM knowledge_source_items;
|
|
49
|
+
|
|
50
|
+
DROP TABLE knowledge_source_items;
|
|
51
|
+
ALTER TABLE knowledge_source_items_v65 RENAME TO knowledge_source_items;
|
|
52
|
+
|
|
53
|
+
CREATE INDEX idx_knowledge_source_items_source_updated
|
|
54
|
+
ON knowledge_source_items(source_instance_id, updated_at DESC);
|
|
55
|
+
CREATE INDEX idx_knowledge_source_items_synthesis
|
|
56
|
+
ON knowledge_source_items(synthesis_status, updated_at);
|
|
57
|
+
CREATE INDEX idx_knowledge_source_items_hash
|
|
58
|
+
ON knowledge_source_items(content_hash);
|
|
59
|
+
CREATE INDEX idx_knowledge_source_items_synthesis_lease
|
|
60
|
+
ON knowledge_source_items(synthesis_pipeline, synthesis_status, synthesis_claimed_at, updated_at);
|
|
61
|
+
CREATE INDEX idx_knowledge_source_items_collection
|
|
62
|
+
ON knowledge_source_items(source_instance_id, collection_scope, updated_at DESC);
|
|
63
|
+
|
|
64
|
+
CREATE TABLE memory_evidence (
|
|
65
|
+
evidence_id TEXT PRIMARY KEY,
|
|
66
|
+
record_id TEXT NOT NULL,
|
|
67
|
+
source_item_id TEXT,
|
|
68
|
+
relation TEXT NOT NULL,
|
|
69
|
+
excerpt TEXT,
|
|
70
|
+
confidence REAL,
|
|
71
|
+
observed_at INTEGER,
|
|
72
|
+
created_at INTEGER NOT NULL,
|
|
73
|
+
FOREIGN KEY(record_id) REFERENCES memory_records(record_id) ON DELETE CASCADE,
|
|
74
|
+
FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE SET NULL
|
|
75
|
+
);
|
|
76
|
+
INSERT INTO memory_evidence SELECT * FROM memory_evidence_backup;
|
|
77
|
+
DROP TABLE memory_evidence_backup;
|
|
78
|
+
CREATE INDEX idx_memory_evidence_record ON memory_evidence(record_id, created_at DESC);
|
|
79
|
+
CREATE INDEX idx_memory_evidence_source_item ON memory_evidence(source_item_id);
|
|
80
|
+
CREATE UNIQUE INDEX idx_memory_evidence_record_source_relation
|
|
81
|
+
ON memory_evidence(record_id, source_item_id, relation)
|
|
82
|
+
WHERE source_item_id IS NOT NULL;
|
|
83
|
+
|
|
84
|
+
CREATE TABLE knowledge_source_changes (
|
|
85
|
+
sequence INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
86
|
+
change_id TEXT NOT NULL UNIQUE,
|
|
87
|
+
source_instance_id TEXT NOT NULL,
|
|
88
|
+
source_item_id TEXT NOT NULL,
|
|
89
|
+
change_kind TEXT NOT NULL CHECK(change_kind IN ('added', 'modified', 'deleted')),
|
|
90
|
+
old_hash TEXT,
|
|
91
|
+
new_hash TEXT,
|
|
92
|
+
changed_at INTEGER NOT NULL,
|
|
93
|
+
FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
|
|
94
|
+
);
|
|
95
|
+
INSERT INTO knowledge_source_changes SELECT * FROM knowledge_source_changes_backup;
|
|
96
|
+
DROP TABLE knowledge_source_changes_backup;
|
|
97
|
+
CREATE INDEX idx_knowledge_source_changes_source_sequence
|
|
98
|
+
ON knowledge_source_changes(source_instance_id, sequence);
|
|
99
|
+
CREATE INDEX idx_knowledge_source_changes_changed_at
|
|
100
|
+
ON knowledge_source_changes(changed_at DESC);
|
|
101
|
+
|
|
102
|
+
CREATE TABLE user_claim_evidence (
|
|
103
|
+
claim_id TEXT NOT NULL,
|
|
104
|
+
logical_event_key TEXT NOT NULL,
|
|
105
|
+
source_item_id TEXT NOT NULL,
|
|
106
|
+
source_instance_id TEXT NOT NULL,
|
|
107
|
+
relation TEXT NOT NULL CHECK(relation IN ('supports', 'contradicts')),
|
|
108
|
+
observed_at INTEGER NOT NULL,
|
|
109
|
+
created_at INTEGER NOT NULL,
|
|
110
|
+
PRIMARY KEY(claim_id, logical_event_key),
|
|
111
|
+
FOREIGN KEY(claim_id) REFERENCES user_claims(claim_id) ON DELETE CASCADE,
|
|
112
|
+
FOREIGN KEY(source_item_id) REFERENCES knowledge_source_items(item_id) ON DELETE CASCADE
|
|
113
|
+
);
|
|
114
|
+
INSERT INTO user_claim_evidence SELECT * FROM user_claim_evidence_backup;
|
|
115
|
+
DROP TABLE user_claim_evidence_backup;
|
|
116
|
+
CREATE INDEX idx_user_claim_evidence_source ON user_claim_evidence(source_item_id);
|