@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,8 +3,8 @@ import { init_paths, resolveOAuthPath } from "../config/paths.js";
3
3
  import { AsyncLocalStorage } from "node:async_hooks";
4
4
  import { dirname } from "node:path";
5
5
  import { randomUUID } from "node:crypto";
6
- import { mkdir, open, readFile, rm, stat } from "node:fs/promises";
7
6
  import { setTimeout } from "node:timers/promises";
7
+ import { mkdir, open, readFile, rm, stat } from "node:fs/promises";
8
8
  //#region src/auth/oauth-provider-lock.ts
9
9
  function lockPath(providerId) {
10
10
  return `${resolveOAuthPath(providerId.toLowerCase())}.lock`;
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
3
2
  import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
3
+ import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
4
4
  import { init_registry, isOAuthOnlyProvider } from "./oauth/registry.js";
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  //#region src/auth/sync-provider-auth.ts
@@ -3,10 +3,10 @@ import { init_src } from "../../../packages/gateway-contract/src/index.js";
3
3
  import { init_trust_policy, resolveAutomationSafetyForTrust } from "../../user-context/trust-policy.js";
4
4
  import { getUserTrustPolicy } from "../../storage/sqlite/user-trust-repository.js";
5
5
  import { init_sqlite } from "../../storage/sqlite/index.js";
6
+ import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope.js";
6
7
  import { CapabilityError } from "../../capabilities/runtime/errors.js";
7
8
  import { ExternalEffectNotAppliedError } from "../../capabilities/runtime/external-operations.js";
8
9
  import { defineExternalCapability, defineReadCapability } from "../../capabilities/runtime/dispatcher.js";
9
- import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope.js";
10
10
  import { AutomationCreateCapabilityInputSchema } from "./write.js";
11
11
  import { simulateAutomation } from "../draft/automation-draft-validator.js";
12
12
  import { AutomationDraftService } from "../draft/automation-draft-service.js";
@@ -121,6 +121,14 @@ export declare const AutomationCreateCapabilityInputSchema: z.ZodObject<{
121
121
  outputDestinations: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
122
122
  }, z.core.$strip>;
123
123
  }, z.core.$strip>], "type">;
124
+ }, z.core.$strict>, z.ZodObject<{
125
+ kind: z.ZodLiteral<"system">;
126
+ capability: z.ZodEnum<{
127
+ "home.advisor.refresh": "home.advisor.refresh";
128
+ "memory.temporal_sweep": "memory.temporal_sweep";
129
+ "memory.daily_reconciliation": "memory.daily_reconciliation";
130
+ "memory.weekly_knowledge": "memory.weekly_knowledge";
131
+ }>;
124
132
  }, z.core.$strict>], "kind">;
125
133
  id: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string>>;
126
134
  trigger: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -293,6 +301,14 @@ export declare const AutomationUpdatePatchSchema: z.ZodObject<{
293
301
  outputDestinations: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
294
302
  }, z.core.$strip>;
295
303
  }, z.core.$strip>], "type">;
304
+ }, z.core.$strict>, z.ZodObject<{
305
+ kind: z.ZodLiteral<"system">;
306
+ capability: z.ZodEnum<{
307
+ "home.advisor.refresh": "home.advisor.refresh";
308
+ "memory.temporal_sweep": "memory.temporal_sweep";
309
+ "memory.daily_reconciliation": "memory.daily_reconciliation";
310
+ "memory.weekly_knowledge": "memory.weekly_knowledge";
311
+ }>;
296
312
  }, z.core.$strict>], "kind">>;
297
313
  trigger: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
298
314
  kind: z.ZodLiteral<"manual">;
@@ -345,5 +361,6 @@ export declare const AutomationUpdatePatchSchema: z.ZodObject<{
345
361
  none: "none";
346
362
  }>>;
347
363
  state: z.ZodOptional<z.ZodNever>;
364
+ management: z.ZodOptional<z.ZodNever>;
348
365
  }, z.core.$strict>;
349
366
  export declare function registerAutomationWriteCapabilities(dispatcher: CapabilityDispatcher, service: AutomationService, projects?: ProjectService): void;
@@ -10,8 +10,28 @@ import { AutomationAlreadyExistsError, AutomationAlreadyRunningError } from "../
10
10
  import { z } from "zod";
11
11
  //#region src/automations/capabilities/write.ts
12
12
  init_src();
