@xopcai/xopc 0.0.404 → 0.0.406

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 (172) 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-CdwFK70g.js → agent-avatar-dicebear-BE3ci_lj.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-BMj9HwIQ.js → agent-defaults-settings-panel-DzDaum4Y.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agents-hrm6V8Dp.js → agents-BfC3FYYe.js} +3 -3
  6. package/dist/gateway/static/root/assets/{app-management-settings-panel-Rg9jOmoj.js → app-management-settings-panel-BDbJKxa-.js} +1 -1
  7. package/dist/gateway/static/root/assets/{appearance-settings-S3yp0GUO.js → appearance-settings-CEOOrVYb.js} +1 -1
  8. package/dist/gateway/static/root/assets/{apps-page-ChrJSB_2.js → apps-page-CpoG_3PG.js} +1 -1
  9. package/dist/gateway/static/root/assets/{archive-plugin-J7hwA5cs.js → archive-plugin-B7pzPErg.js} +1 -1
  10. package/dist/gateway/static/root/assets/{automations-page-Cesz1cjw.js → automations-page-CcQjEiqk.js} +1 -1
  11. package/dist/gateway/static/root/assets/{automations-workspace-DdopDyED.js → automations-workspace-BVTP3pzt.js} +1 -1
  12. package/dist/gateway/static/root/assets/{binary-plugins-Bg4Se8Kg.js → binary-plugins-D5kTu6gH.js} +1 -1
  13. package/dist/gateway/static/root/assets/{block-editor-Bw1sO9YH.js → block-editor-CnW6rF_e.js} +1 -1
  14. package/dist/gateway/static/root/assets/{browser-automation-inputs-Y46Mf8aY.js → browser-automation-inputs-CAcUtInP.js} +1 -1
  15. package/dist/gateway/static/root/assets/{browser-automations-page-BcNjBdFQ.js → browser-automations-page-DT7-lnPN.js} +1 -1
  16. package/dist/gateway/static/root/assets/{browser-settings-page-ByeqxrSF.js → browser-settings-page-ByK8znt2.js} +1 -1
  17. package/dist/gateway/static/root/assets/{capabilities-CIv3LUQk.js → capabilities-Dl3LttAm.js} +1 -1
  18. package/dist/gateway/static/root/assets/{capabilities-page-BUTQSo3A.js → capabilities-page-C8tv6M_O.js} +2 -2
  19. package/dist/gateway/static/root/assets/{capabilities-settings-panel-B-Uwmjbo.js → capabilities-settings-panel-OVLgL6yL.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capability-header-actions-BGGJKzPL.js → capability-header-actions-jztljvVW.js} +1 -1
  21. package/dist/gateway/static/root/assets/{channels-z6iuM4HE.js → channels-D8BKMMPW.js} +1 -1
  22. package/dist/gateway/static/root/assets/{chat-terminal-dock-oMmP0flJ.js → chat-terminal-dock-BVlFOKJj.js} +1 -1
  23. package/dist/gateway/static/root/assets/{computer-settings-page-CERhSG5W.js → computer-settings-page-CvQgrTwb.js} +1 -1
  24. package/dist/gateway/static/root/assets/{connector-service-page-DyW3mLTh.js → connector-service-page-BNcTUa99.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connectors-page-CdMwhiio.js → connectors-page-CWlLRQpK.js} +1 -1
  26. package/dist/gateway/static/root/assets/{date-picker-CO3Jhdzg.js → date-picker-BKUmdSp7.js} +1 -1
  27. package/dist/gateway/static/root/assets/{dependency-picker-DbyMpo5J.js → dependency-picker-BarQvwoO.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-DJ9OAPJs.js → desktop-pet-IvADYxyi.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-CNrNXWlk.js → desktop-pet-settings-y6WzhGEK.js} +1 -1
  30. package/dist/gateway/static/root/assets/{device-pairing-wizard-TzK-VCuf.js → device-pairing-wizard-D3IUZ8xW.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-BmFgRA8G.js → directory-picker-path-field-DnEvwMTm.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-C3ZpHHYc.js → extension-debug-page-CCvuK1m0.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-gfOwpT2R.js → extension-page-DegRwY3R.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-settings-page-BS7cDqZJ.js → extension-settings-page-B8UQgGgZ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-settings-UB6hyqcj.js → gateway-settings-DlLyLsXY.js} +1 -1
  36. package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-BRfDRn2k.js → highlighted-body-KQOG7T2V-MjAoJQJX.js} +1 -1
  37. package/dist/gateway/static/root/assets/{home-page-DBUnR1DO.js → home-page-DAYtNK3o.js} +1 -1
  38. package/dist/gateway/static/root/assets/{image-generation-api-BoMWmqwF.js → image-generation-api-SQDixWjO.js} +1 -1
  39. package/dist/gateway/static/root/assets/{imports-page-CPiPsiEP.js → imports-page-1ZId0Ng0.js} +1 -1
  40. package/dist/gateway/static/root/assets/{index-DmURUvvA.js → index-K2cy4f-3.js} +116 -116
  41. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-D9y8h4dR.js → keyboard-shortcuts-settings-yMwBt1Sv.js} +1 -1
  42. package/dist/gateway/static/root/assets/{local-app-workbench-page-DoAmV6on.js → local-app-workbench-page-a7J0NPIs.js} +1 -1
  43. package/dist/gateway/static/root/assets/{local-apps-page-CE6Ag8oQ.js → local-apps-page-CF6_kS9C.js} +1 -1
  44. package/dist/gateway/static/root/assets/{logs-page-DFysUb2k.js → logs-page-C8y5yhoM.js} +1 -1
  45. package/dist/gateway/static/root/assets/{management-settings-CmXPsu0I.js → management-settings-C7dL_jNu.js} +1 -1
  46. package/dist/gateway/static/root/assets/{media-plugins-DvfdiczR.js → media-plugins-UYX1YivF.js} +1 -1
  47. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-7zpLTDLZ.js +1 -0
  48. package/dist/gateway/static/root/assets/{note-detail-panel-BpddDFQt.js → note-detail-panel-Bxm523Up.js} +3 -3
  49. package/dist/gateway/static/root/assets/note-image-lightbox-B7ARnjnB.js +1 -0
  50. package/dist/gateway/static/root/assets/{notes-page-DQ4KZsWt.js → notes-page-BOeS2v6x.js} +1 -1
  51. package/dist/gateway/static/root/assets/{page-context-capture-button-BcxVEGa2.js → page-context-capture-button-DOrPS73o.js} +1 -1
  52. package/dist/gateway/static/root/assets/{personal-page-CCQDxb7E.js → personal-page-BujiHops.js} +1 -1
  53. package/dist/gateway/static/root/assets/{plugin-details-dialog-CGFQ_-bG.js → plugin-details-dialog-XOzQrJQN.js} +1 -1
  54. package/dist/gateway/static/root/assets/{plugin-presentation-DF1gfuGf.js → plugin-presentation-CPEwVLd4.js} +1 -1
  55. package/dist/gateway/static/root/assets/{preview-open-alternatives-CXjjpXVx.js → preview-open-alternatives-BP9C0kH3.js} +1 -1
  56. package/dist/gateway/static/root/assets/{product-open-page-DqiyvM4c.js → product-open-page-D151rJVy.js} +1 -1
  57. package/dist/gateway/static/root/assets/{product-preview-content-f7Q4giA3.js → product-preview-content-CAo0XpP-.js} +1 -1
  58. package/dist/gateway/static/root/assets/project-detail-page-CxB_kF0F.js +1 -0
  59. package/dist/gateway/static/root/assets/{projects-page-DO_pIhy-.js → projects-page-Dvu_3c2g.js} +1 -1
  60. package/dist/gateway/static/root/assets/{remote-access-hub-BFtELmg0.js → remote-access-hub-CbzBV_BL.js} +1 -1
  61. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-B9Beu-oK.js → runtime-tools-settings-panel-DyLxlqWV.js} +1 -1
  62. package/dist/gateway/static/root/assets/{schema-form-ZAX7C5uI.js → schema-form-ClP4uPSj.js} +1 -1
  63. package/dist/gateway/static/root/assets/{session-manager-BUMUjup5.js → session-manager-DMDBMYfh.js} +2 -2
  64. package/dist/gateway/static/root/assets/{sessions-page-D27knqOl.js → sessions-page-CvfoPeM6.js} +1 -1
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-BOkrHL8q.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-form-section-BTUFu5KS.js → settings-form-section-B4NShgv-.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-page-YFr6zzh7.js → settings-page-C54bw5J9.js} +1 -1
  68. package/dist/gateway/static/root/assets/{setup-status-panel-C5Jszsd1.js → setup-status-panel-BVKQ2inq.js} +1 -1
  69. package/dist/gateway/static/root/assets/{share-preview-page-CsfrvY_G.js → share-preview-page-BxN9t3MD.js} +1 -1
  70. package/dist/gateway/static/root/assets/{shares-settings-BW6BNot0.js → shares-settings-BOa9NAUc.js} +1 -1
  71. package/dist/gateway/static/root/assets/{skill-api-o3HSgF_K.js → skill-api-E0E-MH1S.js} +1 -1
  72. package/dist/gateway/static/root/assets/{skill-reload-api-BJsPnE87.js → skill-reload-api-DEN6tOwG.js} +1 -1
  73. package/dist/gateway/static/root/assets/{skills-page-Kuf2t7MG.js → skills-page-CeNVBQG9.js} +1 -1
  74. package/dist/gateway/static/root/assets/{style-DOz6lLJB.js → style-Bs9x3WBj.js} +1 -1
  75. package/dist/gateway/static/root/assets/{system-settings-panel-B69rR6vw.js → system-settings-panel-DpQPaJId.js} +1 -1
  76. package/dist/gateway/static/root/assets/task-detail-page-DzK53B5p.js +2 -0
  77. package/dist/gateway/static/root/assets/{task-expandable-content-BZCJqajv.js → task-expandable-content-BoGtWYbk.js} +1 -1
  78. package/dist/gateway/static/root/assets/{tasks-PuIUgF9L.js → tasks-B4bZpO6O.js} +1 -1
  79. package/dist/gateway/static/root/assets/{tracing-settings-page-BIq3Ayeg.js → tracing-settings-page-BUUnZfZW.js} +1 -1
  80. package/dist/gateway/static/root/assets/{tunnel-api-V9pJ8fUo.js → tunnel-api-3GopOQ_S.js} +1 -1
  81. package/dist/gateway/static/root/assets/{usage-page-DZdpti28.js → usage-page-B8j47CWQ.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-autosave-BnMIUc_5.js → use-autosave-CYIuWnRn.js} +1 -1
  83. package/dist/gateway/static/root/assets/{user-model-page-BEgJ97hp.js → user-model-page-DxcH74eP.js} +1 -1
  84. package/dist/gateway/static/root/assets/{voice-api-key-field-1h6fMaZL.js → voice-api-key-field-BN37Lklj.js} +1 -1
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-CVNqSNz8.js → work-discovery-overlay-C_bcAAX6.js} +1 -1
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Dq63AthQ.js → workflow-run-setup-panel-B5oKCzTn.js} +1 -1
  87. package/dist/gateway/static/root/assets/{workflows-page-CfA1iwZu.js → workflows-page-Bo5b5t_9.js} +1 -1
  88. package/dist/gateway/static/root/assets/{xopc-cloud-account-card-BsW2acj1.js → xopc-cloud-account-card-DGGi4zVC.js} +1 -1
  89. package/dist/gateway/static/root/index.html +4 -4
  90. package/dist/package.js +1 -1
  91. package/dist/packages/gateway-contract/src/tasks.js +27 -8
  92. package/dist/src/agent/agent-manager.js +1 -1
  93. package/dist/src/agent/background-review/run-background-review.js +1 -1
  94. package/dist/src/agent/external-tools/cliProvider.js +2 -2
  95. package/dist/src/agent/external-tools/composio-provider.js +2 -2
  96. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  97. package/dist/src/agent/service.js +1 -1
  98. package/dist/src/agent/skills/index.js +1 -1
  99. package/dist/src/agent/skills/managed-store.js +1 -1
  100. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  101. package/dist/src/agent/tools/personal-read-tool.js +1 -1
  102. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  103. package/dist/src/agent-catalog/capabilities.js +2 -2
  104. package/dist/src/agent-catalog/migrations/legacy-config-cutover.js +1 -1
  105. package/dist/src/agent-catalog/repository.js +1 -1
  106. package/dist/src/automations/capabilities/drafts.js +1 -1
  107. package/dist/src/automations/capabilities/write.d.ts +14 -0
  108. package/dist/src/automations/domain/validation.d.ts +28 -0
  109. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -1
  110. package/dist/src/bootstrap/application-state.js +1 -1
  111. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  112. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  113. package/dist/src/capabilities/runtime/product.js +1 -1
  114. package/dist/src/cli/commands/agents.js +1 -1
  115. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  116. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  117. package/dist/src/cli/commands/extension.js +1 -1
  118. package/dist/src/cli/commands/models.js +1 -1
  119. package/dist/src/cli/commands/onboard/model.js +1 -1
  120. package/dist/src/cli/commands/onboard.js +1 -1
  121. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  122. package/dist/src/config/agent-profile.js +1 -1
  123. package/dist/src/execution-environments/local-worktree-manager.js +1 -1
  124. package/dist/src/extensions/agent-plugins/skill-catalog.js +1 -1
  125. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  126. package/dist/src/extensions/update.js +1 -1
  127. package/dist/src/gateway/agents-admin.js +2 -2
  128. package/dist/src/gateway/hono/routes/agents.js +1 -1
  129. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  130. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  131. package/dist/src/gateway/hono/routes/config.js +1 -1
  132. package/dist/src/gateway/hono/routes/notes.js +2 -2
  133. package/dist/src/gateway/hono/routes/projects.js +2 -2
  134. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  135. package/dist/src/gateway/hono/routes/tasks.js +3 -2
  136. package/dist/src/gateway/image-generation-setup.js +1 -1
  137. package/dist/src/gateway/service/config-coordinator.js +1 -1
  138. package/dist/src/gateway/service/run-gateway-agent.js +1 -0
  139. package/dist/src/gateway/service.js +6 -6
  140. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  141. package/dist/src/home-intelligence/host.js +2 -2
  142. package/dist/src/imports/importService.js +1 -1
  143. package/dist/src/infra/update-runner.js +1 -1
  144. package/dist/src/local-apps/service.js +1 -1
  145. package/dist/src/personal-agent/service.js +1 -1
  146. package/dist/src/providers/prompt-cache-lifecycle.d.ts +1 -1
  147. package/dist/src/providers/prompt-cache-lifecycle.js +1 -1
  148. package/dist/src/runtime-tools/archive.js +1 -1
  149. package/dist/src/storage/sqlite/migrations/258_task_phase_changes.sql +20 -0
  150. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  151. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  152. package/dist/src/storage/sqlite/schema.js +1 -1
  153. package/dist/src/tasks/capabilities/read.js +3 -2
  154. package/dist/src/tasks/capabilities/write.js +3 -3
  155. package/dist/src/tasks/task-application-service.d.ts +2 -1
  156. package/dist/src/tasks/task-application-service.js +80 -12
  157. package/dist/src/tasks/task-collaboration-delivery.js +2 -1
  158. package/dist/src/tasks/task-context-assembler.js +2 -1
  159. package/dist/src/tasks/task-read-model-projector.js +13 -5
  160. package/dist/src/tasks/task-repository.d.ts +11 -1
  161. package/dist/src/tasks/task-repository.js +42 -7
  162. package/dist/src/tasks/task-run-coordinator.d.ts +2 -0
  163. package/dist/src/tasks/task-run-coordinator.js +26 -17
  164. package/dist/src/tasks/task-run-repository.js +5 -2
  165. package/dist/src/tui/backends/embedded-backend.js +1 -1
  166. package/dist/src/voice/realtime/persona-context.js +1 -1
  167. package/package.json +4 -4
  168. package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-SuiLTd5Y.js +0 -1
  169. package/dist/gateway/static/root/assets/note-image-lightbox-CMLVzPsQ.js +0 -1
  170. package/dist/gateway/static/root/assets/project-detail-page-PBK7vXK5.js +0 -1
  171. package/dist/gateway/static/root/assets/settings-advanced-gate-CDzdr1zW.js +0 -1
  172. package/dist/gateway/static/root/assets/task-detail-page-DOb97OLI.js +0 -2
