@xopcai/xopc 0.0.331 → 0.0.332

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 (169) 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/{agent-avatar-dicebear-B0BtF24E.js → agent-avatar-dicebear-C2wg3xC_.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-DgP5DEJF.js → agent-defaults-settings-panel-Se1Z72VG.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-plugin-dialog-DbvLXQO2.js → agent-plugin-dialog-BeNnu1Ts.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agents-Bh4XNLyk.js → agents-udIitwV8.js} +3 -3
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-fwzTRJfP.js → app-management-settings-panel-etFSkfzl.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-v_GGe8UZ.js → appearance-settings-DKmU2VAP.js} +1 -1
  9. package/dist/gateway/static/root/assets/{apps-page-C9ZMEuuA.js → apps-page-DVNySL58.js} +1 -1
  10. package/dist/gateway/static/root/assets/{archive-plugin-B6EgADeH.js → archive-plugin-D0z_Fr2G.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-B4H_IFeX.js → attachment-load-DNCDbeOX.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-UlVCvg4r.js → automations-page-B7_C-p66.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-workspace-BMgJvdcv.js +7 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-BxTSx30f.js → binary-plugins-BYn2hScX.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-CVzdrpjl.js → block-editor-ChWW8Z9L.js} +1 -1
  16. package/dist/gateway/static/root/assets/{browser-automations-page-CBVD8k6O.js → browser-automations-page-BV00BXRb.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-settings-page-CC43CC43.js → browser-settings-page-xwTmuZjS.js} +1 -1
  18. package/dist/gateway/static/root/assets/capabilities-CHA-sTAZ.js +1 -0
  19. package/dist/gateway/static/root/assets/{capabilities-page-BAT7Vvb8.js → capabilities-page-v0WkhV5o.js} +2 -2
  20. package/dist/gateway/static/root/assets/{capabilities-settings-panel-DPETQOfF.js → capabilities-settings-panel-DefBGjhV.js} +1 -1
  21. package/dist/gateway/static/root/assets/{capability-header-actions-EETjXmkG.js → capability-header-actions-vmx35sbu.js} +1 -1
  22. package/dist/gateway/static/root/assets/{channels-CwA619os.js → channels-Eo4ONF5X.js} +1 -1
  23. package/dist/gateway/static/root/assets/{chat-terminal-dock-DCqm9j9W.js → chat-terminal-dock-C41mXCAi.js} +1 -1
  24. package/dist/gateway/static/root/assets/{computer-settings-page-CxFWdovV.js → computer-settings-page-BJkqok2G.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connector-service-page-wxsEhmlU.js → connector-service-page-BKCZMmwm.js} +1 -1
  26. package/dist/gateway/static/root/assets/{connectors-page-l7goF6QS.js → connectors-page-DZYgogQw.js} +1 -1
  27. package/dist/gateway/static/root/assets/{date-picker-h_OS6uBR.js → date-picker-CrOV4Ynd.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dependency-picker-DNgSSH3z.js → dependency-picker-CqADAHZp.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-CflvPnB-.js → desktop-pet-Bab-iWED.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-CXy0X5Js.js → desktop-pet-settings-BqgzLOdi.js} +1 -1
  31. package/dist/gateway/static/root/assets/{device-pairing-wizard-BDMiJcsK.js → device-pairing-wizard-DFg7FDPf.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-BqkOh13m.js → directory-picker-path-field-hqJ9sFCR.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-VT4s-9pK.js → extension-debug-page-DX3PFhRE.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-CBSeGhGA.js → extension-page-DkREdHLs.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-DRB6uOo8.js → extension-settings-page-wF-HNTM-.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-lF-FpnZy.js → gateway-settings-Du-Dos9O.js} +1 -1
  37. package/dist/gateway/static/root/assets/{home-page-DSaXXoLm.js → home-page-D7YoMHq4.js} +1 -1
  38. package/dist/gateway/static/root/assets/{imports-page-DGkOijwE.js → imports-page-B80Cv043.js} +1 -1
  39. package/dist/gateway/static/root/assets/{index-D99vN3es.js → index-DalslRUx.js} +8 -8
  40. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-iU6c2zg1.js → keyboard-shortcuts-settings-BgoFaTwv.js} +1 -1
  41. package/dist/gateway/static/root/assets/{local-app-workbench-page-rH33N8I9.js → local-app-workbench-page-BKL5UZAj.js} +1 -1
  42. package/dist/gateway/static/root/assets/{local-apps-page-C0BWC8D2.js → local-apps-page-HO6OQlQT.js} +1 -1
  43. package/dist/gateway/static/root/assets/{logs-page-Dpoi-r-_.js → logs-page-CjzR9Rpj.js} +1 -1
  44. package/dist/gateway/static/root/assets/{management-settings-RFDLaquR.js → management-settings-Dk_gTJb9.js} +1 -1
  45. package/dist/gateway/static/root/assets/{media-plugins-C8E_F2F_.js → media-plugins-Dlj6TD3M.js} +1 -1
  46. package/dist/gateway/static/root/assets/{note-detail-panel-DI7CIjmM.js → note-detail-panel-BebJPjjk.js} +3 -3
  47. package/dist/gateway/static/root/assets/{notes-page-BkqnU-Jh.js → notes-page-CmS_hvz8.js} +1 -1
  48. package/dist/gateway/static/root/assets/{page-context-capture-button-qqWG_gs_.js → page-context-capture-button-BArPtqp5.js} +1 -1
  49. package/dist/gateway/static/root/assets/{page-tabs-b3lheKy4.js → page-tabs-vqI30Yrg.js} +1 -1
  50. package/dist/gateway/static/root/assets/{preview-open-alternatives-0Q4rTfGX.js → preview-open-alternatives-B-mwPBJW.js} +1 -1
  51. package/dist/gateway/static/root/assets/{product-open-page-jnJZCrKQ.js → product-open-page-D--sj_uN.js} +1 -1
  52. package/dist/gateway/static/root/assets/{project-detail-page-BvvcTH2F.js → project-detail-page-BFUdtWXF.js} +1 -1
  53. package/dist/gateway/static/root/assets/{projects-page-r96k_2wB.js → projects-page-DBsBwAQ6.js} +1 -1
  54. package/dist/gateway/static/root/assets/{remote-access-hub-B1d8pB_y.js → remote-access-hub-BurdDY0m.js} +1 -1
  55. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Do_iF13W.js → runtime-tools-settings-panel-CAnb0PNY.js} +1 -1
  56. package/dist/gateway/static/root/assets/{scenes-page-DK316w9a.js → scenes-page-Cj8xtr5t.js} +1 -1
  57. package/dist/gateway/static/root/assets/{schema-form-Cfft26Je.js → schema-form-BKj6wIMb.js} +1 -1
  58. package/dist/gateway/static/root/assets/{sessions-page-EIk8iJTK.js → sessions-page-BCsjgkCs.js} +1 -1
  59. package/dist/gateway/static/root/assets/settings-advanced-gate-BLL7csOJ.js +1 -0
  60. package/dist/gateway/static/root/assets/{settings-form-section-iI0MTyuU.js → settings-form-section-78ycUHfv.js} +1 -1
  61. package/dist/gateway/static/root/assets/{settings-page-C2Ka9oJm.js → settings-page-BOdxIVzo.js} +1 -1
  62. package/dist/gateway/static/root/assets/{setup-status-panel-nnmS_p5h.js → setup-status-panel-CbKHBjrU.js} +1 -1
  63. package/dist/gateway/static/root/assets/{share-preview-page-D0Knvtlp.js → share-preview-page-DyLfktib.js} +1 -1
  64. package/dist/gateway/static/root/assets/{shares-settings-BcaxGQLC.js → shares-settings-BzvSNouj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{skill-api-BuZKcy9b.js → skill-api-CiBGQ0Jg.js} +1 -1
  66. package/dist/gateway/static/root/assets/{skill-reload-api-Cb_CUL-U.js → skill-reload-api-BHnru0F5.js} +1 -1
  67. package/dist/gateway/static/root/assets/{skills-page-DcxWxIrR.js → skills-page-C35VKjhb.js} +1 -1
  68. package/dist/gateway/static/root/assets/{system-settings-panel-CMG0ZAsd.js → system-settings-panel-CyJUeREH.js} +1 -1
  69. package/dist/gateway/static/root/assets/{task-detail-page-Cvr1qUTW.js → task-detail-page-Bd1_Fguk.js} +1 -1
  70. package/dist/gateway/static/root/assets/{tunnel-api-DGYA6GyO.js → tunnel-api-Day9zhKi.js} +1 -1
  71. package/dist/gateway/static/root/assets/{use-autosave-CDemMoSX.js → use-autosave-Bj9hC6ML.js} +1 -1
  72. package/dist/gateway/static/root/assets/{user-model-page-VXfz3rE7.js → user-model-page-DuYzuR1T.js} +1 -1
  73. package/dist/gateway/static/root/assets/{voice-api-key-field-CXArY4t5.js → voice-api-key-field-fWRD6B8r.js} +1 -1
  74. package/dist/gateway/static/root/assets/{work-discovery-overlay-Dk5KsKOm.js → work-discovery-overlay-CnxdvIk8.js} +1 -1
  75. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DNpdaI-2.js → workflow-run-setup-panel-DlWNN1VA.js} +1 -1
  76. package/dist/gateway/static/root/assets/{workflows-page-DDNDLdId.js → workflows-page-B45YDiEw.js} +1 -1
  77. package/dist/gateway/static/root/index.html +2 -2
  78. package/dist/package.js +1 -1
  79. package/dist/packages/gateway-contract/src/automations.js +15 -0
  80. package/dist/src/agent/agent-manager.js +4 -4
  81. package/dist/src/agent/background-review/run-background-review.js +1 -1
  82. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  83. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  84. package/dist/src/agent/image/tool-model-config.js +1 -1
  85. package/dist/src/agent/orchestration/agent-orchestrator.js +0 -21
  86. package/dist/src/agent/service.js +2 -2
  87. package/dist/src/agent/tools/xopc-use-tool.js +1 -1
  88. package/dist/src/agent-catalog/capabilities.js +2 -2
  89. package/dist/src/auth/credentials.js +1 -1
  90. package/dist/src/auth/oauth-provider-lock.js +1 -1
  91. package/dist/src/auth/sync-provider-auth.js +1 -1
  92. package/dist/src/automations/capabilities/drafts.js +1 -1
  93. package/dist/src/automations/capabilities/write.d.ts +17 -0
  94. package/dist/src/automations/capabilities/write.js +26 -2
  95. package/dist/src/automations/domain/defaults.js +1 -1
  96. package/dist/src/automations/domain/index.js +2 -2
  97. package/dist/src/automations/domain/types.d.ts +22 -0
  98. package/dist/src/automations/domain/validation.d.ts +68 -0
  99. package/dist/src/automations/domain/validation.js +17 -1
  100. package/dist/src/automations/draft/automation-draft-validator.d.ts +9 -0
  101. package/dist/src/automations/draft/automation-draft-validator.js +1 -0
  102. package/dist/src/automations/index.js +2 -2
  103. package/dist/src/automations/service/action-executor.js +16 -0
  104. package/dist/src/automations/storage/automation-repository.js +4 -3
  105. package/dist/src/bootstrap/application-state.js +1 -1
  106. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  107. package/dist/src/capabilities/runtime/product.js +1 -1
  108. package/dist/src/chat-commands/agent-edit.js +1 -1
  109. package/dist/src/chat-commands/builtins/config.js +1 -1
  110. package/dist/src/cli/commands/agent.js +1 -1
  111. package/dist/src/cli/commands/agents.js +1 -1
  112. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  113. package/dist/src/cli/commands/models.js +1 -1
  114. package/dist/src/cli/commands/onboard/model.js +2 -2
  115. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  116. package/dist/src/config/index.js +4 -4
  117. package/dist/src/config/loader.js +2 -2
  118. package/dist/src/config/models-json.js +1 -1
  119. package/dist/src/config/schema.d.ts +4 -0
  120. package/dist/src/config/schema.js +5 -1
  121. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  122. package/dist/src/gateway/agents-admin.js +2 -2
  123. package/dist/src/gateway/file-path-classifier.js +1 -1
  124. package/dist/src/gateway/home-intelligence-automation-reconciler.d.ts +3 -0
  125. package/dist/src/gateway/home-intelligence-automation-reconciler.js +49 -0
  126. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  127. package/dist/src/gateway/hono/routes/config-patch/misc.js +18 -4
  128. package/dist/src/gateway/hono/routes/home.js +0 -1
  129. package/dist/src/gateway/hono/routes/notes.js +2 -2
  130. package/dist/src/gateway/hono/routes/projects.js +2 -2
  131. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  132. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  133. package/dist/src/gateway/hono/routes/update.js +6 -1
  134. package/dist/src/gateway/image-generation-setup.js +2 -2
  135. package/dist/src/gateway/lock.js +1 -1
  136. package/dist/src/gateway/memory-maintenance-automation-reconciler.js +17 -14
  137. package/dist/src/gateway/service.d.ts +1 -0
  138. package/dist/src/gateway/service.js +27 -5
  139. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  140. package/dist/src/home-intelligence/host.d.ts +1 -1
  141. package/dist/src/home-intelligence/host.js +1 -9
  142. package/dist/src/home-intelligence/notification.js +1 -1
  143. package/dist/src/home-intelligence/repository.d.ts +1 -1
  144. package/dist/src/infra/update-check.d.ts +8 -4
  145. package/dist/src/infra/update-check.js +43 -41
  146. package/dist/src/infra/update-startup.d.ts +7 -1
  147. package/dist/src/infra/update-startup.js +15 -6
  148. package/dist/src/local-apps/service.js +1 -1
  149. package/dist/src/memory-maintenance/index.js +2 -2
  150. package/dist/src/memory-maintenance/schedule.d.ts +0 -3
  151. package/dist/src/memory-maintenance/schedule.js +1 -8
  152. package/dist/src/providers/model-catalog-persistence.js +1 -1
  153. package/dist/src/storage/sqlite/migrations/208_automation_management.sql +2 -0
  154. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  155. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  156. package/dist/src/storage/sqlite/schema.js +1 -1
  157. package/dist/src/tasks/capabilities/read.js +2 -2
  158. package/dist/src/tasks/home-query-service.js +1 -0
  159. package/dist/src/tui/backends/embedded-backend.js +2 -2
  160. package/dist/src/tui/tui-commands.js +1 -1
  161. package/dist/src/tui/tui-startup-resources.js +1 -1
  162. package/dist/src/tui/tui.js +1 -1
  163. package/dist/src/user-context/config.d.ts +9 -0
  164. package/dist/src/user-context/config.js +13 -4
  165. package/dist/src/voice/realtime/persona-context.js +1 -1
  166. package/package.json +5 -5
  167. package/dist/gateway/static/root/assets/automations-workspace-C7VS-yb7.js +0 -7
  168. package/dist/gateway/static/root/assets/capabilities-sAZT4brT.js +0 -1
  169. package/dist/gateway/static/root/assets/settings-advanced-gate-DcOsdz78.js +0 -1
