@xopcai/xopc 0.0.199 → 0.0.200

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 (135) 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-Bt70bZjv.js → agent-avatar-dicebear-eMarz29u.js} +1 -1
  4. package/dist/gateway/static/root/assets/agents-DeLW-454.js +68 -0
  5. package/dist/gateway/static/root/assets/{app-management-settings-panel-B4x7JfL8.js → app-management-settings-panel-yfb68wq9.js} +1 -1
  6. package/dist/gateway/static/root/assets/{appearance-settings-Dwdagf-Q.js → appearance-settings-B8SPknFM.js} +1 -1
  7. package/dist/gateway/static/root/assets/{apps-page-DkTiesxe.js → apps-page-Bmor22Ny.js} +1 -1
  8. package/dist/gateway/static/root/assets/{archive-plugin-Cv0VXKLm.js → archive-plugin-DmYRiOP3.js} +1 -1
  9. package/dist/gateway/static/root/assets/{attachment-load-CgidKrXn.js → attachment-load-D66JvcPi.js} +1 -1
  10. package/dist/gateway/static/root/assets/automations-page-Q4e8m11h.js +6 -0
  11. package/dist/gateway/static/root/assets/{binary-plugins-DN3CQgIq.js → binary-plugins-ChIsZArT.js} +1 -1
  12. package/dist/gateway/static/root/assets/{block-editor-BwkSl1F_.js → block-editor-Ck-k_d0Z.js} +5 -5
  13. package/dist/gateway/static/root/assets/browser-settings-page--uVL73Sb.js +8 -0
  14. package/dist/gateway/static/root/assets/{browser-workflows-page-C_I31wLm.js → browser-workflows-page-BC5jm1zL.js} +2 -2
  15. package/dist/gateway/static/root/assets/capabilities-settings-panel-DXpf3QYN.js +7 -0
  16. package/dist/gateway/static/root/assets/capability-presets-settings-panel-NAjCsrTi.js +3 -0
  17. package/dist/gateway/static/root/assets/{channels-settings-DV5BhAeu.js → channels-settings-CiWUo7jW.js} +1 -1
  18. package/dist/gateway/static/root/assets/{connectors-api-5FEBYguL.js → connectors-api-5xiCRVUS.js} +1 -1
  19. package/dist/gateway/static/root/assets/connectors-page-DOwlMseU.js +2 -0
  20. package/dist/gateway/static/root/assets/{cron-expression-SEFx5rnr.js → cron-expression-B3PebXKZ.js} +1 -1
  21. package/dist/gateway/static/root/assets/{date-picker-D4zCUQJL.js → date-picker-C1Vke7Xn.js} +1 -1
  22. package/dist/gateway/static/root/assets/{dependency-picker-DpQAxS2k.js → dependency-picker-FrQ0tsBC.js} +1 -1
  23. package/dist/gateway/static/root/assets/{desktop-pet-B_5G3lQl.js → desktop-pet-CPBAzNJi.js} +1 -1
  24. package/dist/gateway/static/root/assets/{desktop-pet-settings-ClEyoUJe.js → desktop-pet-settings-D6s3glDP.js} +1 -1
  25. package/dist/gateway/static/root/assets/{directory-picker-path-field-AsFWmOjG.js → directory-picker-path-field-CbNQ7QQS.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-debug-page-C22Y2o5l.js → extension-debug-page-dTK14hUv.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-page-C61Ikawk.js → extension-page-Cpdj1Kip.js} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-settings-page-WlWWcDFr.js → extension-settings-page-iNHUZGd5.js} +1 -1
  29. package/dist/gateway/static/root/assets/{gateway-config-api-ByIOMQdc.js → gateway-config-api-SvMvWqMM.js} +1 -1
  30. package/dist/gateway/static/root/assets/{gateway-settings-CzzS9A17.js → gateway-settings-BilR3dGZ.js} +1 -1
  31. package/dist/gateway/static/root/assets/heartbeat-settings-zK40dcQ5.js +1 -0
  32. package/dist/gateway/static/root/assets/home-page-NyXy5MLr.js +3 -0
  33. package/dist/gateway/static/root/assets/{index-CR233S0Q.css → index-Bp8I_eX4.css} +1 -1
  34. package/dist/gateway/static/root/assets/index-CCK8zdlS.js +152 -0
  35. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BD_TFz0_.js → keyboard-shortcuts-settings-nKzsroud.js} +1 -1
  36. package/dist/gateway/static/root/assets/local-app-workbench-page-Ds3sPXTh.js +2 -0
  37. package/dist/gateway/static/root/assets/{local-apps-page-BwbUeLfm.js → local-apps-page-DV1s_FYh.js} +1 -1
  38. package/dist/gateway/static/root/assets/logs-page-Biz4eA02.js +2 -0
  39. package/dist/gateway/static/root/assets/{management-settings-CW2VpqtT.js → management-settings-D7KjYgHu.js} +1 -1
  40. package/dist/gateway/static/root/assets/{markdown-split-B1M9KO16.js → markdown-split-CTYbpkrd.js} +1 -1
  41. package/dist/gateway/static/root/assets/{media-plugins-B_QlNdqZ.js → media-plugins-BXYnaiZ6.js} +1 -1
  42. package/dist/gateway/static/root/assets/{notes-page-BTbD4GmH.js → notes-page-CWWVXpw5.js} +1 -1
  43. package/dist/gateway/static/root/assets/notes-workbench-DnBkQihH.js +4 -0
  44. package/dist/gateway/static/root/assets/{preview-open-alternatives-CeqtArlZ.js → preview-open-alternatives-pimQAkeI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{product-open-page-DnalBZZs.js → product-open-page-BoYSS_YR.js} +1 -1
  46. package/dist/gateway/static/root/assets/project-detail-page-ZO7t1UkB.js +1 -0
  47. package/dist/gateway/static/root/assets/projects-page-By-vq41g.js +1 -0
  48. package/dist/gateway/static/root/assets/remote-access-hub-C0C_Y9d0.js +1 -0
  49. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-cGkBEfg4.js → runtime-tools-settings-panel-DT8flaX1.js} +2 -2
  50. package/dist/gateway/static/root/assets/{schema-form-CmsrLlxu.js → schema-form-DabEP-UI.js} +1 -1
  51. package/dist/gateway/static/root/assets/sessions-page-BNlVwUzV.js +1 -0
  52. package/dist/gateway/static/root/assets/settings-advanced-gate-CxYBQDaM.js +1 -0
  53. package/dist/gateway/static/root/assets/{settings-form-section-DUWCbaMJ.js → settings-form-section-DCsfZAtC.js} +1 -1
  54. package/dist/gateway/static/root/assets/{settings-loading-skeleton-Bvy5rdMY.js → settings-loading-skeleton-Dac6Yd0T.js} +1 -1
  55. package/dist/gateway/static/root/assets/{settings-page-cZSAwsRR.js → settings-page-BDoYoEar.js} +1 -1
  56. package/dist/gateway/static/root/assets/setup-status-panel-DWijJ1rw.js +1 -0
  57. package/dist/gateway/static/root/assets/{share-preview-page-BzA2NCAH.js → share-preview-page-ie9I2_7h.js} +1 -1
  58. package/dist/gateway/static/root/assets/shares-settings-DU9VrJLf.js +1 -0
  59. package/dist/gateway/static/root/assets/skill-reload-api-C5RaIvoE.js +1 -0
  60. package/dist/gateway/static/root/assets/{skills-page-Bvde7_i5.js → skills-page-N0YhaR5S.js} +1 -1
  61. package/dist/gateway/static/root/assets/{skills-page.utils-vXSqHR7g.js → skills-page.utils-C639DLXr.js} +1 -1
  62. package/dist/gateway/static/root/assets/{system-settings-panel-9cQGOGCK.js → system-settings-panel-CpshpQtC.js} +1 -1
  63. package/dist/gateway/static/root/assets/task-detail-page-DsTocYkK.js +1 -0
  64. package/dist/gateway/static/root/assets/{use-autosave-7XfKULPI.js → use-autosave-ms6rDy59.js} +1 -1
  65. package/dist/gateway/static/root/assets/{user-context-page-CZ9m9aC_.js → user-context-page-BUxIemwy.js} +1 -1
  66. package/dist/gateway/static/root/assets/{voice-api-key-field-DXr21v-3.js → voice-api-key-field-CObrQWh2.js} +1 -1
  67. package/dist/gateway/static/root/assets/{work-discovery-overlay-CeG7g_DZ.js → work-discovery-overlay-BBxrnEFt.js} +1 -1
  68. package/dist/gateway/static/root/assets/work-discovery-page-DN3l-HW3.js +1 -0
  69. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DSQQZP9T.js → workflow-run-setup-panel-BxXhe3IV.js} +2 -2
  70. package/dist/gateway/static/root/assets/workflows-page-BCHkjd1i.js +5 -0
  71. package/dist/gateway/static/root/index.html +2 -2
  72. package/dist/package.js +1 -1
  73. package/dist/packages/gateway-contract/src/tasks.js +51 -9
  74. package/dist/src/agent/context/execution-scope.js +3 -1
  75. package/dist/src/agent/tasks/task-judge-service.d.ts +1 -1
  76. package/dist/src/agent/tasks/task-judge-service.js +3 -2
  77. package/dist/src/agent/tools/xopc-use-tool.js +13 -3
  78. package/dist/src/automations/domain/validation.d.ts +0 -12
  79. package/dist/src/automations/draft/automation-draft-validator.d.ts +0 -3
  80. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  81. package/dist/src/gateway/hono/app.js +1 -1
  82. package/dist/src/gateway/hono/routes/agent-stream.js +2 -74
  83. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +62 -0
  84. package/dist/src/gateway/hono/routes/session-input-handler.js +82 -0
  85. package/dist/src/gateway/hono/routes/tasks.js +161 -2
  86. package/dist/src/gateway/service/task-conversation-query-service.d.ts +58 -0
  87. package/dist/src/gateway/service/task-conversation-query-service.js +84 -0
  88. package/dist/src/gateway/service.d.ts +10 -0
  89. package/dist/src/gateway/service.js +70 -37
  90. package/dist/src/projects/project-agent.js +1 -1
  91. package/dist/src/storage/sqlite/migrations/120_task_conversation.sql +112 -0
  92. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  93. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  94. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  95. package/dist/src/storage/sqlite/schema.js +1 -1
  96. package/dist/src/tasks/execution-context.js +8 -4
  97. package/dist/src/tasks/index.d.ts +2 -0
  98. package/dist/src/tasks/index.js +3 -1
  99. package/dist/src/tasks/task-application-service.js +10 -17
  100. package/dist/src/tasks/task-context-assembler.js +9 -4
  101. package/dist/src/tasks/task-context-repository.d.ts +0 -6
  102. package/dist/src/tasks/task-context-repository.js +0 -4
  103. package/dist/src/tasks/task-conversation-repository.d.ts +71 -0
  104. package/dist/src/tasks/task-conversation-repository.js +194 -0
  105. package/dist/src/tasks/task-handoff-service.d.ts +31 -0
  106. package/dist/src/tasks/task-handoff-service.js +143 -0
  107. package/dist/src/tasks/task-read-model-projector.js +1 -5
  108. package/dist/src/tasks/task-repository.d.ts +0 -2
  109. package/dist/src/tasks/task-repository.js +2 -9
  110. package/dist/src/tasks/task-run-coordinator.js +3 -1
  111. package/dist/src/workflows/service/workflow-run-service.js +4 -2
  112. package/package.json +3 -3
  113. package/dist/gateway/static/root/assets/agents-D19uNmJf.js +0 -68
  114. package/dist/gateway/static/root/assets/automations-page-BR6qMOVr.js +0 -6
  115. package/dist/gateway/static/root/assets/browser-settings-page-CDFQWAxI.js +0 -8
  116. package/dist/gateway/static/root/assets/capabilities-settings-panel-D41mssOq.js +0 -7
  117. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BXgCyuu2.js +0 -3
  118. package/dist/gateway/static/root/assets/connectors-page-C_qkEN0T.js +0 -2
  119. package/dist/gateway/static/root/assets/heartbeat-settings-B4A_CXUL.js +0 -1
  120. package/dist/gateway/static/root/assets/home-page-FVGYYPWo.js +0 -3
  121. package/dist/gateway/static/root/assets/index-CGbKTCST.js +0 -152
  122. package/dist/gateway/static/root/assets/local-app-workbench-page-BNpkigNb.js +0 -2
  123. package/dist/gateway/static/root/assets/logs-page-DXP9OQQt.js +0 -2
  124. package/dist/gateway/static/root/assets/notes-workbench-JRiq7QDW.js +0 -4
  125. package/dist/gateway/static/root/assets/project-detail-page-CjWA13aE.js +0 -1
  126. package/dist/gateway/static/root/assets/projects-page-jsCkScbG.js +0 -1
  127. package/dist/gateway/static/root/assets/remote-access-hub-CGPJTEkM.js +0 -1
  128. package/dist/gateway/static/root/assets/sessions-page-BBHzziMd.js +0 -1
  129. package/dist/gateway/static/root/assets/settings-advanced-gate-2cGg8-9h.js +0 -1
  130. package/dist/gateway/static/root/assets/setup-status-panel-Cf06b66-.js +0 -1
  131. package/dist/gateway/static/root/assets/shares-settings-xlNKydYY.js +0 -1
  132. package/dist/gateway/static/root/assets/skill-reload-api-C5Xu93c_.js +0 -1
  133. package/dist/gateway/static/root/assets/task-detail-page-Bkno4tTe.js +0 -1
  134. package/dist/gateway/static/root/assets/work-discovery-page-CQWZD03N.js +0 -1
  135. package/dist/gateway/static/root/assets/workflows-page-Cs-MXFJ1.js +0 -5
