@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bt70bZjv.js → agent-avatar-dicebear-eMarz29u.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DeLW-454.js +68 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-B4x7JfL8.js → app-management-settings-panel-yfb68wq9.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Dwdagf-Q.js → appearance-settings-B8SPknFM.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-DkTiesxe.js → apps-page-Bmor22Ny.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-Cv0VXKLm.js → archive-plugin-DmYRiOP3.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CgidKrXn.js → attachment-load-D66JvcPi.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-Q4e8m11h.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DN3CQgIq.js → binary-plugins-ChIsZArT.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BwkSl1F_.js → block-editor-Ck-k_d0Z.js} +5 -5
- package/dist/gateway/static/root/assets/browser-settings-page--uVL73Sb.js +8 -0
- package/dist/gateway/static/root/assets/{browser-workflows-page-C_I31wLm.js → browser-workflows-page-BC5jm1zL.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-DXpf3QYN.js +7 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-NAjCsrTi.js +3 -0
- package/dist/gateway/static/root/assets/{channels-settings-DV5BhAeu.js → channels-settings-CiWUo7jW.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-5FEBYguL.js → connectors-api-5xiCRVUS.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DOwlMseU.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-SEFx5rnr.js → cron-expression-B3PebXKZ.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-D4zCUQJL.js → date-picker-C1Vke7Xn.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-DpQAxS2k.js → dependency-picker-FrQ0tsBC.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-B_5G3lQl.js → desktop-pet-CPBAzNJi.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-ClEyoUJe.js → desktop-pet-settings-D6s3glDP.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-AsFWmOjG.js → directory-picker-path-field-CbNQ7QQS.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-C22Y2o5l.js → extension-debug-page-dTK14hUv.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C61Ikawk.js → extension-page-Cpdj1Kip.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-WlWWcDFr.js → extension-settings-page-iNHUZGd5.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-ByIOMQdc.js → gateway-config-api-SvMvWqMM.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-CzzS9A17.js → gateway-settings-BilR3dGZ.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-zK40dcQ5.js +1 -0
- package/dist/gateway/static/root/assets/home-page-NyXy5MLr.js +3 -0
- package/dist/gateway/static/root/assets/{index-CR233S0Q.css → index-Bp8I_eX4.css} +1 -1
- package/dist/gateway/static/root/assets/index-CCK8zdlS.js +152 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BD_TFz0_.js → keyboard-shortcuts-settings-nKzsroud.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Ds3sPXTh.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-BwbUeLfm.js → local-apps-page-DV1s_FYh.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-Biz4eA02.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-CW2VpqtT.js → management-settings-D7KjYgHu.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-B1M9KO16.js → markdown-split-CTYbpkrd.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-B_QlNdqZ.js → media-plugins-BXYnaiZ6.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-BTbD4GmH.js → notes-page-CWWVXpw5.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-DnBkQihH.js +4 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CeqtArlZ.js → preview-open-alternatives-pimQAkeI.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-DnalBZZs.js → product-open-page-BoYSS_YR.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-ZO7t1UkB.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-By-vq41g.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-C0C_Y9d0.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-cGkBEfg4.js → runtime-tools-settings-panel-DT8flaX1.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-CmsrLlxu.js → schema-form-DabEP-UI.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-BNlVwUzV.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CxYBQDaM.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DUWCbaMJ.js → settings-form-section-DCsfZAtC.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-Bvy5rdMY.js → settings-loading-skeleton-Dac6Yd0T.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-cZSAwsRR.js → settings-page-BDoYoEar.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-DWijJ1rw.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-BzA2NCAH.js → share-preview-page-ie9I2_7h.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DU9VrJLf.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C5RaIvoE.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Bvde7_i5.js → skills-page-N0YhaR5S.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-vXSqHR7g.js → skills-page.utils-C639DLXr.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-9cQGOGCK.js → system-settings-panel-CpshpQtC.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-DsTocYkK.js +1 -0
- package/dist/gateway/static/root/assets/{use-autosave-7XfKULPI.js → use-autosave-ms6rDy59.js} +1 -1
- package/dist/gateway/static/root/assets/{user-context-page-CZ9m9aC_.js → user-context-page-BUxIemwy.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-DXr21v-3.js → voice-api-key-field-CObrQWh2.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-CeG7g_DZ.js → work-discovery-overlay-BBxrnEFt.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-DN3l-HW3.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DSQQZP9T.js → workflow-run-setup-panel-BxXhe3IV.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-BCHkjd1i.js +5 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/tasks.js +51 -9
- package/dist/src/agent/context/execution-scope.js +3 -1
- package/dist/src/agent/tasks/task-judge-service.d.ts +1 -1
- package/dist/src/agent/tasks/task-judge-service.js +3 -2
- package/dist/src/agent/tools/xopc-use-tool.js +13 -3
- package/dist/src/automations/domain/validation.d.ts +0 -12
- package/dist/src/automations/draft/automation-draft-validator.d.ts +0 -3
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/gateway/hono/app.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +2 -74
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +62 -0
- package/dist/src/gateway/hono/routes/session-input-handler.js +82 -0
- package/dist/src/gateway/hono/routes/tasks.js +161 -2
- package/dist/src/gateway/service/task-conversation-query-service.d.ts +58 -0
- package/dist/src/gateway/service/task-conversation-query-service.js +84 -0
- package/dist/src/gateway/service.d.ts +10 -0
- package/dist/src/gateway/service.js +70 -37
- package/dist/src/projects/project-agent.js +1 -1
- package/dist/src/storage/sqlite/migrations/120_task_conversation.sql +112 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tasks/execution-context.js +8 -4
- package/dist/src/tasks/index.d.ts +2 -0
- package/dist/src/tasks/index.js +3 -1
- package/dist/src/tasks/task-application-service.js +10 -17
- package/dist/src/tasks/task-context-assembler.js +9 -4
- package/dist/src/tasks/task-context-repository.d.ts +0 -6
- package/dist/src/tasks/task-context-repository.js +0 -4
- package/dist/src/tasks/task-conversation-repository.d.ts +71 -0
- package/dist/src/tasks/task-conversation-repository.js +194 -0
- package/dist/src/tasks/task-handoff-service.d.ts +31 -0
- package/dist/src/tasks/task-handoff-service.js +143 -0
- package/dist/src/tasks/task-read-model-projector.js +1 -5
- package/dist/src/tasks/task-repository.d.ts +0 -2
- package/dist/src/tasks/task-repository.js +2 -9
- package/dist/src/tasks/task-run-coordinator.js +3 -1
- package/dist/src/workflows/service/workflow-run-service.js +4 -2
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agents-D19uNmJf.js +0 -68
- package/dist/gateway/static/root/assets/automations-page-BR6qMOVr.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CDFQWAxI.js +0 -8
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D41mssOq.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BXgCyuu2.js +0 -3
- package/dist/gateway/static/root/assets/connectors-page-C_qkEN0T.js +0 -2
- package/dist/gateway/static/root/assets/heartbeat-settings-B4A_CXUL.js +0 -1
- package/dist/gateway/static/root/assets/home-page-FVGYYPWo.js +0 -3
- package/dist/gateway/static/root/assets/index-CGbKTCST.js +0 -152
- package/dist/gateway/static/root/assets/local-app-workbench-page-BNpkigNb.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-DXP9OQQt.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-JRiq7QDW.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CjWA13aE.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-jsCkScbG.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CGPJTEkM.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BBHzziMd.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-2cGg8-9h.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cf06b66-.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-xlNKydYY.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-C5Xu93c_.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-Bkno4tTe.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-CQWZD03N.js +0 -1
- 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
|
|
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
|
|
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
|
|
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<{
|
|
@@ -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
|
|
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
|
-
|
|
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 };
|