@@ -3,6 +3,7 @@ import { channelToNpmTag } from "./update-channels.js";
3
3
  import { dirname, join } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { access, readFile } from "node:fs/promises";
6
+ import { Agent, fetch } from "undici";
6
7
  //#region src/infra/update-check.ts
7
8
  init_package_version();
8
9
  const REGISTRY_BASE = "https://registry.npmjs.org";
@@ -17,32 +18,42 @@ const INITIAL_REGISTRY_RETRY_DELAY_MS = 500;
17
18
  async function fetchNpmTagVersion(params) {
18
19
  const timeoutMs = params.timeoutMs ?? REGISTRY_TIMEOUT_MS;
19
20
  const url = `${REGISTRY_BASE}/${encodeURIComponent(PACKAGE_NAME).replace("%40", "@")}/${encodeURIComponent(params.tag)}`;
21
+ const dispatcher = params.fetchImpl ? null : new Agent();
22
+ const fetchImpl = params.fetchImpl ?? ((input, init) => fetch(input, {
23
+ ...init,
24
+ dispatcher
25
+ }));
20
26
  let lastError;
21
- for (let attempt = 0; attempt <= MAX_REGISTRY_RETRIES; attempt++) {
22
- if (attempt > 0) {
23
- const delayMs = INITIAL_REGISTRY_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
24
- await new Promise((r) => setTimeout(r, delayMs));
25
- }
26
- try {
27
- const response = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });
28
- if (!response.ok) {
29
- lastError = `HTTP ${response.status}`;
30
- if (response.status >= 400 && response.status < 500) return {
27
+ try {
28
+ for (let attempt = 0; attempt <= MAX_REGISTRY_RETRIES; attempt++) {
29
+ if (attempt > 0) {
30
+ const delayMs = INITIAL_REGISTRY_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
31
+ await new Promise((r) => setTimeout(r, delayMs));
32
+ }
33
+ try {
34
+ const response = await fetchImpl(url, { signal: AbortSignal.timeout(timeoutMs) });
35
+ if (!response.ok) {
36
+ lastError = `HTTP ${response.status}`;
37
+ if (response.status >= 400 && response.status < 500) return {
38
+ tag: params.tag,
39
+ version: null,
40
+ error: lastError
41
+ };
42
+ continue;
43
+ }
44
+ const json = await response.json();
45
+ const version = typeof json?.version === "string" ? json.version : null;
46
+ return {
31
47
  tag: params.tag,
32
- version: null,
33
- error: lastError
48
+ version,
49
+ ...version ? {} : { error: "Registry response did not include a version" }
34
50
  };
35
- continue;
51
+ } catch (err) {
52
+ lastError = err instanceof Error ? err.message : String(err);
36
53
  }
37
- const json = await response.json();
38
- const version = typeof json?.version === "string" ? json.version : null;
39
- return {
40
- tag: params.tag,
41
- version
42
- };
43
- } catch (err) {
44
- lastError = String(err);
45
54
  }
55
+ } finally {
56
+ await dispatcher?.close().catch(() => void 0);
46
57
  }
47
58
  return {
48
59
  tag: params.tag,
@@ -58,33 +69,24 @@ async function resolveNpmChannelTag(params) {
58
69
  const channelTag = channelToNpmTag(params.channel);
59
70
  const channelResult = await fetchNpmTagVersion({
60
71
  tag: channelTag,
61
- timeoutMs: params.timeoutMs
72
+ timeoutMs: params.timeoutMs,
73
+ fetchImpl: params.fetchImpl
62
74
  });
63
- if (params.channel !== "beta") return {
64
- tag: channelTag,
65
- version: channelResult.version
66
- };
75
+ if (params.channel !== "beta") return channelResult;
67
76
  const latestResult = await fetchNpmTagVersion({
68
77
  tag: "latest",
69
- timeoutMs: params.timeoutMs
78
+ timeoutMs: params.timeoutMs,
79
+ fetchImpl: params.fetchImpl
70
80
  });
71
- if (!latestResult.version) return {
81
+ if (!latestResult.version) return channelResult.version ? channelResult : {
72
82
  tag: channelTag,
73
- version: channelResult.version
74
- };
75
- if (!channelResult.version) return {
76
- tag: "latest",
77
- version: latestResult.version
83
+ version: null,
84
+ error: [channelResult.error, latestResult.error].filter(Boolean).join("; ") || void 0
78
85
  };
86
+ if (!channelResult.version) return latestResult;
79
87
  const comparison = compareSemver(channelResult.version, latestResult.version);
80
- if (comparison !== null && comparison < 0) return {
81
- tag: "latest",
82
- version: latestResult.version
83
- };
84
- return {
85
- tag: channelTag,
86
- version: channelResult.version
87
- };
88
+ if (comparison !== null && comparison < 0) return latestResult;
89
+ return channelResult;
88
90
  }
89
91
  /**
90
92
  * Parse a version string into comparable numeric parts.
@@ -3,6 +3,12 @@ import { type UpdateAvailable } from './update-check.js';
3
3
  import type { InProcessRestartTrigger } from './update-restart.js';
4
4
  /** Get the cached update-available state (populated after startup check). */
5
5
  export declare function getUpdateAvailable(): UpdateAvailable | null;
6
+ export type GatewayUpdateCheckResult = {
7
+ ok: true;
8
+ } | {
9
+ ok: false;
10
+ error: string;
11
+ };
6
12
  /**
7
13
  * Main startup update check. Called once when the gateway starts (or on demand).
8
14
  */
@@ -12,7 +18,7 @@ export declare function runGatewayUpdateCheck(params: {
12
18
  triggerInProcessRestart?: InProcessRestartTrigger;
13
19
  /** When true, bypass checkOnStart/auto-disabled early exit and throttle (for POST /api/update/check). */
14
20
  force?: boolean;
15
- }): Promise<void>;
21
+ }): Promise<GatewayUpdateCheckResult>;
16
22
  /**
17
23
  * Schedule periodic update checks. Returns a cleanup function to stop the timer.
18
24
  */
@@ -65,7 +65,7 @@ async function runGatewayUpdateCheck(params) {
65
65
  const { config, force } = params;
66
66
  const autoEnabled = config.update?.auto?.enabled ?? false;
67
67
  const shouldCheckHints = config.update?.checkOnStart !== false;
68
- if (!force && !shouldCheckHints && !autoEnabled) return;
68
+ if (!force && !shouldCheckHints && !autoEnabled) return { ok: true };
69
69
  const statePath = resolveUpdateCheckStatePath();
70
70
  const state = await readState(statePath);
71
71
  const now = Date.now();
@@ -83,8 +83,10 @@ async function runGatewayUpdateCheck(params) {
83
83
  }
84
84
  }
85
85
  const checkIntervalMs = resolveCheckIntervalMs(config);
86
- const shouldBypassThrottleForVersion = state.lastCheckPackageVersion === void 0 || state.lastCheckPackageVersion !== PACKAGE_VERSION;
87
- if (!force && !shouldBypassThrottleForVersion && lastCheckedAt && Number.isFinite(lastCheckedAt) && now - lastCheckedAt < checkIntervalMs) return;
86
+ const staleAvailableComparison = compareSemver(PACKAGE_VERSION, state.lastAvailableVersion ?? null);
87
+ const hasStaleAvailableVersion = staleAvailableComparison !== null && staleAvailableComparison >= 0;
88
+ const shouldBypassThrottleForVersion = state.lastCheckPackageVersion === void 0 || state.lastCheckPackageVersion !== PACKAGE_VERSION || hasStaleAvailableVersion;
89
+ if (!force && !shouldBypassThrottleForVersion && lastCheckedAt && Number.isFinite(lastCheckedAt) && now - lastCheckedAt < checkIntervalMs) return { ok: true };
88
90
  const root = await resolvePackageRoot();
89
91
  let installKind = "unknown";
90
92
  if (root) {
@@ -101,9 +103,15 @@ async function runGatewayUpdateCheck(params) {
101
103
  lastCheckedAt: new Date(now).toISOString()
102
104
  };
103
105
  if (!resolved.version) {
104
- nextState.lastCheckPackageVersion = PACKAGE_VERSION;
105
- await writeState(statePath, nextState);
106
- return;
106
+ const error = resolved.error ?? `npm tag ${resolved.tag} did not return a version`;
107
+ log.warn({
108
+ tag: resolved.tag,
109
+ errorMessage: error
110
+ }, `Update check failed: ${error}`);
111
+ return {
112
+ ok: false,
113
+ error
114
+ };
107
115
  }
108
116
  const comparison = compareSemver(PACKAGE_VERSION, resolved.version);
109
117
  if (comparison !== null && comparison < 0) {
@@ -147,6 +155,7 @@ async function runGatewayUpdateCheck(params) {
147
155
  }
148
156
  nextState.lastCheckPackageVersion = PACKAGE_VERSION;
149
157
  await writeState(statePath, nextState);
158
+ return { ok: true };
150
159
  }
151
160
  async function handleAutoUpdate(params) {
152
161
  const { channel, version, tag, state, nextState, now, root, config } = params;
@@ -5,10 +5,10 @@ import { currentOperationId, init_operation_context } from "../infra/operation-c
5
5
  import { afterSqliteCommit, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
6
6
  import { ExtensionCapabilityBindingsSchema, extensionCapabilityPermissions } from "../../packages/gateway-contract/src/extension-capabilities.js";
7
7
  import { init_src } from "../../packages/gateway-contract/src/index.js";
8
- import { CapabilityError } from "../capabilities/runtime/errors.js";
9
8
  import { init_paths, resolveExtensionsDir } from "../config/paths.js";
10
9
  import { LocalAppStore } from "./store.js";
11
10
  import { slugifyProjectName } from "../projects/project-store.js";
11
+ import { CapabilityError } from "../capabilities/runtime/errors.js";
12
12
  import { DomainOutboxDispatcher } from "../infra/domain-outbox-dispatcher.js";
13
13
  import { validateLocalAppCapabilityContracts } from "./capabilities/contracts.js";
14
14
  import { buildLocalAppFixGuidance } from "./fix-guidance.js";
@@ -1,3 +1,3 @@
1
- import { MEMORY_MAINTENANCE_TOKEN, maintenanceInstruction, parseMaintenanceInstruction, resolveMemoryMaintenanceSchedules } from "./schedule.js";
1
+ import { resolveMemoryMaintenanceSchedules } from "./schedule.js";
2
2
  import { listMemoryMaintenanceRuns, runMemoryMaintenance } from "./service.js";
3
- export { MEMORY_MAINTENANCE_TOKEN, listMemoryMaintenanceRuns, maintenanceInstruction, parseMaintenanceInstruction, resolveMemoryMaintenanceSchedules, runMemoryMaintenance };
3
+ export { listMemoryMaintenanceRuns, resolveMemoryMaintenanceSchedules, runMemoryMaintenance };
@@ -1,6 +1,5 @@
1
1
  import type { Config } from '../config/schema.js';
2
2
  import type { MemoryMaintenanceJob } from './service.js';
3
- export declare const MEMORY_MAINTENANCE_TOKEN = "__xopc_memory_maintenance__";
4
3
  export interface MemoryMaintenanceSchedule {
5
4
  jobType: Exclude<MemoryMaintenanceJob, 'manual_repair'>;
6
5
  automationId: string;
@@ -9,5 +8,3 @@ export interface MemoryMaintenanceSchedule {
9
8
  timezone: string;
10
9
  }
11
10
  export declare function resolveMemoryMaintenanceSchedules(config: Config): MemoryMaintenanceSchedule[];
12
- export declare function maintenanceInstruction(jobType: MemoryMaintenanceSchedule['jobType']): string;
13
- export declare function parseMaintenanceInstruction(value: string): MemoryMaintenanceSchedule['jobType'] | undefined;
@@ -1,5 +1,4 @@
1
1
  //#region src/memory-maintenance/schedule.ts
2
- const MEMORY_MAINTENANCE_TOKEN = "__xopc_memory_maintenance__";
3
2
  const WEEKDAY = {
4
3
  sun: 0,
5
4
  mon: 1,
@@ -41,11 +40,5 @@ function resolveMemoryMaintenanceSchedules(config) {
41
40
  }
42
41
  ];
43
42
  }
44
- function maintenanceInstruction(jobType) {
45
- return `${MEMORY_MAINTENANCE_TOKEN}:${jobType}`;
46
- }
47
- function parseMaintenanceInstruction(value) {
48
- return new RegExp(`${MEMORY_MAINTENANCE_TOKEN}:(temporal_sweep|daily_reconciliation|weekly_knowledge)`).exec(value)?.[1];
49
- }
50
43
  //#endregion
51
- export { MEMORY_MAINTENANCE_TOKEN, maintenanceInstruction, parseMaintenanceInstruction, resolveMemoryMaintenanceSchedules };
44
+ export { resolveMemoryMaintenanceSchedules };
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { init_paths_state, resolveXopcCloudCatalogCachePath } from "../config/paths-state.js";
3
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
3
  import { ComputerProfileSchema, init_src } from "../../packages/computer-control-contract/src/index.js";
4
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
5
5
  import { voiceManifestSchema } from "../../packages/realtime-protocol/src/voice-catalog.js";
6
6
  import { init_voice } from "../../packages/realtime-protocol/src/voice.js";
7
7
  import { readFileSync, rmSync } from "node:fs";
@@ -0,0 +1,2 @@
1
+ ALTER TABLE automations ADD COLUMN management_json TEXT
2
+ CHECK(management_json IS NULL OR json_valid(management_json));
@@ -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 = 165;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 207;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 208;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -57,7 +57,7 @@ function applySingleMigration(db, migration, discardOldScenes = false) {
57
57
  */
58
58
  function applyPendingMigrations(db, options = {}) {
59
59
  db.function("xopc_operation_id", () => currentOperationId() ?? null);
60
- const targetVersion = options.targetVersion ?? 207;
60
+ const targetVersion = options.targetVersion ?? 208;
61
61
  let currentVersion = readSchemaVersion(db);
62
62
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
63
63
  if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
@@ -95,7 +95,7 @@ function applyPendingMigrations(db, options = {}) {
95
95
  }
96
96
  /** Inspect schema version without mutating the database. */
97
97
  function inspectSchemaMigrationStatus(db, options = {}) {
98
- const appVersion = options.targetVersion ?? 207;
98
+ const appVersion = options.targetVersion ?? 208;
99
99
  const dbVersion = readSchemaVersion(db);
100
100
  if (dbVersion > appVersion) return {
101
101
  dbVersion,
@@ -137,7 +137,7 @@ var init_runner = __esmMin((() => {
137
137
  init_errors();
138
138
  log = createLogger("Sqlite:Migrations");
139
139
  XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
140
- XOPC_DB_SCHEMA_VERSION = 207;
140
+ XOPC_DB_SCHEMA_VERSION = 208;
141
141
  }));
142
142
  //#endregion
143
143
  init_runner();
@@ -28,7 +28,7 @@ function ensureXopcDatabaseSchema(db, options = {}) {
28
28
  currentVersion = 165;
29
29
  }
30
30
  applyPendingMigrations(db, {
31
- targetVersion: 207,
31
+ targetVersion: 208,
32
32
  databasePath: fresh ? void 0 : options.databasePath
33
33
  });
34
34
  }
@@ -2,10 +2,10 @@ import { ProductReadContracts } from "../../../packages/gateway-contract/src/cap
2
2
  import { init_src } from "../../../packages/gateway-contract/src/index.js";
3
3
  import { TaskRepository, init_task_repository } from "../task-repository.js";
4
4
  import { TaskRunRepository, init_task_run_repository } from "../task-run-repository.js";
5
- import { CapabilityError } from "../../capabilities/runtime/errors.js";
6
- import { defineReadCapability } from "../../capabilities/runtime/dispatcher.js";
7
5
  import { TaskConversationRepository } from "../task-conversation-repository.js";
8
6
  import { TaskReadModelProjector } from "../task-read-model-projector.js";
7
+ import { CapabilityError } from "../../capabilities/runtime/errors.js";
8
+ import { defineReadCapability } from "../../capabilities/runtime/dispatcher.js";
9
9
  import { TaskContextRepository } from "../task-context-repository.js";
10
10
  import { TaskDependencyService } from "../task-dependency-service.js";
11
11
  import { TaskValueMetricsService } from "../task-value-metrics-service.js";
@@ -37,6 +37,7 @@ function actionLabel(automation) {
37
37
  if (automation.action.kind === "workflow") return `workflow:${automation.action.workflowId}`;
38
38
  if (automation.action.kind === "browser_automation") return `browser-automation:${automation.action.automationId}`;
39
39
  if (automation.action.kind === "task_command") return `task:${automation.action.command.type}`;
40
+ if (automation.action.kind === "system") return `system:${automation.action.capability}`;
40
41
  return automation.action.agentId ? `agent:${automation.action.agentId}` : "agent";
41
42
  }
42
43
  function toHomeAutomation(automation) {
@@ -5,9 +5,8 @@ import { appendComposerInputHistory, listComposerInputHistory } from "../../stor
5
5
  import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
6
6
  import { init_sqlite } from "../../storage/sqlite/index.js";
7
7
  import { normalizeAgentId } from "../../agent-catalog/id.js";
8
- import { init_agent_scope, listAgentEntries } from "../../agent/agent-scope.js";
9
- import { AgentCatalogService } from "../../agent-catalog/service.js";
10
8
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
9
+ import { init_agent_scope, listAgentEntries } from "../../agent/agent-scope.js";
11
10
  import { createConversation, init_conversation_repository } from "../../storage/sqlite/conversation-repository.js";
12
11
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../../routing/agent-session-key.js";
13
12
  import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
@@ -18,6 +17,7 @@ import { buildSessionTimeline } from "../../session/transcript-outline.js";
18
17
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
19
18
  import { createCreateShareTool, isShareToolAvailable } from "../../agent/tools/create-share-tool.js";
20
19
  import { evictEmbeddedSessionRunner } from "../../agent/embedded/session-runner.js";
20
+ import { AgentCatalogService } from "../../agent-catalog/service.js";
21
21
  import { SessionIndex } from "../../session/manager.js";
22
22
  import "../../session/index.js";
23
23
  import { parseModelRef } from "../../agent/models/selection.js";
@@ -2,8 +2,8 @@ import { closeXopcDatabase, isXopcDatabaseOpen, openXopcDatabase } from "../stor
2
2
  import { TaskRepository } from "../tasks/task-repository.js";
3
3
  import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js";
4
4
  import { init_sqlite } from "../storage/sqlite/index.js";
5
- import { resolveConfigPath } from "../config/paths.js";
6
5
  import { init_agent_session_key, isValidAgentId, normalizeAgentId } from "../routing/agent-session-key.js";
6
+ import { resolveConfigPath } from "../config/paths.js";
7
7
  import { init_providers, providerSupportsOAuth } from "../providers/index.js";
8
8
  import { ProjectService } from "../projects/project-service.js";
9
9
  import { isValidProjectAgentId, normalizeProjectAgentId } from "../projects/project-agent.js";
@@ -1,6 +1,6 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
- import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
3
2
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
3
+ import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
4
4
  import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
5
5
  import { listConnectorInstances } from "../connectors/instances.js";
6
6
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
@@ -1,8 +1,8 @@
1
1
  import { version } from "../../package.js";
2
2
  import { resolveStateDir, resolveXopcDatabasePath } from "../config/paths-state.js";
3
- import { init_paths } from "../config/paths.js";
4
3
  import { init_agent_session_key, normalizeAgentId } from "../routing/agent-session-key.js";
5
4
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
5
+ import { init_paths } from "../config/paths.js";
6
6
  import { getAllModels, getAllProviders, getApiKey, init_providers, isProviderConfiguredSync } from "../providers/index.js";
7
7
  import { isTerminalWorkflowRunStatus } from "../workflows/domain/run.js";
8
8
  import "../workflows/domain/index.js";
@@ -145,6 +145,10 @@ export declare const ContextPlanningConfigSchema: z.ZodDefault<z.ZodObject<{
145
145
  postCompactionSections: z.ZodDefault<z.ZodArray<z.ZodString>>;
146
146
  }, z.core.$strict>>;
147
147
  }, z.core.$strict>>;
148
+ export declare const HomeIntelligenceConfigSchema: z.ZodDefault<z.ZodObject<{
149
+ enabled: z.ZodDefault<z.ZodBoolean>;
150
+ refreshOnContextChange: z.ZodDefault<z.ZodBoolean>;
151
+ }, z.core.$strict>>;
148
152
  export declare const UserContextConfigSchema: z.ZodDefault<z.ZodObject<{
149
153
  enabled: z.ZodDefault<z.ZodBoolean>;
150
154
  preferences: z.ZodDefault<z.ZodObject<{
@@ -259,9 +263,14 @@ export declare const UserContextConfigSchema: z.ZodDefault<z.ZodObject<{
259
263
  postCompactionSections: z.ZodDefault<z.ZodArray<z.ZodString>>;
260
264
  }, z.core.$strict>>;
261
265
  }, z.core.$strict>>;
266
+ homeIntelligence: z.ZodDefault<z.ZodObject<{
267
+ enabled: z.ZodDefault<z.ZodBoolean>;
268
+ refreshOnContextChange: z.ZodDefault<z.ZodBoolean>;
269
+ }, z.core.$strict>>;
262
270
  }, z.core.$strict>>;
263
271
  export type UserContextConfig = z.infer<typeof UserContextConfigSchema>;
264
272
  export type UserModelConfig = z.infer<typeof UserModelConfigSchema>;
265
273
  export type KnowledgeMemoryConfig = z.infer<typeof KnowledgeMemoryConfigSchema>;
266
274
  export type ContextPlanningConfig = z.infer<typeof ContextPlanningConfigSchema>;
275
+ export type HomeIntelligenceConfig = z.infer<typeof HomeIntelligenceConfigSchema>;
267
276
  export declare function resolveKnowledgeReadPolicy(config: KnowledgeMemoryConfig): KnowledgeReadPolicy;
@@ -16,7 +16,7 @@ function resolveKnowledgeReadPolicy(config) {
16
16
  contentSources: config.contentSources
17
17
  };
18
18
  }
19
- var DEFAULT_CONTEXT_COMPACTION_POLICY, ContextCompactionPolicySchema, WritePolicySchema, MaintenanceTimeSchema, UserModelConfigSchema, KnowledgeMemoryConfigSchema, ContextPlanningConfigSchema, UserContextConfigSchema;
19
+ var DEFAULT_CONTEXT_COMPACTION_POLICY, ContextCompactionPolicySchema, WritePolicySchema, MaintenanceTimeSchema, UserModelConfigSchema, KnowledgeMemoryConfigSchema, ContextPlanningConfigSchema, HomeIntelligenceConfigSchema, UserContextConfigSchema;
20
20
  var init_config = __esmMin((() => {
21
21
  init_response_language();
22
22
  DEFAULT_CONTEXT_COMPACTION_POLICY = {
@@ -193,20 +193,29 @@ var init_config = __esmMin((() => {
193
193
  maxChars: 6e3,
194
194
  compaction: DEFAULT_CONTEXT_COMPACTION_POLICY
195
195
  });
196
+ HomeIntelligenceConfigSchema = z.object({
197
+ enabled: z.boolean().default(true),
198
+ refreshOnContextChange: z.boolean().default(true)
199
+ }).strict().default({
200
+ enabled: true,
201
+ refreshOnContextChange: true
202
+ });
196
203
  UserContextConfigSchema = z.object({
197
204
  enabled: z.boolean().default(true),
198
205
  preferences: z.object({ responseLanguage: ResponseLanguageSchema.default("auto") }).strict().default({ responseLanguage: "auto" }),
199
206
  userModel: UserModelConfigSchema,
200
207
  knowledgeMemory: KnowledgeMemoryConfigSchema,
201
- contextPlanning: ContextPlanningConfigSchema
208
+ contextPlanning: ContextPlanningConfigSchema,
209
+ homeIntelligence: HomeIntelligenceConfigSchema
202
210
  }).strict().default({
203
211
  enabled: true,
204
212
  preferences: { responseLanguage: "auto" },
205
213
  userModel: UserModelConfigSchema.parse({}),
206
214
  knowledgeMemory: KnowledgeMemoryConfigSchema.parse({}),
207
- contextPlanning: ContextPlanningConfigSchema.parse({})
215
+ contextPlanning: ContextPlanningConfigSchema.parse({}),
216
+ homeIntelligence: HomeIntelligenceConfigSchema.parse({})
208
217
  });
209
218
  }));
210
219
  //#endregion
211
220
  init_config();
212
- export { ContextCompactionPolicySchema, ContextPlanningConfigSchema, DEFAULT_CONTEXT_COMPACTION_POLICY, KnowledgeMemoryConfigSchema, UserContextConfigSchema, UserModelConfigSchema, init_config, resolveKnowledgeReadPolicy };
221
+ export { ContextCompactionPolicySchema, ContextPlanningConfigSchema, DEFAULT_CONTEXT_COMPACTION_POLICY, HomeIntelligenceConfigSchema, KnowledgeMemoryConfigSchema, UserContextConfigSchema, UserModelConfigSchema, init_config, resolveKnowledgeReadPolicy };
@@ -1,6 +1,6 @@
1
1
  import { init_agent_scope, resolveAgentProfileDir } from "../../agent/agent-scope.js";
2
- import { DEFAULT_IDENTITY_FILENAME, DEFAULT_SOUL_FILENAME } from "../../agent/context/workspace.js";
3
2
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
3
+ import { DEFAULT_IDENTITY_FILENAME, DEFAULT_SOUL_FILENAME } from "../../agent/context/workspace.js";
4
4
  import { loadProfileBootstrapFiles } from "../../agent/bootstrap/load-bootstrap-files.js";
5
5
  import { join } from "node:path";
6
6
  import { statSync } from "node:fs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.331",
3
+ "version": "0.0.332",
4
4
  "description": "Local-first personal AI for the one-person company, with durable context, tasks, workflows, automations, and local or cloud models.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -159,12 +159,12 @@
159
159
  "vitest": "4.1.5",
160
160
  "vue": "^3.5.35",
161
161
  "@xopcai/browser-control-contract": "0.1.0",
162
- "@xopcai/endpoint-tools-protocol": "0.0.0",
163
- "@xopcai/endpoint-tools-client": "0.0.0",
164
162
  "@xopcai/computer-control-contract": "0.1.0",
163
+ "@xopcai/endpoint-tools-client": "0.0.0",
164
+ "@xopcai/endpoint-tools-protocol": "0.0.0",
165
165
  "@xopcai/gateway-contract": "0.0.0",
166
- "@xopcai/realtime-protocol": "0.0.0",
167
- "@xopcai/realtime-client": "0.0.0"
166
+ "@xopcai/realtime-client": "0.0.0",
167
+ "@xopcai/realtime-protocol": "0.0.0"
168
168
  },
169
169
  "scripts": {
170
170
  "assets:brand": "node scripts/generate-brand-assets.mjs",