@@ -26,7 +26,8 @@ const TaskChangedFieldSchema = z.enum([
26
26
  "context",
27
27
  "runs",
28
28
  "receipts",
29
- "attention"
29
+ "attention",
30
+ "conversation"
30
31
  ]);
31
32
  z.object({
32
33
  taskId: z.string().min(1),
@@ -278,7 +279,7 @@ const TaskCreateRequestSchema = z.object({
278
279
  phase: z.enum(["backlog", "ready"]).default("backlog")
279
280
  }), z.object({
280
281
  mode: z.literal("start"),
281
- executor: TaskExecutorSelectionSchema,
282
+ executor: TaskExecutorSelectionSchema.optional(),
282
283
  scheduleAt: z.number().int().nonnegative().optional()
283
284
  })])
284
285
  }).strict();
@@ -291,8 +292,7 @@ const TaskPatchRequestSchema = z.object({
291
292
  parentTaskId: z.string().trim().min(1).nullable().optional(),
292
293
  priority: TaskPrioritySchema.optional(),
293
294
  dueAt: z.number().int().nonnegative().nullable().optional(),
294
- ownerId: z.string().trim().min(1).nullable().optional(),
295
- delegateAgentId: z.string().trim().min(1).nullable().optional()
295
+ ownerId: z.string().trim().min(1).nullable().optional()
296
296
  }).strict();