@@ -156,13 +156,48 @@ var init_task_repository = __esmMin((() => {
156
156
  }
157
157
  setLifecycle(input) {
158
158
  if (input.phase === "closed" !== Boolean(input.resolution)) throw new Error("Closed tasks require a resolution and open tasks cannot have one");
159
- const current = this.get(input.taskId);
160
- if (!current || current.version !== input.expectedVersion) return void 0;
161
- const now = Math.max(input.now ?? Date.now(), current.updatedAt + 1);
162
- const boardRank = current.phase === input.phase ? current.boardRank : Number(getSqliteDatabase().prepare("SELECT COALESCE(MAX(board_rank), 0) + 1024 AS board_rank FROM tasks WHERE project_id IS ? AND phase = ?").get(current.projectId ?? null, input.phase).board_rank);
163
- return getSqliteDatabase().prepare(`UPDATE tasks SET phase = ?, resolution = ?, closed_at = ?,
164
- board_rank = ?, version = version + 1, updated_at = ?
165
- WHERE task_id = ? AND version = ?`).run(input.phase, input.resolution ?? null, input.phase === "closed" ? now : null, boardRank, now, input.taskId, input.expectedVersion).changes === 0 ? void 0 : this.get(input.taskId);
159
+ return runSqliteWriteTransaction((db) => {
160
+ const current = this.get(input.taskId);
161
+ if (!current || current.version !== input.expectedVersion) return void 0;
162
+ if (current.phase === input.phase && current.resolution === input.resolution) return current;
163
+ const now = Math.max(input.now ?? Date.now(), current.updatedAt + 1);
164
+ const boardRank = current.phase === input.phase ? current.boardRank : Number(db.prepare("SELECT COALESCE(MAX(board_rank), 0) + 1024 AS board_rank FROM tasks WHERE project_id IS ? AND phase = ?").get(current.projectId ?? null, input.phase).board_rank);
165
+ if (db.prepare(`UPDATE tasks SET phase = ?, resolution = ?, closed_at = ?, board_rank = ?,
166
+ version = version + 1, updated_at = ?, manual_phase_revision = manual_phase_revision + ?
167
+ WHERE task_id = ? AND version = ?`).run(input.phase, input.resolution ?? null, input.phase === "closed" ? now : null, boardRank, now, input.manual ? 1 : 0, input.taskId, input.expectedVersion).changes === 0) return void 0;
168
+ db.prepare(`INSERT INTO task_phase_changes (id, task_id, from_phase, to_phase,
169
+ from_resolution, to_resolution, actor_json, source, operation_id, run_id, task_version, created_at)
170
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), current.id, current.phase, input.phase, current.resolution ?? null, input.resolution ?? null, JSON.stringify(input.actor ?? { kind: "system" }), input.source ?? "runtime", input.operationId ?? currentOperationId() ?? null, input.runId ?? null, current.version + 1, now);
171
+ return this.get(input.taskId);
172
+ });
173
+ }
174
+ phaseChanges(taskId) {
175
+ return getSqliteDatabase().prepare(`SELECT * FROM task_phase_changes WHERE task_id = ? ORDER BY task_version`).all(taskId).map((row) => ({
176
+ id: String(row.id),
177
+ taskId: String(row.task_id),
178
+ fromPhase: row.from_phase,
179
+ toPhase: row.to_phase,
180
+ ...row.from_resolution ? { fromResolution: row.from_resolution } : {},
181
+ ...row.to_resolution ? { toResolution: row.to_resolution } : {},
182
+ actor: JSON.parse(String(row.actor_json)),
183
+ source: row.source,
184
+ ...row.operation_id ? { operationId: String(row.operation_id) } : {},
185
+ ...row.run_id ? { runId: String(row.run_id) } : {},
186
+ taskVersion: Number(row.task_version),
187
+ createdAt: Number(row.created_at)
188
+ }));
189
+ }
190
+ /** A new explicit execution authorizes automation for the current manual revision. */
191
+ authorizeAutomaticPhase(taskId) {
192
+ getSqliteDatabase().prepare("UPDATE tasks SET automatic_phase_revision = manual_phase_revision WHERE task_id = ?").run(taskId);
193
+ }
194
+ automaticStartAllowed(taskId) {
195
+ return Boolean(getSqliteDatabase().prepare(`SELECT 1 FROM tasks
196
+ WHERE task_id = ? AND manual_phase_revision = automatic_phase_revision`).get(taskId));
197
+ }
198
+ runPhaseUnchanged(taskId, runId) {
199
+ return Boolean(getSqliteDatabase().prepare(`SELECT 1 FROM tasks t JOIN task_runs r ON r.task_id = t.task_id
200
+ WHERE t.task_id = ? AND r.run_id = ? AND t.manual_phase_revision = r.manual_phase_revision`).get(taskId, runId));
166
201
  }
167
202
  reorder(input) {
168
203
  const current = this.get(input.taskId);
@@ -1,3 +1,4 @@
1
+ import type { TurnOrigin } from '@xopcai/endpoint-tools-protocol';
1
2
  import type { TaskEvidence, TaskRunReceipt, TurnOutcome } from '@xopcai/gateway-contract';
2
3
  import type { ExecutionContext } from './execution-context.js';
3
4
  export declare class TaskRunCoordinator {
@@ -7,6 +8,7 @@ export declare class TaskRunCoordinator {
7
8
  static start(input: {
8
9
  runId: string;
9
10
  context: ExecutionContext;
11
+ inputOrigin?: TurnOrigin;
10
12
  fallbackObjective: string;
11
13
  timeoutMs?: number;
12
14
  }): TaskRunCoordinator | undefined;
@@ -37,32 +37,41 @@ var TaskRunCoordinator = class TaskRunCoordinator {
37
37
  if (!input.context.taskId) return void 0;
38
38
  const tasks = new TaskRepository();
39
39
  const task = tasks.get(input.context.taskId);
40
- if (!task || task.phase === "closed") return void 0;
40
+ if (!task || task.phase === "closed" && task.resolution !== "done") return void 0;
41
41
  const runs = new TaskRunRepository();
42
42
  if (runs.listActiveWaits(task.id).length > 0) return void 0;
43
43
  let run = runs.get(input.runId);
44
44
  if (run && (run.taskId !== task.id || run.parentRunId || run.conversationId && run.conversationId !== input.context.conversationId)) return void 0;
45
45
  if (!run) {
46
+ if (task.phase === "closed") return void 0;
46
47
  if (runs.getActiveRoot(task.id)) return void 0;
47
48
  const agentId = task.delegateAgentId ?? input.context.agentId;
48
49
  if (!agentId) return void 0;
49
- run = runs.create({
50
- id: input.runId,
51
- taskId: task.id,
52
- executorKind: "agent",
53
- executorRef: { agentId },
54
- trigger: { kind: input.context.triggerKind },
55
- correlationId: input.runId,
56
- idempotencyKey: input.runId,
57
- contractVersion: task.latestContractVersion,
58
- conversationId: input.context.conversationId,
59
- retryPolicy: { maxAttempts: 3 }
60
- });
61
- if (task.phase !== "active") tasks.setLifecycle({
62
- taskId: task.id,
63
- expectedVersion: task.version,
64
- phase: "active"
50
+ run = runSqliteWriteTransaction(() => {
51
+ if (tasks.require(task.id).version !== task.version) return void 0;
52
+ if (input.inputOrigin?.type === "endpoint" || input.inputOrigin?.type === "channel" || input.inputOrigin?.type === "system" && input.inputOrigin.source === "cli") tasks.authorizeAutomaticPhase(task.id);
53
+ else if (!tasks.automaticStartAllowed(task.id)) return void 0;
54
+ const created = runs.create({
55
+ id: input.runId,
56
+ taskId: task.id,
57
+ executorKind: "agent",
58
+ executorRef: { agentId },
59
+ trigger: { kind: input.context.triggerKind },
60
+ correlationId: input.runId,
61
+ idempotencyKey: input.runId,
62
+ contractVersion: task.latestContractVersion,
63
+ conversationId: input.context.conversationId,
64
+ retryPolicy: { maxAttempts: 3 }
65
+ });
66
+ if (task.phase !== "active") tasks.setLifecycle({
67
+ taskId: task.id,
68
+ expectedVersion: task.version,
69
+ phase: "active",
70
+ runId: created.id
71
+ });
72
+ return created;
65
73
  });
74
+ if (!run) return void 0;
66
75
  }
67
76
  const startingQueuedRun = run.status === "queued";
68
77
  if (startingQueuedRun) {
@@ -117,6 +117,9 @@ var init_task_run_repository = __esmMin((() => {
117
117
  causation_id, idempotency_key, contract_version, conversation_id,
118
118
  queued_at, scheduled_at, retry_policy_json, retry_of_run_id, version
119
119
  ) VALUES (?, ?, ?, ?, ?, 'queued', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`).run(id, input.taskId, rootRunId, input.parentRunId ?? null, input.parentRunId ? 1 : attemptRow.attempt, input.executorKind, JSON.stringify(input.executorRef), JSON.stringify(input.trigger), input.correlationId, input.causationId ?? null, input.idempotencyKey, input.contractVersion, input.conversationId ?? null, now, input.scheduledAt ?? null, JSON.stringify(input.retryPolicy ?? {}), input.retryOfRunId ?? null);
120
+ db.prepare(`UPDATE task_runs SET manual_phase_revision = COALESCE(
121
+ (SELECT manual_phase_revision FROM task_runs WHERE run_id = ?),
122
+ (SELECT manual_phase_revision FROM tasks WHERE task_id = ?)) WHERE run_id = ?`).run(input.retryOfRunId ?? input.parentRunId ?? null, input.taskId, id);
120
123
  this.appendEvent(db, id, "task_run.created", {
121
124
  executorKind: input.executorKind,
122
125
  scheduledAt: input.scheduledAt
@@ -162,7 +165,7 @@ var init_task_run_repository = __esmMin((() => {
162
165
  WHERE wait.task_run_id = task_runs.run_id AND wait.status = 'active'
163
166
  ))
164
167
  )
165
- AND EXISTS (SELECT 1 FROM tasks task WHERE task.task_id = task_runs.task_id AND task.phase != 'closed')
168
+ AND EXISTS (SELECT 1 FROM tasks task WHERE task.task_id = task_runs.task_id AND (task.phase != 'closed' OR task.resolution = 'done'))
166
169
  AND NOT EXISTS (SELECT 1 FROM task_waits wait WHERE wait.task_id = task_runs.task_id AND wait.status = 'active')
167
170
  AND NOT EXISTS (SELECT 1 FROM session_inputs input WHERE input.task_run_id = task_runs.run_id AND input.status IN ('queued','running'))
168
171
  AND (? IS NULL OR executor_kind = ?)
@@ -274,7 +277,7 @@ var init_task_run_repository = __esmMin((() => {
274
277
  const execution = db.prepare("SELECT active_conversation_id FROM task_conversation_state WHERE task_id = ?").get(run.taskId);
275
278
  if (execution?.active_conversation_id && execution.active_conversation_id !== run.conversationId) return false;
276
279
  const task = new TaskRepository().require(run.taskId);
277
- if (task.phase !== "active" || run.contractVersion !== task.latestContractVersion) return false;
280
+ if (task.phase === "closed" && task.resolution !== "done" || run.contractVersion !== task.latestContractVersion) return false;
278
281
  const attempts = Number(run.policySnapshot.continuationAttempts ?? 0);
279
282
  const maxAttempts = Math.max(1, Math.min(3, Number(run.retryPolicy.maxAttempts ?? 1)));
280
283
  if (!Number.isFinite(attempts) || !Number.isFinite(maxAttempts) || attempts >= maxAttempts - 1) return false;
@@ -10,6 +10,7 @@ import { getSessionMetadata } from "../../storage/sqlite/session-read-repository
10
10
  import { init_sqlite } from "../../storage/sqlite/index.js";
11
11
  import { normalizeAgentId } from "../../agent-catalog/id.js";
12
12
  import { init_agent_scope, listAgentEntries } from "../../agent/agent-scope.js";
13
+ import { AgentCatalogService } from "../../agent-catalog/service.js";
13
14
  import { init_paths } from "../../config/paths.js";
14
15
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
15
16
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../../routing/agent-session-key.js";
@@ -23,7 +24,6 @@ import { buildSessionTimeline } from "../../session/transcript-outline.js";
23
24
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
24
25
  import { createCreateShareTool, isShareToolAvailable } from "../../agent/tools/create-share-tool.js";
25
26
  import { evictEmbeddedSessionRunner } from "../../agent/embedded/session-runner.js";
26
- import { AgentCatalogService } from "../../agent-catalog/service.js";
27
27
  import { SessionIndex } from "../../session/manager.js";
28
28
  import "../../session/index.js";
29
29
  import { parseModelRef } from "../../agent/models/selection.js";
@@ -1,6 +1,6 @@
1
1
  import { init_agent_scope, resolveAgentProfileDir } from "../../agent/agent-scope.js";
2
- import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
3
2
  import { DEFAULT_SOUL_FILENAME } from "../../agent/context/workspace.js";
3
+ import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.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.404",
3
+ "version": "0.0.406",
4
4
  "description": "Local-first personal AI with Ada, task delegation, files, projects, workflows, and automations. Use cloud or local models.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -169,11 +169,11 @@
169
169
  "vue": "^3.5.35",
170
170
  "xlsx": "file:web/vendor/xlsx-0.20.3.tgz",
171
171
  "@xopcai/browser-control-contract": "0.1.0",
172
- "@xopcai/endpoint-tools-client": "0.0.0",
173
- "@xopcai/endpoint-tools-protocol": "0.0.0",
174
172
  "@xopcai/computer-control-contract": "0.1.0",
175
- "@xopcai/image-providers": "0.1.0",
173
+ "@xopcai/endpoint-tools-protocol": "0.0.0",
176
174
  "@xopcai/gateway-contract": "0.0.0",
175
+ "@xopcai/image-providers": "0.1.0",
176
+ "@xopcai/endpoint-tools-client": "0.0.0",
177
177
  "@xopcai/realtime-client": "0.0.0",
178
178
  "@xopcai/realtime-protocol": "0.0.0"
179
179
  },
@@ -1 +0,0 @@
1
- import{Gc as e}from"./index-DmURUvvA.js";export{e as Mermaid};
@@ -1 +0,0 @@
1
- import"./index-DmURUvvA.js";