13
- const AutomationCreateCapabilityInputSchema = CreateAutomationSchema.omit({ state: true });
14
- const AutomationUpdatePatchSchema = UpdateAutomationSchema.safeExtend({ state: z.never().optional() });
13
+ const AutomationCreateCapabilityInputSchema = CreateAutomationSchema.omit({
14
+ state: true,
15
+ management: true
16
+ }).refine((input) => input.action.kind !== "system", { message: "System actions can only be created by the runtime" });
17
+ const AutomationUpdatePatchSchema = UpdateAutomationSchema.safeExtend({
18
+ state: z.never().optional(),
19
+ management: z.never().optional()
20
+ });
21
+ function assertManagedOperation(automation, operation, patch) {
22
+ const management = automation.management;
23
+ if (!management) return;
24
+ if (operation === "run") {
25
+ if (!management.runnable) throw new CapabilityError("FORBIDDEN", "This managed automation cannot be run manually");
26
+ return;
27
+ }
28
+ if (operation === "delete") {
29
+ if (!management.deletable) throw new CapabilityError("FORBIDDEN", "This managed automation cannot be deleted");
30
+ return;
31
+ }
32
+ const forbidden = Object.entries(patch ?? {}).filter(([key, value]) => JSON.stringify(automation[key]) !== JSON.stringify(value)).map(([key]) => key).filter((field) => !management.editable.includes(field));
33
+ if (forbidden.length > 0) throw new CapabilityError("FORBIDDEN", `Managed fields cannot be changed: ${forbidden.join(", ")}`);
34
+ }
15
35
  function registerAutomationWriteCapabilities(dispatcher, service, projects) {
16
36
  const policy = {
17
37
  majorVersion: 1,
@@ -75,6 +95,7 @@ function registerAutomationWriteCapabilities(dispatcher, service, projects) {
75
95
  const automationId = command === "run" ? id : getAutomationRun(id)?.automationId;
76
96
  const automation = automationId ? getAutomation(automationId) : null;
77
97
  if (!automation) throw new CapabilityError("NOT_FOUND", "Automation or source run not found");
98
+ assertManagedOperation(automation, "run");
78
99
  try {
79
100
  const run = command === "run" ? service.queueRunAtomically(id) : service.queueRerunAtomically(id);
80
101
  return {
@@ -98,6 +119,7 @@ function registerAutomationWriteCapabilities(dispatcher, service, projects) {
98
119
  execute({ id, expectedRevision }) {
99
120
  const current = getAutomation(id);
100
121
  if (current && current.updatedAtMs !== expectedRevision) throw new CapabilityError("REVISION_CONFLICT", "Automation changed");
122
+ if (current) assertManagedOperation(current, "delete");
101
123
  const result = service.removeAtomically(id);
102
124
  return {
103
125
  ok: true,
@@ -138,6 +160,7 @@ function registerAutomationWriteCapabilities(dispatcher, service, projects) {
138
160
  const current = getAutomation(id);
139
161
  if (!current) throw new CapabilityError("NOT_FOUND", "Automation not found");
140
162
  if (current.updatedAtMs !== expectedRevision) throw new CapabilityError("REVISION_CONFLICT", "Automation changed");
163
+ assertManagedOperation(current, "update", patch);
141
164
  requireProject(patch.projectId);
142
165
  return {
143
166
  ok: true,
@@ -158,6 +181,7 @@ function registerAutomationWriteCapabilities(dispatcher, service, projects) {
158
181
  const current = getAutomation(id);
159
182
  if (!current) throw new CapabilityError("NOT_FOUND", "Automation not found");
160
183
  if (current.updatedAtMs !== expectedRevision) throw new CapabilityError("REVISION_CONFLICT", "Automation changed");
184
+ assertManagedOperation(current, "update", { enabled });
161
185
  const automation = service.updateAtomically(id, { enabled });
162
186
  if (!automation) throw new CapabilityError("NOT_FOUND", "Automation not found");
163
187
  return {
@@ -2,7 +2,7 @@
2
2
  const DEFAULT_AUTOMATION_TIMEOUT_SECONDS = 1800;
3
3
  const DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS = 600;
4
4
  function defaultAutomationTimeoutSeconds(action) {
5
- return action.kind === "browser_automation" ? 600 : DEFAULT_AUTOMATION_TIMEOUT_SECONDS;
5
+ return action.kind === "system" ? 60 : action.kind === "browser_automation" ? 600 : DEFAULT_AUTOMATION_TIMEOUT_SECONDS;
6
6
  }
7
7
  function resolveAutomationTimeoutSeconds(action, reliability) {
8
8
  return reliability?.executionTimeoutSeconds ?? ("timeoutSeconds" in action ? action.timeoutSeconds : void 0) ?? reliability?.timeoutSeconds ?? defaultAutomationTimeoutSeconds(action);
@@ -1,4 +1,4 @@
1
- import { AutomationActionSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, UpdateAutomationSchema } from "./validation.js";
1
+ import { AutomationActionSchema, AutomationManagementSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, UpdateAutomationSchema } from "./validation.js";
2
2
  import { computeNextAutomationRunAtMs, computeNextScheduleRunAtMs, timerDelayUntil } from "./schedule.js";
3
3
  import { DEFAULT_AUTOMATION_TIMEOUT_SECONDS, DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS, defaultAutomationTimeoutSeconds, resolveAutomationTimeoutSeconds } from "./defaults.js";
4
- export { AutomationActionSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, DEFAULT_AUTOMATION_TIMEOUT_SECONDS, DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS, UpdateAutomationSchema, computeNextAutomationRunAtMs, computeNextScheduleRunAtMs, defaultAutomationTimeoutSeconds, resolveAutomationTimeoutSeconds, timerDelayUntil };
4
+ export { AutomationActionSchema, AutomationManagementSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, DEFAULT_AUTOMATION_TIMEOUT_SECONDS, DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS, UpdateAutomationSchema, computeNextAutomationRunAtMs, computeNextScheduleRunAtMs, defaultAutomationTimeoutSeconds, resolveAutomationTimeoutSeconds, timerDelayUntil };
@@ -54,7 +54,17 @@ export type AutomationAction = {
54
54
  kind: 'task_command';
55
55
  taskId: string;
56
56
  command: TaskCommand;
57
+ } | {
58
+ kind: 'system';
59
+ capability: 'home.advisor.refresh' | 'memory.temporal_sweep' | 'memory.daily_reconciliation' | 'memory.weekly_knowledge';
57
60
  };
61
+ export type AutomationEditableField = 'enabled' | 'trigger';
62
+ export interface AutomationManagement {
63
+ owner: string;
64
+ editable: AutomationEditableField[];
65
+ runnable: boolean;
66
+ deletable: boolean;
67
+ }
58
68
  export type AutomationConversationMode = 'new_session' | 'continuous';
59
69
  export type AutomationNotificationPolicy = 'attention' | 'all' | 'none';
60
70
  export interface AutomationReliability {
@@ -97,6 +107,7 @@ export interface Automation {
97
107
  notificationPolicy: AutomationNotificationPolicy;
98
108
  completionWebhookUrl?: string;
99
109
  reliability?: AutomationReliability;
110
+ management?: AutomationManagement;
100
111
  state: AutomationState;
101
112
  createdAtMs: number;
102
113
  updatedAtMs: number;
@@ -210,6 +221,17 @@ export interface AutomationDeps {
210
221
  reason?: string;
211
222
  runId?: string;
212
223
  };
224
+ executeSystemAction?: (input: {
225
+ capability: Extract<AutomationAction, {
226
+ kind: 'system';
227
+ }>['capability'];
228
+ automationId: string;
229
+ runId: string;
230
+ }) => Promise<{
231
+ summary?: string;
232
+ }> | {
233
+ summary?: string;
234
+ };
213
235
  }
214
236
  export interface AutomationActionTask {
215
237
  status: 'succeeded' | 'failed' | 'timeout' | 'cancelled';
@@ -151,7 +151,24 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
151
151
  outputDestinations: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
152
152
  }, z.core.$strip>;
153
153
  }, z.core.$strip>], "type">;
154
+ }, z.core.$strict>, z.ZodObject<{
155
+ kind: z.ZodLiteral<"system">;
156
+ capability: z.ZodEnum<{
157
+ "home.advisor.refresh": "home.advisor.refresh";
158
+ "memory.temporal_sweep": "memory.temporal_sweep";
159
+ "memory.daily_reconciliation": "memory.daily_reconciliation";
160
+ "memory.weekly_knowledge": "memory.weekly_knowledge";
161
+ }>;
154
162
  }, z.core.$strict>], "kind">;
163
+ export declare const AutomationManagementSchema: z.ZodObject<{
164
+ owner: z.ZodString;
165
+ editable: z.ZodArray<z.ZodEnum<{
166
+ enabled: "enabled";
167
+ trigger: "trigger";
168
+ }>>;
169
+ runnable: z.ZodBoolean;
170
+ deletable: z.ZodBoolean;
171
+ }, z.core.$strict>;
155
172
  export declare const AutomationReliabilitySchema: z.ZodObject<{
156
173
  executionTimeoutSeconds: z.ZodOptional<z.ZodNumber>;
157
174
  timeoutSeconds: z.ZodOptional<z.ZodNumber>;
@@ -328,6 +345,14 @@ export declare const AutomationSchema: z.ZodObject<{
328
345
  outputDestinations: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
329
346
  }, z.core.$strip>;
330
347
  }, z.core.$strip>], "type">;
348
+ }, z.core.$strict>, z.ZodObject<{
349
+ kind: z.ZodLiteral<"system">;
350
+ capability: z.ZodEnum<{
351
+ "home.advisor.refresh": "home.advisor.refresh";
352
+ "memory.temporal_sweep": "memory.temporal_sweep";
353
+ "memory.daily_reconciliation": "memory.daily_reconciliation";
354
+ "memory.weekly_knowledge": "memory.weekly_knowledge";
355
+ }>;
331
356
  }, z.core.$strict>], "kind">;
332
357
  safety: z.ZodOptional<z.ZodObject<{
333
358
  mode: z.ZodEnum<{
@@ -353,6 +378,15 @@ export declare const AutomationSchema: z.ZodObject<{
353
378
  maxConcurrentRuns: z.ZodOptional<z.ZodNumber>;
354
379
  disableAfterConsecutiveFailures: z.ZodOptional<z.ZodNumber>;
355
380
  }, z.core.$strict>>;
381
+ management: z.ZodOptional<z.ZodObject<{
382
+ owner: z.ZodString;
383
+ editable: z.ZodArray<z.ZodEnum<{
384
+ enabled: "enabled";
385
+ trigger: "trigger";
386
+ }>>;
387
+ runnable: z.ZodBoolean;
388
+ deletable: z.ZodBoolean;
389
+ }, z.core.$strict>>;
356
390
  state: z.ZodDefault<z.ZodObject<{
357
391
  nextRunAtMs: z.ZodOptional<z.ZodNumber>;
358
392
  runningRunId: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string>>;
@@ -490,6 +524,14 @@ export declare const CreateAutomationSchema: z.ZodObject<{
490
524
  outputDestinations: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
491
525
  }, z.core.$strip>;
492
526
  }, z.core.$strip>], "type">;
527
+ }, z.core.$strict>, z.ZodObject<{
528
+ kind: z.ZodLiteral<"system">;
529
+ capability: z.ZodEnum<{
530
+ "home.advisor.refresh": "home.advisor.refresh";
531
+ "memory.temporal_sweep": "memory.temporal_sweep";
532
+ "memory.daily_reconciliation": "memory.daily_reconciliation";
533
+ "memory.weekly_knowledge": "memory.weekly_knowledge";
534
+ }>;
493
535
  }, z.core.$strict>], "kind">;
494
536
  trigger: z.ZodDiscriminatedUnion<[z.ZodObject<{
495
537
  kind: z.ZodLiteral<"manual">;
@@ -541,6 +583,15 @@ export declare const CreateAutomationSchema: z.ZodObject<{
541
583
  maxConcurrentRuns: z.ZodOptional<z.ZodNumber>;
542
584
  disableAfterConsecutiveFailures: z.ZodOptional<z.ZodNumber>;
543
585
  }, z.core.$strict>>;
586
+ management: z.ZodOptional<z.ZodObject<{
587
+ owner: z.ZodString;
588
+ editable: z.ZodArray<z.ZodEnum<{
589
+ enabled: "enabled";
590
+ trigger: "trigger";
591
+ }>>;
592
+ runnable: z.ZodBoolean;
593
+ deletable: z.ZodBoolean;
594
+ }, z.core.$strict>>;
544
595
  id: z.ZodPipe<z.ZodOptional<z.ZodNullable<z.ZodString>>, z.ZodTransform<string, string>>;
545
596
  enabled: z.ZodOptional<z.ZodBoolean>;
546
597
  state: z.ZodOptional<z.ZodObject<{
@@ -679,6 +730,14 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
679
730
  outputDestinations: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
680
731
  }, z.core.$strip>;
681
732
  }, z.core.$strip>], "type">;
733
+ }, z.core.$strict>, z.ZodObject<{
734
+ kind: z.ZodLiteral<"system">;
735
+ capability: z.ZodEnum<{
736
+ "home.advisor.refresh": "home.advisor.refresh";
737
+ "memory.temporal_sweep": "memory.temporal_sweep";
738
+ "memory.daily_reconciliation": "memory.daily_reconciliation";
739
+ "memory.weekly_knowledge": "memory.weekly_knowledge";
740
+ }>;
682
741
  }, z.core.$strict>], "kind">>;
683
742
  trigger: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
684
743
  kind: z.ZodLiteral<"manual">;
@@ -721,6 +780,15 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
721
780
  maxConcurrentRuns: z.ZodOptional<z.ZodNumber>;
722
781
  disableAfterConsecutiveFailures: z.ZodOptional<z.ZodNumber>;
723
782
  }, z.core.$strict>>>;
783
+ management: z.ZodOptional<z.ZodOptional<z.ZodObject<{
784
+ owner: z.ZodString;
785
+ editable: z.ZodArray<z.ZodEnum<{
786
+ enabled: "enabled";
787
+ trigger: "trigger";
788
+ }>>;
789
+ runnable: z.ZodBoolean;
790
+ deletable: z.ZodBoolean;
791
+ }, z.core.$strict>>>;
724
792
  conversationMode: z.ZodOptional<z.ZodEnum<{
725
793
  new_session: "new_session";
726
794
  continuous: "continuous";
@@ -89,8 +89,23 @@ const AutomationActionSchema = z.discriminatedUnion("kind", [
89
89
  kind: z.literal("task_command"),
90
90
  taskId: nonEmptyString.max(200),
91
91
  command: TaskCommandSchema
92
+ }).strict(),
93
+ z.object({
94
+ kind: z.literal("system"),
95
+ capability: z.enum([
96
+ "home.advisor.refresh",
97
+ "memory.temporal_sweep",
98
+ "memory.daily_reconciliation",
99
+ "memory.weekly_knowledge"
100
+ ])
92
101
  }).strict()
93
102
  ]);
103
+ const AutomationManagementSchema = z.object({
104
+ owner: nonEmptyString.max(100),
105
+ editable: z.array(z.enum(["enabled", "trigger"])).max(2),
106
+ runnable: z.boolean(),
107
+ deletable: z.boolean()
108
+ }).strict();
94
109
  const AutomationReliabilitySchema = z.object({
95
110
  executionTimeoutSeconds: z.number().int().min(1).max(86400).optional(),
96
111
  timeoutSeconds: z.number().int().min(1).max(86400).optional(),
@@ -136,6 +151,7 @@ const AutomationSchema = z.object({
136
151
  ]).default("attention"),
137
152
  completionWebhookUrl: optionalTrimmedString(2e3),
138
153
  reliability: AutomationReliabilitySchema.optional(),
154
+ management: AutomationManagementSchema.optional(),
139
155
  state: AutomationStateSchema.default({}),
140
156
  createdAtMs: z.number().int().nonnegative(),
141
157
  updatedAtMs: z.number().int().nonnegative()
@@ -165,4 +181,4 @@ const UpdateAutomationSchema = AutomationSchema.omit({
165
181
  state: AutomationStateSchema
166
182
  }).partial().refine((data) => Object.keys(data).length > 0, { message: "At least one field must be provided" });
167
183
  //#endregion
168
- export { AutomationActionSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, UpdateAutomationSchema };
184
+ export { AutomationActionSchema, AutomationManagementSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, UpdateAutomationSchema };
@@ -102,6 +102,9 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
102
102
  outputDestinations: Record<string, unknown>[];
103
103
  };
104
104
  };
105
+ } | {
106
+ kind: "system";
107
+ capability: "home.advisor.refresh" | "memory.temporal_sweep" | "memory.daily_reconciliation" | "memory.weekly_knowledge";
105
108
  };
106
109
  trigger?: {
107
110
  kind: "manual";
@@ -140,6 +143,12 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
140
143
  maxConcurrentRuns?: number;
141
144
  disableAfterConsecutiveFailures?: number;
142
145
  };
146
+ management?: {
147
+ owner: string;
148
+ editable: ("enabled" | "trigger")[];
149
+ runnable: boolean;
150
+ deletable: boolean;
151
+ };
143
152
  id?: string;
144
153
  enabled?: boolean;
145
154
  state?: {
@@ -92,6 +92,7 @@ function summarizeAction(action) {
92
92
  if (action.kind === "workflow") return `Starts workflow ${action.workflowId}.`;
93
93
  if (action.kind === "browser_automation") return `Runs browser automation ${action.automationId}.`;
94
94
  if (action.kind === "task_command") return `Applies ${action.command?.type ?? "a command"} to task ${action.taskId}.`;
95
+ if (action.kind === "system") return `Runs system capability ${action.capability}.`;
95
96
  return action.agentId ? `Runs agent ${action.agentId}.` : "Runs the default agent.";
96
97
  }
97
98
  function repairPatchNeedsApproval(patch) {
@@ -1,9 +1,9 @@
1
1
  import { onAutomationProductEvent, publishAutomationProductEvent } from "./product-events.js";
2
- import { AutomationActionSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, UpdateAutomationSchema } from "./domain/validation.js";
2
+ import { AutomationActionSchema, AutomationManagementSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, UpdateAutomationSchema } from "./domain/validation.js";
3
3
  import { computeNextAutomationRunAtMs, computeNextScheduleRunAtMs, timerDelayUntil } from "./domain/schedule.js";
4
4
  import { DEFAULT_AUTOMATION_TIMEOUT_SECONDS, DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS, defaultAutomationTimeoutSeconds, resolveAutomationTimeoutSeconds } from "./domain/defaults.js";
5
5
  import { AutomationActionExecutor } from "./service/action-executor.js";
6
6
  import { AutomationAlreadyExistsError, AutomationAlreadyRunningError, AutomationService } from "./service/automation-service.js";
7
7
  import "./domain/index.js";
8
8
  import "./service/index.js";
9
- export { AutomationActionExecutor, AutomationActionSchema, AutomationAlreadyExistsError, AutomationAlreadyRunningError, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationService, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, DEFAULT_AUTOMATION_TIMEOUT_SECONDS, DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS, UpdateAutomationSchema, computeNextAutomationRunAtMs, computeNextScheduleRunAtMs, defaultAutomationTimeoutSeconds, onAutomationProductEvent, publishAutomationProductEvent, resolveAutomationTimeoutSeconds, timerDelayUntil };
9
+ export { AutomationActionExecutor, AutomationActionSchema, AutomationAlreadyExistsError, AutomationAlreadyRunningError, AutomationManagementSchema, AutomationReliabilitySchema, AutomationSafetyPolicySchema, AutomationScheduleSchema, AutomationSchema, AutomationService, AutomationStateSchema, AutomationTriggerSchema, CreateAutomationSchema, DEFAULT_AUTOMATION_TIMEOUT_SECONDS, DEFAULT_BROWSER_AUTOMATION_TIMEOUT_SECONDS, UpdateAutomationSchema, computeNextAutomationRunAtMs, computeNextScheduleRunAtMs, defaultAutomationTimeoutSeconds, onAutomationProductEvent, publishAutomationProductEvent, resolveAutomationTimeoutSeconds, timerDelayUntil };
@@ -128,6 +128,22 @@ var AutomationActionExecutor = class {
128
128
  error: result.reason ?? "Task command failed"
129
129
  };
130
130
  }
131
+ if (automation.action.kind === "system") {
132
+ await hooks.onRunPatch?.({ currentPhase: "action" });
133
+ const execute = this.deps.executeSystemAction;
134
+ if (!execute) return {
135
+ status: "failed",
136
+ error: "System action executor is unavailable"
137
+ };
138
+ return {
139
+ status: "succeeded",
140
+ summary: (await execute({
141
+ capability: automation.action.capability,
142
+ automationId: automation.id,
143
+ runId: run.id
144
+ })).summary ?? "System action completed"
145
+ };
146
+ }
131
147
  return this.executeAgent(automation, automation.action, run, signal, hooks, deadlineAtMs, context);
132
148
  }
133
149
  async executeBrowserAutomation(automation, action, signal, hooks, context) {
@@ -23,6 +23,7 @@ function rowToAutomation(row) {
23
23
  notificationPolicy: row.notification_policy,
24
24
  completionWebhookUrl: row.completion_webhook_url ?? void 0,
25
25
  reliability: parseJson(row.reliability_json),
26
+ management: parseJson(row.management_json),
26
27
  state: parseJson(row.state_json) ?? {},
27
28
  createdAtMs: row.created_at_ms,
28
29
  updatedAtMs: row.updated_at_ms
@@ -32,13 +33,13 @@ function upsertAutomation(db, automation) {
32
33
  db.prepare(`INSERT OR REPLACE INTO automations (
33
34
  automation_id, name, description, project_id, enabled, trigger_json, action_json,
34
35
  safety_json, conversation_mode, notification_policy, completion_webhook_url,
35
- reliability_json, state_json, created_at_ms, updated_at_ms
36
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(automation.id, automation.name, automation.description ?? null, automation.projectId ?? null, automation.enabled ? 1 : 0, JSON.stringify(automation.trigger), JSON.stringify(automation.action), bindJson(automation.safety ?? { mode: "auto_apply" }), automation.conversationMode, automation.notificationPolicy, automation.completionWebhookUrl ?? null, bindJson(automation.reliability), JSON.stringify(automation.state ?? {}), automation.createdAtMs, automation.updatedAtMs);
36
+ reliability_json, management_json, state_json, created_at_ms, updated_at_ms
37
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(automation.id, automation.name, automation.description ?? null, automation.projectId ?? null, automation.enabled ? 1 : 0, JSON.stringify(automation.trigger), JSON.stringify(automation.action), bindJson(automation.safety ?? { mode: "auto_apply" }), automation.conversationMode, automation.notificationPolicy, automation.completionWebhookUrl ?? null, bindJson(automation.reliability), bindJson(automation.management), JSON.stringify(automation.state ?? {}), automation.createdAtMs, automation.updatedAtMs);
37
38
  }
38
39
  const AUTOMATION_SELECT = `
39
40
  SELECT automation_id, name, description, project_id, enabled, trigger_json, action_json,
40
41
  safety_json, conversation_mode, notification_policy, completion_webhook_url,
41
- reliability_json, state_json, created_at_ms, updated_at_ms
42
+ reliability_json, management_json, state_json, created_at_ms, updated_at_ms
42
43
  FROM automations
43
44
  `;
44
45
  function listAutomations(options) {
@@ -1,9 +1,9 @@
1
1
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
2
2
  import { init_sqlite } from "../storage/sqlite/index.js";
3
3
  import { AgentCatalogService } from "../agent-catalog/service.js";
4
+ import { ensureStarterAgentsInitialized } from "../agent/starter-agents.js";
4
5
  import { cutoverLegacyAgentConfig } from "../agent-catalog/migrations/legacy-config-cutover.js";
5
6
  import "../agent-catalog/index.js";
6
- import { ensureStarterAgentsInitialized } from "../agent/starter-agents.js";
7
7
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
8
8
  //#region src/bootstrap/application-state.ts
9
9
  init_sqlite();
@@ -1,7 +1,7 @@
1
1
  import { SqliteCommitEffectError, init_transaction } from "../../storage/sqlite/transaction.js";
2
- import { OperationConflictError, executeAtomicOperation } from "./atomic-operations.js";
3
2
  import { CapabilityError } from "./errors.js";
4
3
  import { executeExternalOperation } from "./external-operations.js";
4
+ import { OperationConflictError, executeAtomicOperation } from "./atomic-operations.js";
5
5
  import { createHash } from "node:crypto";
6
6
  import { z } from "zod";
7
7
  //#region src/capabilities/runtime/dispatcher.ts
@@ -1,6 +1,5 @@
1
1
  import { CapabilityError } from "./errors.js";
2
2
  import { CapabilityDispatcher } from "./dispatcher.js";
3
- import { registerAgentCapabilities } from "../../agent-catalog/capabilities.js";
4
3
  import { registerLocalAppReadCapabilities } from "../../local-apps/capabilities/read.js";
5
4
  import { registerNoteReadCapabilities } from "../../notes/capabilities/read.js";
6
5
  import { registerNoteWriteCapabilities } from "../../notes/capabilities/write.js";
@@ -19,6 +18,7 @@ import { registerSceneReadCapabilities } from "../../scenes/capabilities/read.js
19
18
  import { registerSceneWriteCapabilities } from "../../scenes/capabilities/write.js";
20
19
  import { registerSettingsCapability } from "./settings.js";
21
20
  import { registerAppContextCapability } from "./app-context.js";
21
+ import { registerAgentCapabilities } from "../../agent-catalog/capabilities.js";
22
22
  //#region src/capabilities/runtime/product.ts
23
23
  function createProductDispatcher(getNotes, taskWrites) {
24
24
  const dispatcher = new CapabilityDispatcher();
@@ -1,7 +1,7 @@
1
1
  import { normalizeAgentId } from "../agent-catalog/id.js";
2
2
  import { init_agent_scope, resolveAgentProfileDir } from "../agent/agent-scope.js";
3
- import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
4
3
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../routing/agent-session-key.js";
4
+ import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
5
5
  import { commandRegistry } from "./registry.js";
6
6
  import { join } from "node:path";
7
7
  import { readFile } from "node:fs/promises";
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { init_paths, resolveConfigPath } from "../../config/paths.js";
4
3
  import { ConfigSchema, init_schema } from "../../config/schema.js";
4
+ import { init_paths, resolveConfigPath } from "../../config/paths.js";
5
5
  import { commandRegistry } from "../registry.js";
6
6
  import { parseConfigValue } from "../config-value.js";
7
7
  import { getConfigValueAtPath, parseConfigPath, setConfigValueAtPath, unsetConfigValueAtPath } from "../config-paths.js";
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope.js";
4
3
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
+ import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope.js";
5
5
  import { init_agent_session_key, resolveAgentMainConversationId } from "../../routing/agent-session-key.js";
6
6
  import { ExtensionLoader } from "../../extensions/loader.js";
7
7
  import "../../extensions/index.js";
@@ -1,8 +1,8 @@
1
1
  import { normalizeAgentId, validateAgentIdForNewAgent } from "../../agent-catalog/id.js";
2
2
  import { AgentCatalogRepository, init_repository } from "../../agent-catalog/repository.js";
3
3
  import { init_agent_scope, resolveAgentDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../agent/agent-scope.js";
4
- import { AgentCatalogService } from "../../agent-catalog/service.js";
5
4
  import { resolveEffectiveAgentConfigForAgent } from "../../config/agent-profile.js";
5
+ import { AgentCatalogService } from "../../agent-catalog/service.js";
6
6
  import { colors } from "../utils/colors.js";
7
7
  //#region src/cli/commands/agents.ts
8
8
  init_repository();
@@ -53,7 +53,7 @@ async function checkDatabaseSchema(ctx) {
53
53
  id: "database-schema",
54
54
  label: "Database schema",
55
55
  status: "pass",
56
- message: `SQLite schema v${status.dbVersion} (current release v207).`,
56
+ message: `SQLite schema v${status.dbVersion} (current release v208).`,
57
57
  hints: []
58
58
  };
59
59
  }
@@ -1,8 +1,8 @@
1
1
  import { AgentCatalogRepository, init_repository } from "../../agent-catalog/repository.js";
2
- import { AgentCatalogService } from "../../agent-catalog/service.js";
3
2
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
3
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
5
4
  import { getAllModels, getAvailableModels, getConfiguredProviders, getProviderAuthState, getProviderDisplayName, init_providers, isProviderConfigured, providerSupportsApiKey, providerSupportsOAuth, resolveModel } from "../../providers/index.js";
5
+ import { AgentCatalogService } from "../../agent-catalog/service.js";
6
6
  import { loadConfig } from "../../config/loader.js";
7
7
  import { formatExamples, register } from "../registry.js";
8
8
  import { getContextWithOpts } from "../context.js";
@@ -1,12 +1,12 @@
1
1
  import { AgentCatalogRepository, init_repository } from "../../../agent-catalog/repository.js";
2
- import { resolveModelsJsonPath } from "../../../config/paths.js";
3
- import { AgentCatalogService } from "../../../agent-catalog/service.js";
4
2
  import { getAgentDefaultModelRef, init_schema } from "../../../config/schema.js";
3
+ import { resolveModelsJsonPath } from "../../../config/paths.js";
5
4
  import { init_models_json, loadModelsJson, saveModelsJson } from "../../../config/models-json.js";
6
5
  import { getApiKeyFromEnv } from "../../../providers/env-keys.js";
7
6
  import { getModelRegistry } from "../../../providers/model-registry.js";
8
7
  import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
9
8
  import { getAllProviders, getModelsByProvider, getProviderDisplayName, init_providers, providerSupportsApiKey, providerSupportsOAuth } from "../../../providers/index.js";
9
+ import { AgentCatalogService } from "../../../agent-catalog/service.js";
10
10
  import { prepareUpdateGlobalDefaults } from "../../../gateway/global-defaults-admin.js";
11
11
  import { discoverProviderModels, isProviderApiDiscoverable } from "../../../providers/model-discovery.js";
12
12
  import { getXopcCloudCatalogCoordinator } from "../../../providers/xopc-cloud-catalog-coordinator.js";
@@ -1,6 +1,6 @@
1
1
  import { AgentCatalogRepository, init_repository } from "../../agent-catalog/repository.js";
2
- import { AgentCatalogService } from "../../agent-catalog/service.js";
3
2
  import { ConfigSchema, init_schema } from "../../config/schema.js";
3
+ import { AgentCatalogService } from "../../agent-catalog/service.js";
4
4
  import { assertConfigRewriteSafeForRunningGateway, saveConfig } from "../../config/loader.js";
5
5
  import { ensureStarterAgentsInitialized } from "../../agent/starter-agents.js";
6
6
  import { bootstrapApplicationStateSync } from "../../bootstrap/application-state.js";
@@ -1,13 +1,13 @@
1
1
  import { ENV_VARS, XOPC_DB_FILENAME, resolveHomeDir, resolveStateDir, resolveXopcCloudCatalogCachePath, resolveXopcDatabasePath } from "./paths-state.js";
2
- import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
3
- import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
4
- import { resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
5
- import { FILENAMES, WORKSPACE_FILES, existsSync, hasBundledExtensionManifest, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMcpOAuthPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
6
2
  import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
7
3
  import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
8
4
  import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewayScenesConfigSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpOAuthConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
9
5
  import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
6
+ import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
7
+ import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
8
+ import { resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
10
9
  import { extractProfileAgentId, resolveEffectiveAgentConfigForAgent, resolveEffectiveAgentConfigForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
10
+ import { FILENAMES, WORKSPACE_FILES, existsSync, hasBundledExtensionManifest, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMcpOAuthPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
11
11
  import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
12
12
  import { CustomModelSchema, ImageGenerationCapabilitiesSchema, ImageGenerationModelSchema, ImageGenerationProviderSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
13
13
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { init_paths, resolveConfigPath } from "./paths.js";
4
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
5
3
  import { ConfigSchema, init_schema } from "./schema.js";
4
+ import { init_paths, resolveConfigPath } from "./paths.js";
6
5
  import { init_resolution, setActivePlatformDiscovery } from "../platform/resolution.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
7
7
  import { assertChannelPluginConfigs } from "./validate-channel-configs.js";
8
8
  import { isGatewayConfigLockedByAnotherProcessSync } from "../gateway/lock.js";
9
9
  import { dirname } from "path";