297
297
  const TaskWaitInputSchema = z.object({
298
298
  kind: z.enum([
@@ -347,10 +347,6 @@ const TaskCommandSchema = z.discriminatedUnion("type", [
347
347
  waitId: z.string(),
348
348
  resolution: z.unknown().optional()
349
349
  }),
350
- z.object({
351
- type: z.literal("delegate"),
352
- agentId: z.string().optional()
353
- }),
354
350
  z.object({
355
351
  type: z.literal("revise_contract"),
356
352
  contract: TaskContractInputSchema
@@ -383,6 +379,50 @@ z.object({
383
379
  operationalState: TaskOperationalStateSchema,
384
380
  run: TaskRunSchema.optional()
385
381
  });
382
+ const TaskConversationStateSchema = z.object({
383
+ taskId: z.string(),
384
+ activeSessionKey: z.string().optional(),
385
+ currentExecutorAgentId: z.string().optional(),
386
+ assignmentEpoch: z.number().int().nonnegative(),
387
+ status: z.enum(["idle", "active"]),
388
+ updatedAt: z.number().int().nonnegative()
389
+ });
390
+ const TaskSessionLinkSchema = z.object({
391
+ id: z.string(),
392
+ taskId: z.string(),
393
+ sessionKey: z.string(),
394
+ role: z.enum([
395
+ "primary",
396
+ "discussion",
397
+ "execution"
398
+ ]),
399
+ agentId: z.string().optional(),
400
+ runId: z.string().optional(),
401
+ assignmentEpoch: z.number().int().nonnegative(),
402
+ status: z.enum([
403
+ "active",
404
+ "completed",
405
+ "superseded",
406
+ "failed"
407
+ ]),
408
+ startedAt: z.number().int().nonnegative(),
409
+ endedAt: z.number().int().nonnegative().optional(),
410
+ createdAt: z.number().int().nonnegative()
411
+ });
412
+ const TaskHandoffRequestSchema = z.object({
413
+ toAgentId: z.string().trim().min(1),
414
+ expectedVersion: z.number().int().positive(),
415
+ idempotencyKey: z.string().trim().min(1).max(200)
416
+ }).strict();
417
+ z.object({
418
+ ok: z.literal(true),
419
+ task: TaskSchema,
420
+ conversation: TaskConversationStateSchema,
421
+ fromAgentId: z.string().optional(),
422
+ toAgentId: z.string(),
423
+ activeSessionKey: z.string(),
424
+ assignmentEpoch: z.number().int().positive()
425
+ });
386
426
  z.object({
387
427
  ok: z.literal(true),
388
428
  task: TaskSchema,
@@ -392,6 +432,8 @@ z.object({
392
432
  runs: z.array(TaskRunSchema),
393
433
  receipts: z.array(TaskRunReceiptSchema),
394
434
  context: z.array(TaskContextEdgeSchema),
435
+ conversation: TaskConversationStateSchema,
436
+ sessions: z.array(TaskSessionLinkSchema),
395
437
  authorityGrants: z.array(TaskAuthorityGrantSchema),
396
438
  dependencies: z.array(TaskDependencySummarySchema),
397
439
  dependents: z.array(TaskDependencySummarySchema),
@@ -402,4 +444,4 @@ z.object({
402
444
  items: z.array(TaskRunReceiptSchema)
403
445
  });
404
446
  //#endregion
405
- export { TaskBoardPositionRequestSchema, TaskCommandRequestSchema, TaskCommandSchema, TaskContextInputSchema, TaskCreateRequestSchema, TaskDependencyUpdateRequestSchema, TaskExecutorSelectionSchema, TaskPatchRequestSchema };
447
+ export { TaskBoardPositionRequestSchema, TaskCommandRequestSchema, TaskCommandSchema, TaskContextInputSchema, TaskCreateRequestSchema, TaskDependencyUpdateRequestSchema, TaskExecutorSelectionSchema, TaskHandoffRequestSchema, TaskPatchRequestSchema };
@@ -3,6 +3,7 @@ import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
3
3
  import "../../storage/sqlite/index.js";
4
4
  import { sanitizeForPromptLiteral } from "../prompt/sanitize-for-prompt.js";
5
5
  import { TaskRepository } from "../../tasks/task-repository.js";
6
+ import { TaskConversationRepository } from "../../tasks/task-conversation-repository.js";
6
7
  import { TaskReadModelProjector } from "../../tasks/task-read-model-projector.js";
7
8
  import { buildActiveProjectContextForPrompt } from "./project-context.js";
8
9
  //#region src/agent/context/execution-scope.ts
@@ -14,7 +15,8 @@ function bounded(value, max = MAX_OBJECTIVE_TEXT) {
14
15
  return text.length <= max ? text : `${text.slice(0, max - 1).trimEnd()}…`;
15
16
  }
16
17
  function taskObjective(sessionKey) {
17
- const task = new TaskRepository().getBySession(sessionKey);
18
+ const taskId = new TaskConversationRepository().resolveActiveExecutionSession(sessionKey)?.taskId;
19
+ const task = taskId ? new TaskRepository().get(taskId) : void 0;
18
20
  if (!task) return void 0;
19
21
  const contract = task.contract;
20
22
  return {
@@ -1,6 +1,6 @@
1
+ import type { TaskJudgment } from '@xopcai/gateway-contract';
1
2
  import { type Config } from '../../config/schema.js';
2
3
  import type { SessionStore } from '../../session/store.js';
3
- import type { TaskJudgment } from '@xopcai/gateway-contract';
4
4
  import type { ModelManager } from '../models/index.js';
5
5
  export interface TaskTurnCompletion {
6
6
  sessionKey: string;
@@ -4,6 +4,7 @@ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
4
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
5
5
  import { getApiKey, init_providers, resolveModel } from "../../providers/index.js";
6
6
  import { TaskRepository } from "../../tasks/task-repository.js";
7
+ import { TaskConversationRepository } from "../../tasks/task-conversation-repository.js";
7
8
  import { TaskRunRepository } from "../../tasks/task-run-repository.js";
8
9
  import { completeWithResolvedCredentials } from "../../providers/model-call.js";
9
10
  import { TaskApplicationService } from "../../tasks/task-application-service.js";
@@ -61,13 +62,13 @@ var TaskJudgeService = class {
61
62
  #tasks = new TaskRepository();
62
63
  #runs = new TaskRunRepository();
63
64
  #application = new TaskApplicationService();
65
+ #conversations = new TaskConversationRepository();
64
66
  constructor(options) {
65
67
  this.options = options;
66
68
  }
67
69
  async reviewTurn(payload) {
68
70
  if (payload.skipTaskReview || payload.aborted || payload.streamError) return;
69
- const metadata = await this.options.sessionStore.getMetadata(payload.sessionKey);
70
- const taskId = typeof metadata?.customData?.taskId === "string" ? metadata.customData.taskId.trim() : "";
71
+ const taskId = this.#conversations.resolveActiveExecutionSession(payload.sessionKey)?.taskId;
71
72
  if (!taskId) return;
72
73
  const task = this.#tasks.get(taskId);
73
74
  if (!task?.contract) return;
@@ -4,6 +4,7 @@ import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
4
4
  import "../../storage/sqlite/index.js";
5
5
  import { ObjectLinkService } from "../../activity/service.js";
6
6
  import "../../activity/index.js";
7
+ import { getDefaultAgentId, init_resolve_route } from "../../routing/resolve-route.js";
7
8
  import { TaskRepository } from "../../tasks/task-repository.js";
8
9
  import { TaskRunRepository } from "../../tasks/task-run-repository.js";
9
10
  import { TaskReadModelProjector } from "../../tasks/task-read-model-projector.js";
@@ -11,7 +12,7 @@ import { TaskCommandSchema, TaskContextInputSchema } from "../../../packages/gat
11
12
  import { appendProductDeliveryText } from "../../../packages/gateway-contract/src/product-delivery.js";
12
13
  import { CreateAutomationSchema, UpdateAutomationSchema } from "../../automations/domain/validation.js";
13
14
  import "../../automations/index.js";
14
- import { isValidProjectAgentId, normalizeProjectAgentId } from "../../projects/project-agent.js";
15
+ import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "../../projects/project-agent.js";
15
16
  import "../../projects/index.js";
16
17
  import { TaskContextRepository } from "../../tasks/task-context-repository.js";
17
18
  import { enqueueTaskChangedEvent } from "../../tasks/task-change-events.js";
@@ -22,6 +23,7 @@ import "../../tasks/index.js";
22
23
  import { randomUUID } from "node:crypto";
23
24
  import { Type } from "@sinclair/typebox";
24
25
  //#region src/agent/tools/xopc-use-tool.ts
26
+ init_resolve_route();
25
27
  const XopcUseToolSchema = Type.Object({
26
28
  mode: Type.Union([
27
29
  Type.Literal("project"),
@@ -92,7 +94,6 @@ const TASK_COMMANDS = new Set([
92
94
  "reopen",
93
95
  "add_wait",
94
96
  "resolve_wait",
95
- "delegate",
96
97
  "revise_contract"
97
98
  ]);
98
99
  const TASK_CREATE_MODES = new Set(["capture", "start"]);
@@ -1191,13 +1192,22 @@ async function handleTask(command, args, deps, dryRun) {
1191
1192
  contract[field] = value;
1192
1193
  }
1193
1194
  const sessionKey = trimString(args.sessionKey) ?? deps.getCurrentSessionKey?.();
1194
- const agentId = trimString(args.agentId) ?? deps.getCurrentAgentId?.() ?? "main";
1195
+ const config = deps.getConfig?.();
1196
+ const projectService = deps.getProjectService?.();
1197
+ const explicitAgentId = trimString(args.agentId);
1198
+ const agentId = config && projectService ? resolveProjectAgentId({
1199
+ config,
1200
+ projects: projectService,
1201
+ explicitAgentId,
1202
+ projectId
1203
+ }) : explicitAgentId ?? (config ? getDefaultAgentId(config) : deps.getCurrentAgentId?.() ?? "main");
1195
1204
  const input = {
1196
1205
  idempotencyKey: trimString(args.idempotencyKey) ?? randomUUID(),
1197
1206
  title: trimString(args.title) ?? objective,
1198
1207
  priority: priority ?? "normal",
1199
1208
  ...dueAt === void 0 ? {} : { dueAt },
1200
1209
  ...projectId ? { projectId } : {},
1210
+ delegateAgentId: agentId,
1201
1211
  ...locale ? { locale } : {},
1202
1212
  contract: {
1203
1213
  ...contract,
@@ -133,9 +133,6 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
133
133
  type: z.ZodLiteral<"resolve_wait">;
134
134
  waitId: z.ZodString;
135
135
  resolution: z.ZodOptional<z.ZodUnknown>;
136
- }, z.core.$strip>, z.ZodObject<{
137
- type: z.ZodLiteral<"delegate">;
138
- agentId: z.ZodOptional<z.ZodString>;
139
136
  }, z.core.$strip>, z.ZodObject<{
140
137
  type: z.ZodLiteral<"revise_contract">;
141
138
  contract: z.ZodObject<{
@@ -321,9 +318,6 @@ export declare const AutomationSchema: z.ZodObject<{
321
318
  type: z.ZodLiteral<"resolve_wait">;
322
319
  waitId: z.ZodString;
323
320
  resolution: z.ZodOptional<z.ZodUnknown>;
324
- }, z.core.$strip>, z.ZodObject<{
325
- type: z.ZodLiteral<"delegate">;
326
- agentId: z.ZodOptional<z.ZodString>;
327
321
  }, z.core.$strip>, z.ZodObject<{
328
322
  type: z.ZodLiteral<"revise_contract">;
329
323
  contract: z.ZodObject<{
@@ -484,9 +478,6 @@ export declare const CreateAutomationSchema: z.ZodObject<{
484
478
  type: z.ZodLiteral<"resolve_wait">;
485
479
  waitId: z.ZodString;
486
480
  resolution: z.ZodOptional<z.ZodUnknown>;
487
- }, z.core.$strip>, z.ZodObject<{
488
- type: z.ZodLiteral<"delegate">;
489
- agentId: z.ZodOptional<z.ZodString>;
490
481
  }, z.core.$strip>, z.ZodObject<{
491
482
  type: z.ZodLiteral<"revise_contract">;
492
483
  contract: z.ZodObject<{
@@ -674,9 +665,6 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
674
665
  type: z.ZodLiteral<"resolve_wait">;
675
666
  waitId: z.ZodString;
676
667
  resolution: z.ZodOptional<z.ZodUnknown>;
677
- }, z.core.$strip>, z.ZodObject<{
678
- type: z.ZodLiteral<"delegate">;
679
- agentId: z.ZodOptional<z.ZodString>;
680
668
  }, z.core.$strip>, z.ZodObject<{
681
669
  type: z.ZodLiteral<"revise_contract">;
682
670
  contract: z.ZodObject<{
@@ -86,9 +86,6 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
86
86
  type: "resolve_wait";
87
87
  waitId: string;
88
88
  resolution?: unknown;
89
- } | {
90
- type: "delegate";
91
- agentId?: string;
92
89
  } | {
93
90
  type: "revise_contract";
94
91
  contract: {
@@ -52,7 +52,7 @@ async function checkDatabaseSchema(ctx) {
52
52
  id: "database-schema",
53
53
  label: "Database schema",
54
54
  status: "pass",
55
- message: `SQLite schema v${status.dbVersion} (current release v119).`,
55
+ message: `SQLite schema v${status.dbVersion} (current release v120).`,
56
56
  hints: []
57
57
  };
58
58
  }
@@ -175,7 +175,7 @@ function createHonoApp(config) {
175
175
  }));
176
176
  app.use("/api/*", async (c, next) => {
177
177
  const contentType = c.req.header("content-type");
178
- const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
178
+ const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
179
179
  const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
180
180
  return bodyLimit({
181
181
  maxSize,
@@ -1,5 +1,5 @@
1
- import { endpointTurnClaimSchema } from "../../../../packages/endpoint-tools-protocol/src/index.js";
2
1
  import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
2
+ import { submitSessionInput } from "./session-input-handler.js";
3
3
  //#region src/gateway/hono/routes/agent-stream.ts
4
4
  function registerAgentStreamRoutes(authenticated, deps) {
5
5
  const { service, chatRateLimitMiddleware } = deps;
@@ -34,79 +34,7 @@ function registerAgentStreamRoutes(authenticated, deps) {
34
34
  });
35
35
  });
36
36
  authenticated.post("/api/sessions/:sessionKey/inputs", chatRateLimitMiddleware, async (c) => {
37
- const sessionKey = (c.req.param("sessionKey") ?? "").trim();
38
- const body = await c.req.json().catch(() => null);
39
- if (!body || !sessionKey) return c.json({
40
- ok: false,
41
- error: {
42
- code: "BAD_REQUEST",
43
- message: "Invalid request"
44
- }
45
- }, 400);
46
- const attachments = Array.isArray(body.attachments) ? body.attachments : void 0;
47
- const content = typeof body.content === "string" ? body.content : "";
48
- const contentError = validateWebchatContent(content);
49
- if (contentError) return c.json({
50
- ok: false,
51
- error: {
52
- code: "BAD_REQUEST",
53
- message: contentError
54
- }
55
- }, 400);
56
- const attachmentError = validateWebchatAttachments(attachments);
57
- if (attachmentError) return c.json({
58
- ok: false,
59
- error: {
60
- code: "BAD_REQUEST",
61
- message: attachmentError
62
- }
63
- }, 400);
64
- const delivery = body.delivery === "next" || body.delivery === "steer" ? body.delivery : null;
65
- if (!delivery) return c.json({
66
- ok: false,
67
- error: {
68
- code: "BAD_REQUEST",
69
- message: "Missing delivery"
70
- }
71
- }, 400);
72
- const origin = endpointTurnClaimSchema.safeParse(body.origin);
73
- if (!origin.success) return c.json({
74
- ok: false,
75
- error: {
76
- code: "BAD_REQUEST",
77
- message: "Invalid endpoint origin"
78
- }
79
- }, 400);
80
- if (!service.endpointTools.registry.verifyTurnClaim(origin.data.endpointId, origin.data.token)) return c.json({
81
- ok: false,
82
- error: {
83
- code: "INVALID_ENDPOINT",
84
- message: "Endpoint connection is not active"
85
- }
86
- }, 401);
87
- const result = await service.submitSessionInput({
88
- sessionKey,
89
- clientMessageId: typeof body.clientMessageId === "string" ? body.clientMessageId : "",
90
- delivery,
91
- content,
92
- attachments,
93
- thinking: typeof body.thinking === "string" ? body.thinking : void 0,
94
- origin: {
95
- type: "endpoint",
96
- endpointId: origin.data.endpointId
97
- }
98
- });
99
- if (result.ok === false) return c.json({
100
- ok: false,
101
- error: {
102
- code: result.code,
103
- message: "Input was not accepted"
104
- }
105
- }, result.code === "QUEUE_FULL" ? 409 : 400);
106
- return c.json({
107
- ok: true,
108
- payload: result
109
- }, 202);
37
+ return submitSessionInput(c, deps, (c.req.param("sessionKey") ?? "").trim());
110
38
  });
111
39
  authenticated.patch("/api/sessions/:sessionKey/inputs/:inputId", chatRateLimitMiddleware, async (c) => {
112
40
  const sessionKey = (c.req.param("sessionKey") ?? "").trim();
@@ -0,0 +1,62 @@
1
+ import type { Context } from 'hono';
2
+ import type { AuthenticatedRouteDeps } from './deps.js';
3
+ export declare function submitSessionInput(c: Context, deps: AuthenticatedRouteDeps, sessionKey: string): Promise<(Response & import("hono").TypedResponse<{
4
+ ok: false;
5
+ error: {
6
+ code: string;
7
+ message: string;
8
+ };
9
+ }, 400, "json">) | (Response & import("hono").TypedResponse<{
10
+ ok: false;
11
+ error: {
12
+ code: string;
13
+ message: string;
14
+ };
15
+ }, 401, "json">) | (Response & import("hono").TypedResponse<{
16
+ ok: false;
17
+ error: {
18
+ code: "BAD_REQUEST" | "QUEUE_FULL";
19
+ message: string;
20
+ };
21
+ }, 400 | 409, "json">) | (Response & import("hono").TypedResponse<{
22
+ ok: true;
23
+ payload: {
24
+ sessionKey: string;
25
+ ok: true;
26
+ effectiveDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
27
+ state: {
28
+ sessionKey: string;
29
+ revision: number;
30
+ activeRunId?: string;
31
+ activeInputId?: string;
32
+ inputs: {
33
+ id: string;
34
+ sessionKey: string;
35
+ clientMessageId: string;
36
+ requestedDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
37
+ effectiveDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
38
+ status: import("../../../storage/sqlite/session-input-repository.js").SessionInputStatus;
39
+ content: string;
40
+ attachments?: import("hono/dist/types/utils/types.js").JSONValue[];
41
+ thinking?: string;
42
+ origin: {
43
+ type: "endpoint";
44
+ endpointId: string;
45
+ } | {
46
+ type: "channel";
47
+ channel: string;
48
+ } | {
49
+ type: "system";
50
+ source: "cli" | "workflow" | "automation" | "heartbeat" | "internal";
51
+ };
52
+ position: number;
53
+ targetRunId?: string;
54
+ runId?: string;
55
+ version: number;
56
+ error?: string;
57
+ createdAtMs: number;
58
+ updatedAtMs: number;
59
+ }[];
60
+ };
61
+ };
62
+ }, 202, "json">)>;
@@ -0,0 +1,82 @@
1
+ import { endpointTurnClaimSchema } from "../../../../packages/endpoint-tools-protocol/src/index.js";
2
+ import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
3
+ //#region src/gateway/hono/routes/session-input-handler.ts
4
+ async function submitSessionInput(c, deps, sessionKey) {
5
+ const body = await c.req.json().catch(() => null);
6
+ if (!body || !sessionKey) return c.json({
7
+ ok: false,
8
+ error: {
9
+ code: "BAD_REQUEST",
10
+ message: "Invalid request"
11
+ }
12
+ }, 400);
13
+ const attachments = Array.isArray(body.attachments) ? body.attachments : void 0;
14
+ const content = typeof body.content === "string" ? body.content : "";
15
+ const contentError = validateWebchatContent(content);
16
+ if (contentError) return c.json({
17
+ ok: false,
18
+ error: {
19
+ code: "BAD_REQUEST",
20
+ message: contentError
21
+ }
22
+ }, 400);
23
+ const attachmentError = validateWebchatAttachments(attachments);
24
+ if (attachmentError) return c.json({
25
+ ok: false,
26
+ error: {
27
+ code: "BAD_REQUEST",
28
+ message: attachmentError
29
+ }
30
+ }, 400);
31
+ const delivery = body.delivery === "next" || body.delivery === "steer" ? body.delivery : null;
32
+ if (!delivery) return c.json({
33
+ ok: false,
34
+ error: {
35
+ code: "BAD_REQUEST",
36
+ message: "Missing delivery"
37
+ }
38
+ }, 400);
39
+ const origin = endpointTurnClaimSchema.safeParse(body.origin);
40
+ if (!origin.success) return c.json({
41
+ ok: false,
42
+ error: {
43
+ code: "BAD_REQUEST",
44
+ message: "Invalid endpoint origin"
45
+ }
46
+ }, 400);
47
+ if (!deps.service.endpointTools.registry.verifyTurnClaim(origin.data.endpointId, origin.data.token)) return c.json({
48
+ ok: false,
49
+ error: {
50
+ code: "INVALID_ENDPOINT",
51
+ message: "Endpoint connection is not active"
52
+ }
53
+ }, 401);
54
+ const result = await deps.service.submitSessionInput({
55
+ sessionKey,
56
+ clientMessageId: typeof body.clientMessageId === "string" ? body.clientMessageId : "",
57
+ delivery,
58
+ content,
59
+ attachments,
60
+ thinking: typeof body.thinking === "string" ? body.thinking : void 0,
61
+ origin: {
62
+ type: "endpoint",
63
+ endpointId: origin.data.endpointId
64
+ }
65
+ });
66
+ if (result.ok === false) return c.json({
67
+ ok: false,
68
+ error: {
69
+ code: result.code,
70
+ message: "Input was not accepted"
71
+ }
72
+ }, result.code === "QUEUE_FULL" ? 409 : 400);
73
+ return c.json({
74
+ ok: true,
75
+ payload: {
76
+ ...result,
77
+ sessionKey
78
+ }
79
+ }, 202);
80
+ }
81
+ //#endregion
82
+ export { submitSessionInput };