@xopcai/xopc 0.0.197 → 0.0.199
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/{activity-store-BwmdJ5pv.js → activity-store-DYVN1hRp.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C5st7lt5.js → agent-avatar-dicebear-Bt70bZjv.js} +1 -1
- package/dist/gateway/static/root/assets/agents-D19uNmJf.js +68 -0
- package/dist/gateway/static/root/assets/{api-BM1hNzjw.js → api-B8mzbAle.js} +1 -1
- package/dist/gateway/static/root/assets/app-management-settings-panel-B4x7JfL8.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-Dwdagf-Q.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-DkTiesxe.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-qL07mwnY.js → archive-plugin-Cv0VXKLm.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CqSobpdi.js → attachment-load-CgidKrXn.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-BR6qMOVr.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-DBRPyLYE.js → binary-plugins-DN3CQgIq.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-6wG1LU7t.js → block-editor-BwkSl1F_.js} +5 -5
- package/dist/gateway/static/root/assets/browser-settings-page-CDFQWAxI.js +8 -0
- package/dist/gateway/static/root/assets/browser-workflow-inputs-_ndaecsf.js +1 -0
- package/dist/gateway/static/root/assets/{browser-workflows-page-BEu3E0et.js → browser-workflows-page-C_I31wLm.js} +2 -2
- package/dist/gateway/static/root/assets/button-CSEbl4zT.js +1 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-D41mssOq.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-BoOzFotX.js → capability-presets-api-Dy1jZJKs.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-BXgCyuu2.js +3 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-_8IiTxRB.js → channel-recipient-api-D-9qiuio.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-DV5BhAeu.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B4Rbh3bM.js +1 -0
- package/dist/gateway/static/root/assets/connectors-api-5FEBYguL.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-C_qkEN0T.js +2 -0
- package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +1 -0
- package/dist/gateway/static/root/assets/cron-expression-SEFx5rnr.js +2 -0
- package/dist/gateway/static/root/assets/date-picker-D4zCUQJL.js +1 -0
- package/dist/gateway/static/root/assets/dependency-picker-DpQAxS2k.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-CsLR4pWB.js → desktop-pet-B_5G3lQl.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-ClEyoUJe.js +1 -0
- package/dist/gateway/static/root/assets/directory-picker-path-field-AsFWmOjG.js +1 -0
- package/dist/gateway/static/root/assets/dist-BPoKqzeH.js +1 -0
- package/dist/gateway/static/root/assets/dist-DY4Af0fY.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-CD73euAM.js → extension-debug-page-C22Y2o5l.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DAKjpNwd.js → extension-page-C61Ikawk.js} +1 -1
- package/dist/gateway/static/root/assets/extension-settings-page-WlWWcDFr.js +1 -0
- package/dist/gateway/static/root/assets/external-link-DjqjBmc3.js +1 -0
- package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-api-ByIOMQdc.js +1 -0
- package/dist/gateway/static/root/assets/gateway-config-swr-jB0hAhWO.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-CzzS9A17.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry--2njcDpC.js → gateway-startup-retry-C-fRlHCL.js} +1 -1
- package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-B4A_CXUL.js +1 -0
- package/dist/gateway/static/root/assets/home-page-FVGYYPWo.js +3 -0
- package/dist/gateway/static/root/assets/index-CGbKTCST.js +152 -0
- package/dist/gateway/static/root/assets/index-CR233S0Q.css +1 -0
- package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-HMhxgOuD.js → keyboard-shortcuts-settings-BD_TFz0_.js} +1 -1
- package/dist/gateway/static/root/assets/loader-circle-CifKLtgG.js +1 -0
- package/dist/gateway/static/root/assets/local-app-workbench-page-BNpkigNb.js +2 -0
- package/dist/gateway/static/root/assets/local-apps-page-BwbUeLfm.js +1 -0
- package/dist/gateway/static/root/assets/{locale-store-Bjvw7jtg.js → locale-store-xULEcFVs.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DXP9OQQt.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-CW2VpqtT.js +1 -0
- package/dist/gateway/static/root/assets/{markdown-split-DvVBewS4.js → markdown-split-B1M9KO16.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-YVj7NVzD.js → media-plugins-B_QlNdqZ.js} +1 -1
- package/dist/gateway/static/root/assets/messages-3qRsLZuX.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-BDzuL2I9.js → notes-page-BTbD4GmH.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-JRiq7QDW.js +4 -0
- package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +1 -0
- package/dist/gateway/static/root/assets/popover-select-BzdnTy3h.js +1 -0
- package/dist/gateway/static/root/assets/preview-open-alternatives-CeqtArlZ.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-Bwx_CQht.js → product-open-page-DnalBZZs.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-CjWA13aE.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-jsCkScbG.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-CGPJTEkM.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Fe05Nus6.js → runtime-tools-settings-panel-cGkBEfg4.js} +4 -4
- package/dist/gateway/static/root/assets/schema-form-CmsrLlxu.js +1 -0
- package/dist/gateway/static/root/assets/sessions-page-BBHzziMd.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-2cGg8-9h.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-draft-Dy10ldo8.js +1 -0
- package/dist/gateway/static/root/assets/settings-form-section-DUWCbaMJ.js +1 -0
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BRE_-7Da.js → settings-loading-skeleton-Bvy5rdMY.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C1zxCpqB.js → settings-page-cZSAwsRR.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-layout-BRQNel6r.js +1 -0
- package/dist/gateway/static/root/assets/settings-shell-dialog-layer-BU3UuiJr.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-Cf06b66-.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page-BzA2NCAH.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-xlNKydYY.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C5Xu93c_.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Bvde7_i5.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-CYwFWTso.js → skills-page.utils-vXSqHR7g.js} +1 -1
- package/dist/gateway/static/root/assets/system-settings-panel-9cQGOGCK.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-Bkno4tTe.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-DtxpMC5S.js → theme-store-CHQRiuCF.js} +1 -1
- package/dist/gateway/static/root/assets/tool-activity-R8V9l6nk.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-q5-Vfqd8.js +1 -0
- package/dist/gateway/static/root/assets/use-autosave-7XfKULPI.js +1 -0
- package/dist/gateway/static/root/assets/user-context-page-CZ9m9aC_.js +1 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-DXr21v-3.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-overlay-CeG7g_DZ.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-CQWZD03N.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DqIb1oBB.js → workflow-run-setup-panel-DSQQZP9T.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-Cs-MXFJ1.js +5 -0
- package/dist/gateway/static/root/assets/working-directory-picker-modal-D-IgcHPp.js +1 -0
- package/dist/gateway/static/root/index.html +23 -8
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/tasks.js +54 -2
- package/dist/src/agent/agent-manager.d.ts +1 -0
- package/dist/src/agent/agent-manager.js +1 -0
- package/dist/src/agent/service.js +1 -0
- package/dist/src/agent/service.types.d.ts +1 -0
- package/dist/src/agent/tools/factory.d.ts +2 -0
- package/dist/src/agent/tools/factory.js +2 -1
- package/dist/src/agent/tools/xopc-use-tool.d.ts +1 -0
- package/dist/src/agent/tools/xopc-use-tool.js +56 -6
- package/dist/src/automations/domain/validation.d.ts +40 -0
- package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/rules.js +2 -2
- package/dist/src/gateway/hono/app.d.ts +2 -0
- package/dist/src/gateway/hono/app.js +10 -3
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -1
- package/dist/src/gateway/hono/routes/config.js +9 -0
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/projects.js +55 -0
- package/dist/src/gateway/hono/routes/tasks.js +112 -19
- package/dist/src/gateway/host.d.ts +9 -1
- package/dist/src/gateway/host.js +22 -5
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/runtime-config.js +6 -5
- package/dist/src/gateway/security/audit.js +0 -7
- package/dist/src/gateway/server.js +4 -1
- package/dist/src/gateway/service.d.ts +1 -0
- package/dist/src/gateway/service.js +5 -1
- package/dist/src/proactive/actions/service.d.ts +2 -0
- package/dist/src/proactive/actions/service.js +80 -0
- package/dist/src/proactive/execution/insight.js +20 -0
- package/dist/src/proactive/execution/repository.js +8 -2
- package/dist/src/proactive/execution/types.d.ts +14 -0
- package/dist/src/proactive/inbox/repository.js +59 -9
- package/dist/src/proactive/inbox/service.d.ts +2 -2
- package/dist/src/proactive/inbox/service.js +7 -2
- package/dist/src/proactive/inbox/types.d.ts +14 -0
- package/dist/src/proactive/inbox/worker.js +2 -0
- package/dist/src/proactive/scenarios/prompt-composer.js +2 -2
- package/dist/src/storage/sqlite/migrations/118_task_board_rank.sql +6 -0
- package/dist/src/storage/sqlite/migrations/119_proactive_disposition.sql +13 -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/home-query-service.d.ts +5 -0
- package/dist/src/tasks/home-query-service.js +7 -2
- package/dist/src/tasks/index.d.ts +1 -0
- package/dist/src/tasks/index.js +4 -3
- package/dist/src/tasks/project-monitoring-service.d.ts +9 -0
- package/dist/src/tasks/project-monitoring-service.js +41 -3
- package/dist/src/tasks/project-operating-view-service.d.ts +1 -2
- package/dist/src/tasks/project-operating-view-service.js +26 -23
- package/dist/src/tasks/task-application-service.js +99 -6
- package/dist/src/tasks/task-change-events.d.ts +13 -0
- package/dist/src/tasks/task-change-events.js +29 -0
- package/dist/src/tasks/task-read-model-projector.js +2 -1
- package/dist/src/tasks/task-repository.d.ts +7 -0
- package/dist/src/tasks/task-repository.js +29 -6
- package/dist/src/tunnel/enable-lan-pairing.js +15 -26
- package/dist/src/tunnel/pair-context.js +1 -1
- package/dist/src/tunnel/pair-url.js +1 -1
- package/dist/src/tunnel/tunnel-qr.d.ts +0 -7
- package/dist/src/tunnel/tunnel-qr.js +2 -19
- package/package.json +3 -1
- package/dist/gateway/static/root/assets/agents-Baxfj44y.js +0 -68
- package/dist/gateway/static/root/assets/app-management-settings-panel-S8LhoD6G.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-D8Cd5vDP.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-0uCxKyE5.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-XyDat125.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CrYNMR4w.js +0 -8
- package/dist/gateway/static/root/assets/browser-workflow-inputs-Abil4puY.js +0 -1
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CvMcDhGf.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CHJDY-Ih.js +0 -3
- package/dist/gateway/static/root/assets/channels-settings-Ds9BJbcY.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DPaJSYX_.js +0 -1
- package/dist/gateway/static/root/assets/connectors-api-CgWjgPSI.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-NUs-Zf7F.js +0 -2
- package/dist/gateway/static/root/assets/cron-expression-ZdDBAoqA.js +0 -2
- package/dist/gateway/static/root/assets/dependency-picker-BGeB1jpn.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CCjT1bdo.js +0 -1
- package/dist/gateway/static/root/assets/directory-picker-path-field-C-Te1QN3.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BLSNdlgd.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-CQrf0k3D.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-CvgH8IJI.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-SPpnqbjl.js +0 -1
- package/dist/gateway/static/root/assets/home-page-BFoD6047.js +0 -3
- package/dist/gateway/static/root/assets/index-84ys9u-K.js +0 -152
- package/dist/gateway/static/root/assets/index-D-srnucP.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-D5uL2_Fd.js +0 -2
- package/dist/gateway/static/root/assets/local-apps-page-DIWkFa3g.js +0 -1
- package/dist/gateway/static/root/assets/logs-page--6v8qq6y.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-DtEuS-kR.js +0 -1
- package/dist/gateway/static/root/assets/messages-DQ5X6cXp.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-IdjuNXvH.js +0 -4
- package/dist/gateway/static/root/assets/page-tabs-7bSEWfSX.js +0 -1
- package/dist/gateway/static/root/assets/preview-open-alternatives-tgLbHgcV.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-DnJXSuM4.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-DckZKlBI.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CfbUHBUH.js +0 -1
- package/dist/gateway/static/root/assets/schema-form-CFfyC4CB.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BCfCh4My.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-Cbi4FvzO.js +0 -1
- package/dist/gateway/static/root/assets/settings-form-section-gEnEYT_3.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-CRpXF_05.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BcHdpmFf.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-DU8L68A5.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-kjTqH9yY.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-QAGpwzIM.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-lE1-YRdK.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-CVDsiPKn.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DsM13-cy.js +0 -1
- package/dist/gateway/static/root/assets/typed-models-lib-DelyYgoc.js +0 -1
- package/dist/gateway/static/root/assets/use-autosave-C50Mq5yQ.js +0 -1
- package/dist/gateway/static/root/assets/user-context-page-D-VEOt2A.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DYfgTe3Y.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-overlay-DPbujsp3.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-D77opady.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-B9-PLmlX.js +0 -5
- package/dist/src/gateway/ensure-network-cors.d.ts +0 -3
- package/dist/src/gateway/ensure-network-cors.js +0 -23
|
@@ -26,6 +26,7 @@ export interface XopcUseToolDeps {
|
|
|
26
26
|
getNotesService?: () => NotesService | undefined;
|
|
27
27
|
getProjectService?: () => ProjectService | undefined;
|
|
28
28
|
getLocalAppService?: () => LocalAppService | undefined;
|
|
29
|
+
dispatchTaskEvents?: () => void;
|
|
29
30
|
dispatchTaskRuns?: () => void;
|
|
30
31
|
}
|
|
31
32
|
type XopcUseDetails = {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { runWithActivityContext } from "../../activity/context.js";
|
|
2
|
+
import { runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
2
3
|
import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
|
|
3
4
|
import "../../storage/sqlite/index.js";
|
|
4
5
|
import { ObjectLinkService } from "../../activity/service.js";
|
|
@@ -13,6 +14,7 @@ import "../../automations/index.js";
|
|
|
13
14
|
import { isValidProjectAgentId, normalizeProjectAgentId } from "../../projects/project-agent.js";
|
|
14
15
|
import "../../projects/index.js";
|
|
15
16
|
import { TaskContextRepository } from "../../tasks/task-context-repository.js";
|
|
17
|
+
import { enqueueTaskChangedEvent } from "../../tasks/task-change-events.js";
|
|
16
18
|
import { TaskDependencyError, TaskDependencyService } from "../../tasks/task-dependency-service.js";
|
|
17
19
|
import { TaskApplicationService } from "../../tasks/task-application-service.js";
|
|
18
20
|
import { defineTaskContract } from "../../tasks/task-contract-definition.js";
|
|
@@ -1241,6 +1243,7 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1241
1243
|
...created
|
|
1242
1244
|
};
|
|
1243
1245
|
if (created.runId) deps.dispatchTaskRuns?.();
|
|
1246
|
+
else deps.dispatchTaskEvents?.();
|
|
1244
1247
|
return {
|
|
1245
1248
|
ok: true,
|
|
1246
1249
|
task: created.model.task,
|
|
@@ -1274,13 +1277,28 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1274
1277
|
dependsOnTaskIds
|
|
1275
1278
|
};
|
|
1276
1279
|
try {
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
task: dependencies.replace({
|
|
1280
|
+
const task = runSqliteWriteTransaction((db) => {
|
|
1281
|
+
const changed = dependencies.replace({
|
|
1280
1282
|
taskId: id,
|
|
1281
1283
|
dependsOnTaskIds,
|
|
1282
1284
|
expectedVersion
|
|
1283
|
-
})
|
|
1285
|
+
});
|
|
1286
|
+
enqueueTaskChangedEvent(db, {
|
|
1287
|
+
taskId: changed.id,
|
|
1288
|
+
projectId: changed.projectId,
|
|
1289
|
+
version: changed.version,
|
|
1290
|
+
changedFields: ["dependencies"],
|
|
1291
|
+
actor: {
|
|
1292
|
+
kind: "agent",
|
|
1293
|
+
id: deps.getCurrentAgentId?.()
|
|
1294
|
+
}
|
|
1295
|
+
});
|
|
1296
|
+
return changed;
|
|
1297
|
+
});
|
|
1298
|
+
deps.dispatchTaskEvents?.();
|
|
1299
|
+
return {
|
|
1300
|
+
ok: true,
|
|
1301
|
+
task,
|
|
1284
1302
|
dependencies: dependencies.listDependencies(id),
|
|
1285
1303
|
dependents: dependencies.listDependents(id)
|
|
1286
1304
|
};
|
|
@@ -1330,9 +1348,22 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1330
1348
|
action: "add_task_context",
|
|
1331
1349
|
input
|
|
1332
1350
|
};
|
|
1351
|
+
const task = tasks.require(id);
|
|
1352
|
+
const edge = runSqliteWriteTransaction((db) => {
|
|
1353
|
+
const created = context.add(input);
|
|
1354
|
+
enqueueTaskChangedEvent(db, {
|
|
1355
|
+
taskId: task.id,
|
|
1356
|
+
projectId: task.projectId,
|
|
1357
|
+
version: task.version,
|
|
1358
|
+
changedFields: ["context"],
|
|
1359
|
+
actor: input.createdBy
|
|
1360
|
+
});
|
|
1361
|
+
return created;
|
|
1362
|
+
});
|
|
1363
|
+
deps.dispatchTaskEvents?.();
|
|
1333
1364
|
return {
|
|
1334
1365
|
ok: true,
|
|
1335
|
-
edge
|
|
1366
|
+
edge,
|
|
1336
1367
|
context: context.list(id)
|
|
1337
1368
|
};
|
|
1338
1369
|
}
|
|
@@ -1354,7 +1385,24 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1354
1385
|
taskId: id,
|
|
1355
1386
|
edgeId
|
|
1356
1387
|
};
|
|
1357
|
-
|
|
1388
|
+
const task = tasks.get(id);
|
|
1389
|
+
const actor = {
|
|
1390
|
+
kind: "agent",
|
|
1391
|
+
id: deps.getCurrentAgentId?.()
|
|
1392
|
+
};
|
|
1393
|
+
const removed = task ? runSqliteWriteTransaction((db) => {
|
|
1394
|
+
const didRemove = context.remove(id, edgeId);
|
|
1395
|
+
if (didRemove) enqueueTaskChangedEvent(db, {
|
|
1396
|
+
taskId: task.id,
|
|
1397
|
+
projectId: task.projectId,
|
|
1398
|
+
version: task.version,
|
|
1399
|
+
changedFields: ["context"],
|
|
1400
|
+
actor
|
|
1401
|
+
});
|
|
1402
|
+
return didRemove;
|
|
1403
|
+
}) : false;
|
|
1404
|
+
if (removed) deps.dispatchTaskEvents?.();
|
|
1405
|
+
return removed ? {
|
|
1358
1406
|
ok: true,
|
|
1359
1407
|
taskId: id,
|
|
1360
1408
|
edgeId,
|
|
@@ -1418,6 +1466,7 @@ async function handleTask(command, args, deps, dryRun) {
|
|
|
1418
1466
|
...result
|
|
1419
1467
|
};
|
|
1420
1468
|
if (result.runId) deps.dispatchTaskRuns?.();
|
|
1469
|
+
else deps.dispatchTaskEvents?.();
|
|
1421
1470
|
return {
|
|
1422
1471
|
ok: true,
|
|
1423
1472
|
task: result.model.task,
|
|
@@ -1527,6 +1576,7 @@ async function handleTaskRun(command, args, dryRun, deps) {
|
|
|
1527
1576
|
error: result.reason,
|
|
1528
1577
|
...result
|
|
1529
1578
|
};
|
|
1579
|
+
deps.dispatchTaskEvents?.();
|
|
1530
1580
|
return {
|
|
1531
1581
|
ok: true,
|
|
1532
1582
|
run: runs.get(runId),
|
|
@@ -67,6 +67,14 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
|
|
|
67
67
|
kind: z.ZodLiteral<"task_command">;
|
|
68
68
|
taskId: z.ZodString;
|
|
69
69
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
70
|
+
type: z.ZodLiteral<"move">;
|
|
71
|
+
phase: z.ZodEnum<{
|
|
72
|
+
active: "active";
|
|
73
|
+
review: "review";
|
|
74
|
+
ready: "ready";
|
|
75
|
+
backlog: "backlog";
|
|
76
|
+
}>;
|
|
77
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
70
78
|
type: z.ZodLiteral<"mark_ready">;
|
|
71
79
|
}, z.core.$strip>, z.ZodObject<{
|
|
72
80
|
type: z.ZodLiteral<"start">;
|
|
@@ -101,7 +109,9 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
|
|
|
101
109
|
type: z.ZodLiteral<"reopen">;
|
|
102
110
|
phase: z.ZodEnum<{
|
|
103
111
|
active: "active";
|
|
112
|
+
review: "review";
|
|
104
113
|
ready: "ready";
|
|
114
|
+
backlog: "backlog";
|
|
105
115
|
}>;
|
|
106
116
|
}, z.core.$strip>, z.ZodObject<{
|
|
107
117
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -245,6 +255,14 @@ export declare const AutomationSchema: z.ZodObject<{
|
|
|
245
255
|
kind: z.ZodLiteral<"task_command">;
|
|
246
256
|
taskId: z.ZodString;
|
|
247
257
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
258
|
+
type: z.ZodLiteral<"move">;
|
|
259
|
+
phase: z.ZodEnum<{
|
|
260
|
+
active: "active";
|
|
261
|
+
review: "review";
|
|
262
|
+
ready: "ready";
|
|
263
|
+
backlog: "backlog";
|
|
264
|
+
}>;
|
|
265
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
248
266
|
type: z.ZodLiteral<"mark_ready">;
|
|
249
267
|
}, z.core.$strip>, z.ZodObject<{
|
|
250
268
|
type: z.ZodLiteral<"start">;
|
|
@@ -279,7 +297,9 @@ export declare const AutomationSchema: z.ZodObject<{
|
|
|
279
297
|
type: z.ZodLiteral<"reopen">;
|
|
280
298
|
phase: z.ZodEnum<{
|
|
281
299
|
active: "active";
|
|
300
|
+
review: "review";
|
|
282
301
|
ready: "ready";
|
|
302
|
+
backlog: "backlog";
|
|
283
303
|
}>;
|
|
284
304
|
}, z.core.$strip>, z.ZodObject<{
|
|
285
305
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -398,6 +418,14 @@ export declare const CreateAutomationSchema: z.ZodObject<{
|
|
|
398
418
|
kind: z.ZodLiteral<"task_command">;
|
|
399
419
|
taskId: z.ZodString;
|
|
400
420
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
421
|
+
type: z.ZodLiteral<"move">;
|
|
422
|
+
phase: z.ZodEnum<{
|
|
423
|
+
active: "active";
|
|
424
|
+
review: "review";
|
|
425
|
+
ready: "ready";
|
|
426
|
+
backlog: "backlog";
|
|
427
|
+
}>;
|
|
428
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
401
429
|
type: z.ZodLiteral<"mark_ready">;
|
|
402
430
|
}, z.core.$strip>, z.ZodObject<{
|
|
403
431
|
type: z.ZodLiteral<"start">;
|
|
@@ -432,7 +460,9 @@ export declare const CreateAutomationSchema: z.ZodObject<{
|
|
|
432
460
|
type: z.ZodLiteral<"reopen">;
|
|
433
461
|
phase: z.ZodEnum<{
|
|
434
462
|
active: "active";
|
|
463
|
+
review: "review";
|
|
435
464
|
ready: "ready";
|
|
465
|
+
backlog: "backlog";
|
|
436
466
|
}>;
|
|
437
467
|
}, z.core.$strip>, z.ZodObject<{
|
|
438
468
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -578,6 +608,14 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
|
|
|
578
608
|
kind: z.ZodLiteral<"task_command">;
|
|
579
609
|
taskId: z.ZodString;
|
|
580
610
|
command: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
611
|
+
type: z.ZodLiteral<"move">;
|
|
612
|
+
phase: z.ZodEnum<{
|
|
613
|
+
active: "active";
|
|
614
|
+
review: "review";
|
|
615
|
+
ready: "ready";
|
|
616
|
+
backlog: "backlog";
|
|
617
|
+
}>;
|
|
618
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
581
619
|
type: z.ZodLiteral<"mark_ready">;
|
|
582
620
|
}, z.core.$strip>, z.ZodObject<{
|
|
583
621
|
type: z.ZodLiteral<"start">;
|
|
@@ -612,7 +650,9 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
|
|
|
612
650
|
type: z.ZodLiteral<"reopen">;
|
|
613
651
|
phase: z.ZodEnum<{
|
|
614
652
|
active: "active";
|
|
653
|
+
review: "review";
|
|
615
654
|
ready: "ready";
|
|
655
|
+
backlog: "backlog";
|
|
616
656
|
}>;
|
|
617
657
|
}, z.core.$strip>, z.ZodObject<{
|
|
618
658
|
type: z.ZodLiteral<"add_wait">;
|
|
@@ -43,6 +43,9 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
|
|
|
43
43
|
kind: "task_command";
|
|
44
44
|
taskId: string;
|
|
45
45
|
command?: {
|
|
46
|
+
type: "move";
|
|
47
|
+
phase: "active" | "review" | "ready" | "backlog";
|
|
48
|
+
} | {
|
|
46
49
|
type: "mark_ready";
|
|
47
50
|
} | {
|
|
48
51
|
type: "start";
|
|
@@ -70,7 +73,7 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
|
|
|
70
73
|
resolution: "cancelled" | "done" | "duplicate" | "wont_do";
|
|
71
74
|
} | {
|
|
72
75
|
type: "reopen";
|
|
73
|
-
phase: "active" | "ready";
|
|
76
|
+
phase: "active" | "review" | "ready" | "backlog";
|
|
74
77
|
} | {
|
|
75
78
|
type: "add_wait";
|
|
76
79
|
wait: {
|
|
@@ -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 v119).`,
|
|
56
56
|
hints: []
|
|
57
57
|
};
|
|
58
58
|
}
|
package/dist/src/config/rules.js
CHANGED
|
@@ -2,6 +2,8 @@ import { Hono } from 'hono';
|
|
|
2
2
|
import type { GatewayService } from '../service.js';
|
|
3
3
|
export interface HonoAppConfig {
|
|
4
4
|
service: GatewayService;
|
|
5
|
+
/** Actual host selected for this process; bind config changes take effect after restart. */
|
|
6
|
+
listenHost?: string;
|
|
5
7
|
}
|
|
6
8
|
/**
|
|
7
9
|
* Extension sandbox HTML under `/api/extensions/:id/assets/*` ships its own CSP
|
|
@@ -10,7 +10,7 @@ import { buildGatewayConsoleCspHeader } from "../security/csp.js";
|
|
|
10
10
|
import { checkBrowserOrigin } from "../security/origin-check.js";
|
|
11
11
|
import { auth } from "./middleware/auth.js";
|
|
12
12
|
import { operatorScopes } from "./middleware/scopes.js";
|
|
13
|
-
import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
|
|
13
|
+
import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
|
|
14
14
|
import { logContextMiddleware } from "./middleware/log-context.js";
|
|
15
15
|
import { logger } from "./middleware/logger.js";
|
|
16
16
|
import { routeErrorMiddleware } from "./middleware/route-errors.js";
|
|
@@ -42,10 +42,11 @@ function createHonoApp(config) {
|
|
|
42
42
|
const { service } = config;
|
|
43
43
|
const app = new Hono();
|
|
44
44
|
const gatewayPort = resolveGatewayServiceListenPort(service);
|
|
45
|
+
const gatewayBindHost = config.listenHost ?? resolveGatewayEffectiveHost(service.currentConfig);
|
|
45
46
|
const resolveBrowserOrigins = () => resolveAllowedBrowserOrigins({
|
|
46
47
|
configuredOrigins: service.currentConfig.gateway.corsOrigins,
|
|
47
48
|
port: gatewayPort,
|
|
48
|
-
bindHost:
|
|
49
|
+
bindHost: gatewayBindHost,
|
|
49
50
|
tunnelPublicUrl: loadTunnelState()?.publicUrl,
|
|
50
51
|
reverseProxyPublicUrl: resolveReverseProxyPublicUrl(service.currentConfig)
|
|
51
52
|
});
|
|
@@ -153,6 +154,7 @@ function createHonoApp(config) {
|
|
|
153
154
|
if (/^\/api\/notes\/[^/]+\/media$/.test(path)) return true;
|
|
154
155
|
return path === "/api/notes" && contentType?.includes("multipart/form-data") === true;
|
|
155
156
|
};
|
|
157
|
+
const isProjectFileUploadRequest = (path, method, contentType) => method === "POST" && /^\/api\/projects\/[^/]+\/files\/upload$/.test(path) && contentType?.includes("multipart/form-data") === true;
|
|
156
158
|
const discussionUploadBodyMax = (path, method, contentType) => {
|
|
157
159
|
if (method !== "PUT" || contentType?.includes("multipart/form-data") !== true) return void 0;
|
|
158
160
|
if (/^\/api\/discussions\/[^/]+\/recording$/.test(path)) return NOTE_MEDIA_BODY_MAX;
|
|
@@ -173,7 +175,7 @@ function createHonoApp(config) {
|
|
|
173
175
|
}));
|
|
174
176
|
app.use("/api/*", async (c, next) => {
|
|
175
177
|
const contentType = c.req.header("content-type");
|
|
176
|
-
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 : 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 === "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;
|
|
177
179
|
const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
|
|
178
180
|
return bodyLimit({
|
|
179
181
|
maxSize,
|
|
@@ -211,6 +213,10 @@ function createHonoApp(config) {
|
|
|
211
213
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
212
214
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
213
215
|
}) });
|
|
216
|
+
const taskRateLimitMiddleware = createTaskRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
217
|
+
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
218
|
+
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
219
|
+
}) });
|
|
214
220
|
const channelRateLimitMiddleware = createChannelRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
215
221
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
216
222
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
@@ -219,6 +225,7 @@ function createHonoApp(config) {
|
|
|
219
225
|
service,
|
|
220
226
|
strictRateLimitMiddleware,
|
|
221
227
|
chatRateLimitMiddleware,
|
|
228
|
+
taskRateLimitMiddleware,
|
|
222
229
|
xopcCloudPollRateLimitMiddleware: createXopcCloudPollRateLimitMiddleware({ getTrustedProxyContext: () => ({
|
|
223
230
|
trustedProxies: service.currentConfig.gateway?.trustedProxies,
|
|
224
231
|
allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
|
|
@@ -16,6 +16,10 @@ export declare function createChatRateLimitMiddleware(deps: StrictRateLimitDeps)
|
|
|
16
16
|
error: string;
|
|
17
17
|
code: string;
|
|
18
18
|
}, 429, "json">>;
|
|
19
|
+
export declare function createTaskRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
|
|
20
|
+
error: string;
|
|
21
|
+
code: string;
|
|
22
|
+
}, 429, "json">>;
|
|
19
23
|
export declare function createXopcCloudPollRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
|
|
20
24
|
error: string;
|
|
21
25
|
code: string;
|
|
@@ -70,6 +70,13 @@ function createChatRateLimitMiddleware(deps) {
|
|
|
70
70
|
reason: "chat_rate_limit_exceeded"
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
function createTaskRateLimitMiddleware(deps) {
|
|
74
|
+
return createClientRateLimitMiddleware(deps, {
|
|
75
|
+
limiter: () => buckets.taskApi(),
|
|
76
|
+
exceededMessage: "Task API rate limit exceeded",
|
|
77
|
+
reason: "task_rate_limit_exceeded"
|
|
78
|
+
});
|
|
79
|
+
}
|
|
73
80
|
function createXopcCloudPollRateLimitMiddleware(deps) {
|
|
74
81
|
return createClientRateLimitMiddleware(deps, {
|
|
75
82
|
limiter: () => buckets.xopcCloudPoll(),
|
|
@@ -85,4 +92,4 @@ function createChannelRateLimitMiddleware(deps) {
|
|
|
85
92
|
});
|
|
86
93
|
}
|
|
87
94
|
//#endregion
|
|
88
|
-
export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
|
|
95
|
+
export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
|
|
@@ -176,12 +176,13 @@ async function applyMiscPatch(config, body) {
|
|
|
176
176
|
function validateGatewayAfterPatch(config, body) {
|
|
177
177
|
if (body.gateway === void 0) return PATCH_OK;
|
|
178
178
|
try {
|
|
179
|
+
const port = config.gateway?.port ?? 18790;
|
|
179
180
|
const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });
|
|
180
181
|
assertGatewayAuthConfigured(auth);
|
|
181
182
|
assertGatewayRuntimeConfig({
|
|
182
183
|
cfg: config,
|
|
183
184
|
auth,
|
|
184
|
-
port
|
|
185
|
+
port
|
|
185
186
|
});
|
|
186
187
|
} catch (err) {
|
|
187
188
|
return patchError(err instanceof Error ? err.message : String(err));
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { enumerateLanGatewayCandidates } from "../../host.js";
|
|
1
2
|
import { buildSafeWebConfigPayload } from "../lib/config-payload.js";
|
|
2
3
|
import { applyAgentsPatch } from "./config-patch/agents.js";
|
|
3
4
|
import { applyChannelsPatch } from "./config-patch/channels.js";
|
|
@@ -39,6 +40,14 @@ function registerConfigRoutes(authenticated, deps) {
|
|
|
39
40
|
payload: { config: safeConfig }
|
|
40
41
|
});
|
|
41
42
|
});
|
|
43
|
+
authenticated.get("/api/gateway/cors-origin-candidates", (c) => {
|
|
44
|
+
const requestedPort = Number(c.req.query("port"));
|
|
45
|
+
const port = Number.isInteger(requestedPort) && requestedPort >= 1 && requestedPort <= 65535 ? requestedPort : service.currentConfig.gateway?.port ?? 18790;
|
|
46
|
+
return c.json({
|
|
47
|
+
ok: true,
|
|
48
|
+
payload: { candidates: enumerateLanGatewayCandidates(port) }
|
|
49
|
+
});
|
|
50
|
+
});
|
|
42
51
|
authenticated.patch("/api/config", strictRateLimitMiddleware, async (c) => {
|
|
43
52
|
const body = await c.req.json();
|
|
44
53
|
const config = service.currentConfig;
|
|
@@ -4,6 +4,7 @@ export interface AuthenticatedRouteDeps {
|
|
|
4
4
|
service: GatewayService;
|
|
5
5
|
strictRateLimitMiddleware: MiddlewareHandler;
|
|
6
6
|
chatRateLimitMiddleware: MiddlewareHandler;
|
|
7
|
+
taskRateLimitMiddleware?: MiddlewareHandler;
|
|
7
8
|
xopcCloudPollRateLimitMiddleware: MiddlewareHandler;
|
|
8
9
|
channelRateLimitMiddleware?: MiddlewareHandler;
|
|
9
10
|
}
|
|
@@ -1128,6 +1128,61 @@ function registerProjectsRoutes(authenticated, deps) {
|
|
|
1128
1128
|
}, 500);
|
|
1129
1129
|
}
|
|
1130
1130
|
});
|
|
1131
|
+
authenticated.post("/api/projects/:id/files/upload", async (c) => {
|
|
1132
|
+
let body;
|
|
1133
|
+
try {
|
|
1134
|
+
body = await c.req.parseBody();
|
|
1135
|
+
} catch {
|
|
1136
|
+
return c.json({
|
|
1137
|
+
ok: false,
|
|
1138
|
+
error: { message: "Invalid multipart body" }
|
|
1139
|
+
}, 400);
|
|
1140
|
+
}
|
|
1141
|
+
const file = body.file;
|
|
1142
|
+
if (!(file instanceof File)) return c.json({
|
|
1143
|
+
ok: false,
|
|
1144
|
+
error: { message: "Missing file" }
|
|
1145
|
+
}, 400);
|
|
1146
|
+
const requestedPath = typeof body.path === "string" ? body.path.trim() : "";
|
|
1147
|
+
if (!requestedPath) return c.json({
|
|
1148
|
+
ok: false,
|
|
1149
|
+
error: { message: "Missing path" }
|
|
1150
|
+
}, 400);
|
|
1151
|
+
const resolved = await resolveProjectWorkspaceWritePath(service, c.req.param("id"), requestedPath);
|
|
1152
|
+
if (resolved.ok === false) return c.json({
|
|
1153
|
+
ok: false,
|
|
1154
|
+
error: { message: resolved.error }
|
|
1155
|
+
}, resolved.status);
|
|
1156
|
+
if (resolved.existingStat) return c.json({
|
|
1157
|
+
ok: false,
|
|
1158
|
+
error: { message: "File already exists" }
|
|
1159
|
+
}, 409);
|
|
1160
|
+
try {
|
|
1161
|
+
await writeFile(resolved.absolutePath, Buffer.from(await file.arrayBuffer()), { flag: "wx" });
|
|
1162
|
+
const entryStat = await stat(resolved.absolutePath);
|
|
1163
|
+
return c.json({
|
|
1164
|
+
ok: true,
|
|
1165
|
+
entry: {
|
|
1166
|
+
name: path$1.basename(resolved.relativePath),
|
|
1167
|
+
path: resolved.relativePath,
|
|
1168
|
+
absolutePath: resolved.absolutePath,
|
|
1169
|
+
type: "file",
|
|
1170
|
+
size: entryStat.size,
|
|
1171
|
+
updatedAt: entryStat.mtime.toISOString()
|
|
1172
|
+
}
|
|
1173
|
+
}, 201);
|
|
1174
|
+
} catch (err) {
|
|
1175
|
+
log.error({
|
|
1176
|
+
err,
|
|
1177
|
+
projectId: resolved.projectId,
|
|
1178
|
+
path: resolved.absolutePath
|
|
1179
|
+
}, "project file upload failed");
|
|
1180
|
+
return c.json({
|
|
1181
|
+
ok: false,
|
|
1182
|
+
error: { message: "Upload failed" }
|
|
1183
|
+
}, 500);
|
|
1184
|
+
}
|
|
1185
|
+
});
|
|
1131
1186
|
authenticated.post("/api/projects/:id/sessions/:sessionKey", async (c) => {
|
|
1132
1187
|
try {
|
|
1133
1188
|
service.projects.attachSession(c.req.param("sessionKey"), c.req.param("id"));
|