@xopcai/xopc 0.0.176 → 0.0.178
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-DsFM1upC.js → activity-store-BzGX__8I.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DvdMLOga.js → agent-avatar-dicebear-BzxntcaZ.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DC9F12Kw.js +2 -0
- package/dist/gateway/static/root/assets/{api-BdPLCCBm.js → api-hi6f2Xtp.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DMLDOHul.js → app-management-settings-panel-fTY1F7ac.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DbI9foFR.js → appearance-settings-BZ-IxQfB.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-5bKr05Fa.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Dfdxuwvb.js → archive-plugin-ZSLLG8wB.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Dn3RlnYD.js → attachment-load-D4YktqIF.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-Bc0Y7A9u.js → automation-suggestion-card-B7mxFRtf.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-Dg6dmt5g.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-0XtB-xC0.js → binary-plugins-BIkPxfxj.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C4fXWbEE.js → block-editor-Q3v_YQom.js} +6 -6
- package/dist/gateway/static/root/assets/{browser-settings-page-lC86-drr.js → browser-settings-page-BHoo6Rpq.js} +4 -4
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-CZmzNymN.js → browser-workflow-inputs-M5lTEW1I.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-CBYM9HqG.js → browser-workflows-page-B3T1KYk4.js} +2 -2
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BlsqN8Fu.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-BiJxmmhW.js → capability-presets-api-DE09c0VB.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-DJeT8_B4.js +1 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-BKTUZDp-.js → channel-recipient-api-CFR5FBfS.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-C4VVjYEm.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-vdf8kB16.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-Pr4RIKjj.js → connector-logo-B1mD-3pM.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DNcrDThX.js +2 -0
- package/dist/gateway/static/root/assets/desktop-pet-B1urphOZ.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CEQacUDF.js → desktop-pet-settings-DTL6J3EP.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DWnxdZtc.js → directory-picker-path-field-BYQJ2XUS.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-D2e2w2Ho.js → dreaming-settings-BXcb8fwx.js} +3 -3
- package/dist/gateway/static/root/assets/{extension-debug-page-BLjTGbv3.js → extension-debug-page-O1Xu1r4Q.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-D2_UC6hy.js → extension-page-C2Jraq8l.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BsH6o_PX.js → extension-settings-page-DcXQDTpG.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-C-DkC6UJ.js → gateway-config-api-DmPIZrvg.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DEOGiimF.js → gateway-settings-DmObBx9b.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BlSLh1TF.js → gateway-startup-retry-BZEkOdPm.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-CSFcRE_N.js → goal-create-dialog-BRhmmBe9.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-C1k7_s_O.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-CcdS9qek.js → goals-config-api-Fwu1wjEP.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-BAcErdch.js → goals-page-hOu9uA3q.js} +2 -2
- package/dist/gateway/static/root/assets/{goals-settings-BY7crl0z.js → goals-settings-DY-JjvHz.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DtTkS0gs.js → heartbeat-settings-BtKu2NWT.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-WGgkbwDZ.js → image-generation-api-05Gg8wsU.js} +1 -1
- package/dist/gateway/static/root/assets/{index-2UImfRDC.js → index-C0CGebQ1.js} +65 -65
- package/dist/gateway/static/root/assets/index-eqq25gvV.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C5lpWQ3f.js → keyboard-shortcuts-settings-CfmDR9Sc.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-EjsNT7nJ.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-b05wWvXG.js → local-apps-page-Df8BW1A_.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-sToMfHX_.js → locale-store-CTwSy7yW.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-cDE1jLJv.js → logs-page-Dswjlraa.js} +3 -3
- package/dist/gateway/static/root/assets/{markdown-split-0gPVst5y.js → markdown-split-B3FvKbaP.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Rxyq_KTm.js → media-plugins-DsjrvvB6.js} +1 -1
- package/dist/gateway/static/root/assets/messages-DP6tPKk-.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-DRhNDl_Q.js → notes-page-tuzIwy3c.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-DSh3-hMY.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-cOEOQqHh.js → page-tabs-ke9s4nYi.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BopOLFvu.js → preview-open-alternatives-Cp1eI4S9.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-DWVPmmOq.js → product-open-page-dXQCMAtH.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-D0QPRHR_.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-CI5Vz62F.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-S1jpzBS5.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BfZmKe1t.js → save-bar-controls-Bl30zjHc.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-Cpi4jCRV.js → schedule-field-DqhmXQKo.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-OXFkcZQe.js → schema-form-DkUCy6vf.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-CTm66k7h.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CU52AUVD.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-BwqkZCHJ.js → settings-form-section-C6ZbNpdy.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BbqH_S3Y.js → settings-loading-skeleton-Bk58_cr7.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BoxC-JSa.js → settings-page-k8iE_NdX.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-Ddu2iGaW.js → settings-page-layout-DgFSya2e.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-z1Lwv0js.js → setup-status-panel-B_KDlyZA.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-CVazOFjy.js → share-preview-page-CV7nL_J9.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DK6XK95e.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-Bvv_u4ii.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-BGHvVbay.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-DgyB1tSo.js → skills-page.utils-kahBIHg0.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BoLSQL65.js → system-settings-panel-JV3-MG5F.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-CBNcGOfj.js → theme-store-DFLyzoLO.js} +1 -1
- package/dist/gateway/static/root/assets/{time-picker-gochWrny.js → time-picker-XwpxdZFr.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-DvRnr7YB.js → typed-models-lib-60Aqo-UJ.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CA9BFVB7.js → use-channel-catalog-CnTkHDnw.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-DBCMk-Vn.js +1 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-v8tgylEZ.js → voice-api-key-field-CNa8qUgS.js} +1 -1
- package/dist/gateway/static/root/assets/work-discovery-page-C1UIdsCl.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-DEAQepB8.js +1 -0
- package/dist/gateway/static/root/assets/work-page-D5qYmCTq.js +3 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CC3cJn5k.js → workflow-run-setup-panel-yV_x595t.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-yrK17ZZ5.js +11 -0
- package/dist/gateway/static/root/index.html +7 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/embedded/model-runtime.js +3 -0
- package/dist/src/agent/embedded/run-for-session.js +18 -5
- package/dist/src/agent/embedded/run-turn.js +6 -3
- package/dist/src/agent/embedded/types.d.ts +2 -0
- package/dist/src/automations/service/automation-service.d.ts +3 -0
- package/dist/src/automations/service/automation-service.js +37 -7
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/connectors/composio-sessions.js +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +18 -2
- package/dist/src/gateway/hono/routes/home.js +19 -0
- package/dist/src/gateway/hono/routes/index.js +2 -2
- package/dist/src/gateway/hono/routes/local-apps.js +1 -1
- package/dist/src/gateway/hono/routes/proactive.d.ts +4 -0
- package/dist/src/gateway/hono/routes/proactive.js +157 -0
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/update.js +2 -2
- package/dist/src/gateway/index.js +1 -1
- package/dist/src/gateway/run-loop.js +1 -1
- package/dist/src/gateway/service.d.ts +10 -1
- package/dist/src/gateway/service.js +36 -36
- package/dist/src/infra/gateway-processes.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +2 -2
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/mobile/notification-service.d.ts +1 -0
- package/dist/src/mobile/notification-service.js +38 -18
- package/dist/src/mobile/notification-types.d.ts +2 -2
- package/dist/src/proactive/events/envelope.d.ts +2 -0
- package/dist/src/proactive/events/envelope.js +54 -0
- package/dist/src/proactive/events/publisher.d.ts +4 -0
- package/dist/src/proactive/events/repository.d.ts +9 -0
- package/dist/src/proactive/events/repository.js +62 -0
- package/dist/src/proactive/events/types.d.ts +44 -0
- package/dist/src/proactive/events/types.js +15 -0
- package/dist/src/proactive/execution/agent-executor.d.ts +16 -0
- package/dist/src/proactive/execution/agent-executor.js +104 -0
- package/dist/src/proactive/execution/context.d.ts +31 -0
- package/dist/src/proactive/execution/context.js +72 -0
- package/dist/src/proactive/execution/insight.d.ts +4 -0
- package/dist/src/proactive/execution/insight.js +74 -0
- package/dist/src/proactive/execution/repository.d.ts +23 -0
- package/dist/src/proactive/execution/repository.js +122 -0
- package/dist/src/proactive/execution/types.d.ts +54 -0
- package/dist/src/proactive/execution/types.js +1 -0
- package/dist/src/proactive/execution/worker.d.ts +15 -0
- package/dist/src/proactive/execution/worker.js +96 -0
- package/dist/src/proactive/inbox/repository.d.ts +24 -0
- package/dist/src/proactive/inbox/repository.js +117 -0
- package/dist/src/proactive/inbox/service.d.ts +17 -0
- package/dist/src/proactive/inbox/service.js +22 -0
- package/dist/src/proactive/inbox/types.d.ts +38 -0
- package/dist/src/proactive/inbox/types.js +1 -0
- package/dist/src/proactive/inbox/worker.d.ts +12 -0
- package/dist/src/proactive/inbox/worker.js +56 -0
- package/dist/src/proactive/index.d.ts +17 -0
- package/dist/src/proactive/index.js +11 -0
- package/dist/src/proactive/routing/batch-repository.d.ts +27 -0
- package/dist/src/proactive/routing/batch-repository.js +56 -0
- package/dist/src/proactive/routing/matcher.d.ts +5 -0
- package/dist/src/proactive/routing/matcher.js +56 -0
- package/dist/src/proactive/routing/types.d.ts +44 -0
- package/dist/src/proactive/routing/types.js +1 -0
- package/dist/src/proactive/scenarios/prompt-composer.d.ts +14 -0
- package/dist/src/proactive/scenarios/prompt-composer.js +24 -0
- package/dist/src/proactive/scenarios/repository.d.ts +23 -0
- package/dist/src/proactive/scenarios/repository.js +162 -0
- package/dist/src/proactive/scenarios/service.d.ts +15 -0
- package/dist/src/proactive/scenarios/service.js +26 -0
- package/dist/src/proactive/scenarios/types.d.ts +36 -0
- package/dist/src/proactive/scenarios/types.js +1 -0
- package/dist/src/proactive/service.d.ts +18 -0
- package/dist/src/proactive/service.js +61 -0
- package/dist/src/projects/project-service.d.ts +3 -1
- package/dist/src/projects/project-service.js +62 -32
- package/dist/src/providers/provider-auth-service.js +3 -0
- package/dist/src/providers/register-bundled-oauth-flows.d.ts +2 -0
- package/dist/src/providers/register-bundled-oauth-flows.js +16 -0
- package/dist/src/session/store.d.ts +2 -0
- package/dist/src/session/store.js +30 -0
- package/dist/src/storage/sqlite/migrations/068_proactive_event_spine.sql +71 -0
- package/dist/src/storage/sqlite/migrations/069_proactive_scenario_control.sql +69 -0
- package/dist/src/storage/sqlite/migrations/070_proactive_execution.sql +55 -0
- package/dist/src/storage/sqlite/migrations/071_proactive_inbox.sql +45 -0
- package/dist/src/storage/sqlite/migrations/072_proactive_judgments.sql +14 -0
- package/dist/src/storage/sqlite/migrations/073_enable_default_proactive_scenarios.sql +13 -0
- package/dist/src/storage/sqlite/migrations/074_deduplicate_blocked_work_routing.sql +5 -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/work-discovery/thread-service.d.ts +1 -3
- package/dist/src/work-discovery/thread-service.js +13 -25
- package/dist/src/work-items/work-item-service.d.ts +3 -1
- package/dist/src/work-items/work-item-service.js +67 -36
- package/package.json +3 -11
- package/dist/gateway/static/root/assets/agents-BVjlpbeZ.js +0 -2
- package/dist/gateway/static/root/assets/api-Bop4IQRW.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-njqxLWYD.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-D-eweHZJ.js +0 -6
- package/dist/gateway/static/root/assets/capabilities-settings-panel-6tYNfHqJ.js +0 -7
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co-ymbd9.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-D46eVjaQ.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-BMRAO4zZ.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-Dw1eYbRi.js +0 -2
- package/dist/gateway/static/root/assets/copy-VueTIC2x.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-B8cZuQUt.js +0 -1
- package/dist/gateway/static/root/assets/focus-detail-page-BBXUtxRB.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-VjRArfAJ.js +0 -4
- package/dist/gateway/static/root/assets/index-CS9sVShT.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-Cl0fcPL4.js +0 -2
- package/dist/gateway/static/root/assets/messages-CarlxqXV.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-BKNBk0Uf.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-BhjEXNQW.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-B80e69PH.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CwdVob6H.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BGt3Asj6.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BnTdM9Nn.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-C4lXuyQj.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DSuIDkeI.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-xgZczqVe.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-CEfIy4WZ.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-B-3MClaf.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-CEsFEdax.js +0 -1
- package/dist/gateway/static/root/assets/work-page-CT9AHnq6.js +0 -3
- package/dist/gateway/static/root/assets/workflows-page-C-1-_Zp1.js +0 -11
- package/dist/src/focuses/candidate-repository.d.ts +0 -15
- package/dist/src/focuses/candidate-repository.js +0 -91
- package/dist/src/focuses/index.d.ts +0 -7
- package/dist/src/focuses/index.js +0 -7
- package/dist/src/focuses/insight-repository.d.ts +0 -22
- package/dist/src/focuses/insight-repository.js +0 -77
- package/dist/src/focuses/prompts.d.ts +0 -2
- package/dist/src/focuses/prompts.js +0 -18
- package/dist/src/focuses/reconciler.d.ts +0 -5
- package/dist/src/focuses/reconciler.js +0 -26
- package/dist/src/focuses/repository.d.ts +0 -61
- package/dist/src/focuses/repository.js +0 -214
- package/dist/src/focuses/run-processor.d.ts +0 -18
- package/dist/src/focuses/run-processor.js +0 -162
- package/dist/src/focuses/service.d.ts +0 -42
- package/dist/src/focuses/service.js +0 -241
- package/dist/src/focuses/types.d.ts +0 -89
- package/dist/src/gateway/hono/routes/focuses.d.ts +0 -3
- package/dist/src/gateway/hono/routes/focuses.js +0 -319
- /package/dist/src/{focuses/types.js → proactive/events/publisher.js} +0 -0
|
@@ -1,319 +0,0 @@
|
|
|
1
|
-
import { createFocusActivity, listFocusActivities } from "../../../focuses/repository.js";
|
|
2
|
-
import { acceptFocusCandidate, listFocusCandidates, setFocusCandidateStatus } from "../../../focuses/candidate-repository.js";
|
|
3
|
-
import { getFocusInsight, listFocusInsights, setFocusInsightStatus } from "../../../focuses/insight-repository.js";
|
|
4
|
-
import { FocusService } from "../../../focuses/service.js";
|
|
5
|
-
import "../../../focuses/index.js";
|
|
6
|
-
//#region src/gateway/hono/routes/focuses.ts
|
|
7
|
-
const FOCUS_STATUSES = [
|
|
8
|
-
"active",
|
|
9
|
-
"paused",
|
|
10
|
-
"completed"
|
|
11
|
-
];
|
|
12
|
-
const MONITOR_KINDS = ["progress", "external_changes"];
|
|
13
|
-
function stringField(body, field) {
|
|
14
|
-
if (!body || typeof body !== "object") return "";
|
|
15
|
-
const value = body[field];
|
|
16
|
-
return typeof value === "string" ? value.trim() : "";
|
|
17
|
-
}
|
|
18
|
-
function stringArrayField(body, field) {
|
|
19
|
-
if (!body || typeof body !== "object") return void 0;
|
|
20
|
-
const value = body[field];
|
|
21
|
-
if (!Array.isArray(value)) return void 0;
|
|
22
|
-
return [...new Set(value.filter((item) => typeof item === "string").map((item) => item.trim()).filter(Boolean))];
|
|
23
|
-
}
|
|
24
|
-
function registerFocusRoutes(authenticated, deps) {
|
|
25
|
-
const focuses = new FocusService(deps.service.automationServiceInstance);
|
|
26
|
-
const limited = deps.strictRateLimitMiddleware;
|
|
27
|
-
authenticated.get("/api/focuses", (c) => {
|
|
28
|
-
const requested = c.req.query("status")?.split(",").map((item) => item.trim()).filter(Boolean) ?? [];
|
|
29
|
-
const statuses = requested.length > 0 ? requested.filter((item) => FOCUS_STATUSES.includes(item)) : void 0;
|
|
30
|
-
if (requested.length > 0 && statuses?.length !== requested.length) return c.json({
|
|
31
|
-
ok: false,
|
|
32
|
-
error: "Invalid focus status"
|
|
33
|
-
}, 400);
|
|
34
|
-
return c.json({
|
|
35
|
-
ok: true,
|
|
36
|
-
focuses: focuses.list(statuses)
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
authenticated.post("/api/focuses", limited, async (c) => {
|
|
40
|
-
const body = await c.req.json().catch(() => null);
|
|
41
|
-
const title = stringField(body, "title");
|
|
42
|
-
if (!title) return c.json({
|
|
43
|
-
ok: false,
|
|
44
|
-
error: "Focus title is required"
|
|
45
|
-
}, 400);
|
|
46
|
-
const focus = focuses.create({
|
|
47
|
-
title,
|
|
48
|
-
summary: stringField(body, "summary"),
|
|
49
|
-
...stringArrayField(body, "projectIds") ? { projectIds: stringArrayField(body, "projectIds") } : {},
|
|
50
|
-
...stringField(body, "goalId") ? { goalId: stringField(body, "goalId") } : {}
|
|
51
|
-
});
|
|
52
|
-
deps.service.emit("focus.created", { focus });
|
|
53
|
-
return c.json({
|
|
54
|
-
ok: true,
|
|
55
|
-
focus
|
|
56
|
-
}, 201);
|
|
57
|
-
});
|
|
58
|
-
authenticated.get("/api/focuses/:focusId", (c) => {
|
|
59
|
-
const focus = focuses.get(c.req.param("focusId"));
|
|
60
|
-
return focus ? c.json({
|
|
61
|
-
ok: true,
|
|
62
|
-
focus
|
|
63
|
-
}) : c.json({
|
|
64
|
-
ok: false,
|
|
65
|
-
error: "Focus not found"
|
|
66
|
-
}, 404);
|
|
67
|
-
});
|
|
68
|
-
authenticated.patch("/api/focuses/:focusId", limited, async (c) => {
|
|
69
|
-
const body = await c.req.json().catch(() => null);
|
|
70
|
-
const requestedStatus = stringField(body, "status");
|
|
71
|
-
if (requestedStatus && !FOCUS_STATUSES.includes(requestedStatus)) return c.json({
|
|
72
|
-
ok: false,
|
|
73
|
-
error: "Invalid focus status"
|
|
74
|
-
}, 400);
|
|
75
|
-
try {
|
|
76
|
-
const title = stringField(body, "title");
|
|
77
|
-
const hasSummary = typeof body?.summary === "string";
|
|
78
|
-
const projectIds = stringArrayField(body, "projectIds");
|
|
79
|
-
let focus = Boolean(title || hasSummary || projectIds) ? focuses.update(c.req.param("focusId"), {
|
|
80
|
-
...title ? { title } : {},
|
|
81
|
-
...hasSummary ? { summary: stringField(body, "summary") } : {},
|
|
82
|
-
...projectIds ? { projectIds } : {}
|
|
83
|
-
}) : focuses.get(c.req.param("focusId"));
|
|
84
|
-
if (focus && requestedStatus) focus = await focuses.setStatus(c.req.param("focusId"), requestedStatus);
|
|
85
|
-
if (!focus) return c.json({
|
|
86
|
-
ok: false,
|
|
87
|
-
error: "Focus not found"
|
|
88
|
-
}, 404);
|
|
89
|
-
deps.service.emit("focus.updated", { focus });
|
|
90
|
-
return c.json({
|
|
91
|
-
ok: true,
|
|
92
|
-
focus
|
|
93
|
-
});
|
|
94
|
-
} catch (error) {
|
|
95
|
-
return c.json({
|
|
96
|
-
ok: false,
|
|
97
|
-
error: error instanceof Error ? error.message : String(error)
|
|
98
|
-
}, 400);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
authenticated.delete("/api/focuses/:focusId", limited, async (c) => {
|
|
102
|
-
try {
|
|
103
|
-
if (!await focuses.remove(c.req.param("focusId"))) return c.json({
|
|
104
|
-
ok: false,
|
|
105
|
-
error: "Focus not found"
|
|
106
|
-
}, 404);
|
|
107
|
-
deps.service.emit("focus.deleted", { focusId: c.req.param("focusId") });
|
|
108
|
-
return c.json({ ok: true });
|
|
109
|
-
} catch (error) {
|
|
110
|
-
return c.json({
|
|
111
|
-
ok: false,
|
|
112
|
-
error: error instanceof Error ? error.message : String(error)
|
|
113
|
-
}, 500);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
authenticated.put("/api/focuses/:focusId/monitors/:kind", limited, async (c) => {
|
|
117
|
-
const kind = c.req.param("kind");
|
|
118
|
-
if (!MONITOR_KINDS.includes(kind)) return c.json({
|
|
119
|
-
ok: false,
|
|
120
|
-
error: "Invalid monitor kind"
|
|
121
|
-
}, 400);
|
|
122
|
-
const body = await c.req.json().catch(() => null);
|
|
123
|
-
const enabled = body && typeof body === "object" ? body.enabled : void 0;
|
|
124
|
-
if (typeof enabled !== "boolean") return c.json({
|
|
125
|
-
ok: false,
|
|
126
|
-
error: "enabled must be a boolean"
|
|
127
|
-
}, 400);
|
|
128
|
-
const everyMs = body && typeof body === "object" && body.cadence && typeof body.cadence === "object" ? Number(body.cadence.everyMs) : void 0;
|
|
129
|
-
try {
|
|
130
|
-
const result = await focuses.configureMonitor({
|
|
131
|
-
focusId: c.req.param("focusId"),
|
|
132
|
-
kind,
|
|
133
|
-
enabled,
|
|
134
|
-
...Number.isFinite(everyMs) ? { cadence: {
|
|
135
|
-
kind: "interval",
|
|
136
|
-
everyMs
|
|
137
|
-
} } : {}
|
|
138
|
-
});
|
|
139
|
-
deps.service.emit("focus.monitor.updated", {
|
|
140
|
-
focusId: c.req.param("focusId"),
|
|
141
|
-
monitor: result.monitor
|
|
142
|
-
});
|
|
143
|
-
return c.json({
|
|
144
|
-
ok: true,
|
|
145
|
-
...result
|
|
146
|
-
}, result.initialRunId ? 202 : 200);
|
|
147
|
-
} catch (error) {
|
|
148
|
-
return c.json({
|
|
149
|
-
ok: false,
|
|
150
|
-
error: error instanceof Error ? error.message : String(error)
|
|
151
|
-
}, 400);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
authenticated.post("/api/focuses/:focusId/monitors/:kind/run", limited, async (c) => {
|
|
155
|
-
const kind = c.req.param("kind");
|
|
156
|
-
if (!MONITOR_KINDS.includes(kind)) return c.json({
|
|
157
|
-
ok: false,
|
|
158
|
-
error: "Invalid monitor kind"
|
|
159
|
-
}, 400);
|
|
160
|
-
try {
|
|
161
|
-
const run = await focuses.runMonitorNow(c.req.param("focusId"), kind);
|
|
162
|
-
deps.service.emit("focus.run.updated", {
|
|
163
|
-
focusId: c.req.param("focusId"),
|
|
164
|
-
kind,
|
|
165
|
-
run
|
|
166
|
-
});
|
|
167
|
-
return c.json({
|
|
168
|
-
ok: true,
|
|
169
|
-
run
|
|
170
|
-
}, 202);
|
|
171
|
-
} catch (error) {
|
|
172
|
-
return c.json({
|
|
173
|
-
ok: false,
|
|
174
|
-
error: error instanceof Error ? error.message : String(error)
|
|
175
|
-
}, 400);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
authenticated.get("/api/focuses/:focusId/activities", (c) => c.json({
|
|
179
|
-
ok: true,
|
|
180
|
-
activities: listFocusActivities({
|
|
181
|
-
focusId: c.req.param("focusId"),
|
|
182
|
-
...Number.isFinite(Number(c.req.query("before"))) ? { before: Number(c.req.query("before")) } : {},
|
|
183
|
-
...Number.isFinite(Number(c.req.query("limit"))) ? { limit: Number(c.req.query("limit")) } : {}
|
|
184
|
-
})
|
|
185
|
-
}));
|
|
186
|
-
authenticated.get("/api/focuses/:focusId/insights", (c) => c.json({
|
|
187
|
-
ok: true,
|
|
188
|
-
insights: listFocusInsights({
|
|
189
|
-
focusId: c.req.param("focusId"),
|
|
190
|
-
limit: Number(c.req.query("limit")) || 20
|
|
191
|
-
})
|
|
192
|
-
}));
|
|
193
|
-
authenticated.post("/api/focuses/:focusId/insights/:insightId/dismiss", limited, (c) => {
|
|
194
|
-
const insight = getFocusInsight(c.req.param("insightId"));
|
|
195
|
-
if (!insight || insight.focusId !== c.req.param("focusId")) return c.json({
|
|
196
|
-
ok: false,
|
|
197
|
-
error: "Insight not found"
|
|
198
|
-
}, 404);
|
|
199
|
-
const updated = setFocusInsightStatus(insight.id, "dismissed", "unread");
|
|
200
|
-
if (!updated) return c.json({
|
|
201
|
-
ok: false,
|
|
202
|
-
error: "Insight was already handled"
|
|
203
|
-
}, 409);
|
|
204
|
-
createFocusActivity({
|
|
205
|
-
focusId: insight.focusId,
|
|
206
|
-
monitorId: insight.monitorId,
|
|
207
|
-
type: "insight_dismissed",
|
|
208
|
-
summary: insight.title,
|
|
209
|
-
details: { insightId: insight.id }
|
|
210
|
-
});
|
|
211
|
-
deps.service.emit("focus.insight.updated", { insight: updated });
|
|
212
|
-
return c.json({
|
|
213
|
-
ok: true,
|
|
214
|
-
insight: updated
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
authenticated.post("/api/focuses/:focusId/insights/:insightId/investigate", limited, async (c) => {
|
|
218
|
-
const insight = getFocusInsight(c.req.param("insightId"));
|
|
219
|
-
const focus = focuses.get(c.req.param("focusId"));
|
|
220
|
-
if (!insight || !focus || insight.focusId !== focus.id) return c.json({
|
|
221
|
-
ok: false,
|
|
222
|
-
error: "Insight not found"
|
|
223
|
-
}, 404);
|
|
224
|
-
const claimed = setFocusInsightStatus(insight.id, "approved", "unread");
|
|
225
|
-
if (!claimed) return c.json({
|
|
226
|
-
ok: false,
|
|
227
|
-
error: "Insight was already handled"
|
|
228
|
-
}, 409);
|
|
229
|
-
let automationId;
|
|
230
|
-
try {
|
|
231
|
-
const automation = await deps.service.automationServiceInstance.create({
|
|
232
|
-
name: `Investigate: ${insight.title}`.slice(0, 200),
|
|
233
|
-
description: `User-approved investigation for focus insight ${insight.id}.`,
|
|
234
|
-
...focus.projectIds[0] ? { projectId: focus.projectIds[0] } : {},
|
|
235
|
-
trigger: { kind: "manual" },
|
|
236
|
-
action: {
|
|
237
|
-
kind: "agent",
|
|
238
|
-
instruction: [
|
|
239
|
-
"Investigate this user-approved focus insight in read-only mode.",
|
|
240
|
-
`Focus: ${focus.title}`,
|
|
241
|
-
`Observed change: ${insight.summary}`,
|
|
242
|
-
`Why it matters: ${insight.whyItMatters}`,
|
|
243
|
-
`Next step: ${insight.nextAction}`,
|
|
244
|
-
`Evidence: ${JSON.stringify(insight.evidence)}`,
|
|
245
|
-
"Return a concise result with evidence. Do not modify files or external systems."
|
|
246
|
-
].join("\n"),
|
|
247
|
-
timeoutSeconds: 300
|
|
248
|
-
},
|
|
249
|
-
safety: { mode: "suggest_only" },
|
|
250
|
-
afterRun: { kind: "none" },
|
|
251
|
-
reliability: {
|
|
252
|
-
timeoutSeconds: 300,
|
|
253
|
-
disableAfterConsecutiveFailures: 1
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
automationId = automation.id;
|
|
257
|
-
const run = await deps.service.automationServiceInstance.runNow(automation.id);
|
|
258
|
-
createFocusActivity({
|
|
259
|
-
focusId: focus.id,
|
|
260
|
-
monitorId: insight.monitorId,
|
|
261
|
-
type: "insight_approved",
|
|
262
|
-
summary: insight.title,
|
|
263
|
-
details: {
|
|
264
|
-
insightId: insight.id,
|
|
265
|
-
automationId,
|
|
266
|
-
runId: run.id
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
deps.service.emit("focus.insight.updated", {
|
|
270
|
-
insight: claimed,
|
|
271
|
-
investigationRunId: run.id
|
|
272
|
-
});
|
|
273
|
-
return c.json({
|
|
274
|
-
ok: true,
|
|
275
|
-
insight: claimed,
|
|
276
|
-
automationId,
|
|
277
|
-
runId: run.id
|
|
278
|
-
}, 202);
|
|
279
|
-
} catch (error) {
|
|
280
|
-
if (automationId) await deps.service.automationServiceInstance.remove(automationId);
|
|
281
|
-
setFocusInsightStatus(insight.id, "unread", "approved");
|
|
282
|
-
return c.json({
|
|
283
|
-
ok: false,
|
|
284
|
-
error: error instanceof Error ? error.message : String(error)
|
|
285
|
-
}, 500);
|
|
286
|
-
}
|
|
287
|
-
});
|
|
288
|
-
authenticated.get("/api/focus-candidates", (c) => c.json({
|
|
289
|
-
ok: true,
|
|
290
|
-
candidates: listFocusCandidates()
|
|
291
|
-
}));
|
|
292
|
-
authenticated.post("/api/focus-candidates/:candidateId/accept", limited, (c) => {
|
|
293
|
-
const focus = acceptFocusCandidate(c.req.param("candidateId"));
|
|
294
|
-
if (!focus) return c.json({
|
|
295
|
-
ok: false,
|
|
296
|
-
error: "Focus candidate not found"
|
|
297
|
-
}, 404);
|
|
298
|
-
const detail = focuses.get(focus.id);
|
|
299
|
-
deps.service.emit("focus.created", { focus: detail });
|
|
300
|
-
return c.json({
|
|
301
|
-
ok: true,
|
|
302
|
-
focus: detail
|
|
303
|
-
}, 201);
|
|
304
|
-
});
|
|
305
|
-
authenticated.post("/api/focus-candidates/:candidateId/dismiss", limited, (c) => {
|
|
306
|
-
const candidate = setFocusCandidateStatus(c.req.param("candidateId"), "dismissed");
|
|
307
|
-
if (!candidate) return c.json({
|
|
308
|
-
ok: false,
|
|
309
|
-
error: "Focus candidate not found"
|
|
310
|
-
}, 404);
|
|
311
|
-
deps.service.emit("focus.candidate.updated", { candidate });
|
|
312
|
-
return c.json({
|
|
313
|
-
ok: true,
|
|
314
|
-
candidate
|
|
315
|
-
});
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
//#endregion
|
|
319
|
-
export { registerFocusRoutes };
|
|
File without changes
|