@askexenow/exe-os 0.9.294 → 0.9.296
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/deploy/compose/cloudflared/config.yml.example +14 -9
- package/deploy/compose/docker-compose.yml +86 -8
- package/deploy/compose/sso-edge/default.conf.template +87 -0
- package/deploy/compose/sso-edge/entrypoint.sh +23 -0
- package/deploy/compose/sso-edge/sso-redirect.conf +63 -0
- package/deploy/stack-manifests/v0.9.json +2 -2
- package/dist/active-agent-AFX2FODG.js +28 -0
- package/dist/active-agent-E2IJA7YX.js +27 -0
- package/dist/agentic-ontology-A2YUZK5O.js +25 -0
- package/dist/assets/com.askexe.exed.plist +4 -1
- package/dist/backfill-metadata-OC7EOD5U.js +600 -0
- package/dist/behaviors-H5ZOVHDH.js +46 -0
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +6 -6
- package/dist/bin/backfill-responses.js +6 -6
- package/dist/bin/backfill-vectors.js +8 -8
- package/dist/bin/bulk-sync-postgres.js +7 -7
- package/dist/bin/cc-doctor.js +4 -4
- package/dist/bin/cleanup-stale-review-tasks.js +11 -11
- package/dist/bin/cli.js +16 -16
- package/dist/bin/deferred-daemon-restart.js +1 -1
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +4 -4
- package/dist/bin/exe-assign.js +8 -8
- package/dist/bin/exe-boot.js +21 -18
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +7 -7
- package/dist/bin/exe-dispatch.js +11 -11
- package/dist/bin/exe-doctor.js +3 -2
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +7 -7
- package/dist/bin/exe-healthcheck.js +6 -4
- package/dist/bin/exe-heartbeat.js +11 -11
- package/dist/bin/exe-kill.js +14 -14
- package/dist/bin/exe-launch-agent.js +18 -18
- package/dist/bin/exe-new-employee.js +6 -6
- package/dist/bin/exe-pending-messages.js +12 -12
- package/dist/bin/exe-pending-notifications.js +11 -11
- package/dist/bin/exe-pending-reviews.js +11 -11
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +13 -13
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +16 -16
- package/dist/bin/exe-settings.js +39 -9
- package/dist/bin/exe-start-codex.js +11 -11
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +12 -12
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/git-sweep.js +12 -12
- package/dist/bin/graph-backfill.js +4 -4
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/import-history.js +7 -7
- package/dist/bin/install-launchd.js +13 -6
- package/dist/bin/install.js +26 -14
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
- package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
- package/dist/bin/scan-tasks.js +11 -11
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/bin/stack-update.js +2 -2
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/capability-cards-4USI7CUW.js +89 -0
- package/dist/capacity-monitor-WLCBTEYR.js +51 -0
- package/dist/catchup-brief-ZR3NX6LZ.js +175 -0
- package/dist/chunk-22TVSRQQ.js +226 -0
- package/dist/chunk-2E43UXRH.js +395 -0
- package/dist/chunk-2PIGT6UJ.js +460 -0
- package/dist/chunk-3XTMW2MZ.js +535 -0
- package/dist/chunk-465PQFTH.js +262 -0
- package/dist/chunk-5CCXU2AW.js +129 -0
- package/dist/chunk-5D6MPWR7.js +1094 -0
- package/dist/chunk-5Q4MR6SL.js +123 -0
- package/dist/chunk-6327RBWR.js +345 -0
- package/dist/chunk-6MZZREZY.js +199 -0
- package/dist/chunk-7DI2Q4O5.js +1186 -0
- package/dist/chunk-7PW5VNIY.js +122 -0
- package/dist/chunk-7T7Y56HW.js +43 -0
- package/dist/chunk-7UHCWCLT.js +128 -0
- package/dist/chunk-A2ZUMF6L.js +1350 -0
- package/dist/chunk-AKV44JEH.js +185 -0
- package/dist/chunk-ANHWGX5N.js +735 -0
- package/dist/chunk-BQ3P4TKD.js +97 -0
- package/dist/chunk-BUZMT3KZ.js +604 -0
- package/dist/chunk-C2SBESBO.js +210 -0
- package/dist/chunk-CLSXZUZW.js +51 -0
- package/dist/chunk-CONHLVAR.js +1079 -0
- package/dist/chunk-D3WTZPFX.js +456 -0
- package/dist/chunk-DE6SOIYL.js +197 -0
- package/dist/chunk-EIVNMA3Q.js +284 -0
- package/dist/chunk-EJIF4FNT.js +12 -0
- package/dist/chunk-FDFOW564.js +171 -0
- package/dist/chunk-GZUBJ5EC.js +127 -0
- package/dist/chunk-HGZITN22.js +105 -0
- package/dist/chunk-HSRKDU6X.js +362 -0
- package/dist/chunk-IIEN2PHV.js +85 -0
- package/dist/chunk-JQ56VLMM.js +567 -0
- package/dist/chunk-JVHHXRFY.js +280 -0
- package/dist/chunk-JXCXGZ3S.js +55 -0
- package/dist/chunk-K5ZO532Q.js +4388 -0
- package/dist/chunk-K6CAAMXF.js +97 -0
- package/dist/chunk-KA26YTNU.js +81 -0
- package/dist/chunk-KMUW5C3R.js +381 -0
- package/dist/chunk-KOO3J5PV.js +20 -0
- package/dist/chunk-LSV7OFIH.js +290 -0
- package/dist/chunk-LSVFDVNY.js +1158 -0
- package/dist/chunk-LXDQTW32.js +230 -0
- package/dist/chunk-MEP7OUVZ.js +181 -0
- package/dist/chunk-MN2B2LKS.js +240 -0
- package/dist/chunk-N2EAYPYQ.js +1352 -0
- package/dist/chunk-N7I2A667.js +70 -0
- package/dist/chunk-NLZHVIOP.js +630 -0
- package/dist/chunk-NUH5TRZL.js +227 -0
- package/dist/chunk-OAHEIH3G.js +167 -0
- package/dist/chunk-OBHRQGCK.js +58 -0
- package/dist/chunk-ODFA7B2V.js +54 -0
- package/dist/chunk-OSNUP45F.js +731 -0
- package/dist/chunk-OTPRHBTO.js +33 -0
- package/dist/chunk-P6MUA4QU.js +157 -0
- package/dist/chunk-PGIOFKSK.js +2093 -0
- package/dist/chunk-PSE7VHWK.js +50 -0
- package/dist/chunk-QIFUVZFW.js +331 -0
- package/dist/chunk-RDPXKTVK.js +221 -0
- package/dist/chunk-RKYTYJGB.js +76 -0
- package/dist/chunk-RXLR6EFM.js +348 -0
- package/dist/chunk-SDB67PQJ.js +159 -0
- package/dist/chunk-SF2T7MP3.js +402 -0
- package/dist/chunk-SLU3FRFQ.js +2133 -0
- package/dist/chunk-SNDZJ5IV.js +214 -0
- package/dist/chunk-STEEAABW.js +448 -0
- package/dist/chunk-TUTWNHIQ.js +244 -0
- package/dist/chunk-UDP35QBR.js +30 -0
- package/dist/chunk-UKFHNJBI.js +85 -0
- package/dist/chunk-VC2DTK2X.js +382 -0
- package/dist/chunk-VRRAE5JX.js +836 -0
- package/dist/chunk-VVJTBQPR.js +38 -0
- package/dist/chunk-W3EQ362K.js +581 -0
- package/dist/chunk-WHIXIFHC.js +2242 -0
- package/dist/chunk-WRNGJJNR.js +377 -0
- package/dist/chunk-WUKHLCBE.js +3313 -0
- package/dist/chunk-WVPLHGDG.js +150 -0
- package/dist/chunk-XJZBSTL5.js +204 -0
- package/dist/chunk-Y3PMNUM5.js +304 -0
- package/dist/chunk-YHVS4QOV.js +14597 -0
- package/dist/chunk-YJ2OYAOC.js +668 -0
- package/dist/chunk-YYAD2GXX.js +128 -0
- package/dist/chunk-ZQML7EWE.js +333 -0
- package/dist/co-activation-XJLH46OX.js +74 -0
- package/dist/co-occurrence-GNN2X526.js +95 -0
- package/dist/code-context-index-OCPRLFG5.js +30 -0
- package/dist/core-memory-J4W2IYOF.js +110 -0
- package/dist/crdt-sync-QCBTSHIH.js +33 -0
- package/dist/crm-webhook-EM442VUW.js +10 -0
- package/dist/cto-delegation-gate-MLJMVHBK.js +280 -0
- package/dist/daemon-orchestration-2VNLZVTW.js +139 -0
- package/dist/db-backup-VUGFTPJ4.js +43 -0
- package/dist/doc-graph-extractor-PNRSFPSS.js +133 -0
- package/dist/dreaming-SK5VEQRF.js +34 -0
- package/dist/entity-boost-TQWWJUC2.js +375 -0
- package/dist/exe-drift-N34UPO7S.js +70 -0
- package/dist/exe-export-KACBKGVV.js +77 -0
- package/dist/exe-import-GXGDWACG.js +80 -0
- package/dist/exe-key-XPDOZBWW.js +673 -0
- package/dist/exe-snapshot-32GQKGQ5.js +338 -0
- package/dist/fast-db-init-F3TDD5VV.js +7 -0
- package/dist/gateway/index.js +8 -8
- package/dist/git-staleness-J45WNYRF.js +112 -0
- package/dist/git-task-sweep-BTGVQPFB.js +42 -0
- package/dist/global-procedures-6JCQWU4D.js +22 -0
- package/dist/graph-auto-extract-3ZQNXTPC.js +183 -0
- package/dist/hooks/bug-report-worker.js +13 -13
- package/dist/hooks/codex-stop-task-finalizer.js +13 -13
- package/dist/hooks/commit-complete.js +13 -13
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest-worker.js +3 -3
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +12 -12
- package/dist/hooks/post-tool-combined.js +6 -6
- package/dist/hooks/pre-compact.js +16 -16
- package/dist/hooks/pre-tool-use.js +16 -16
- package/dist/hooks/prompt-submit.js +24 -24
- package/dist/hooks/session-end.js +21 -21
- package/dist/hooks/session-start.js +12 -12
- package/dist/hooks/stop.js +19 -19
- package/dist/hooks/subagent-stop.js +12 -12
- package/dist/hooks/summary-worker.js +19 -19
- package/dist/index.js +19 -19
- package/dist/installer-5VPFY7SB.js +298 -0
- package/dist/installer-OENFPMA2.js +344 -0
- package/dist/installer-OIX4QOG5.js +40 -0
- package/dist/lib/cloud-sync.js +7 -7
- package/dist/lib/consolidation.js +6 -5
- package/dist/lib/database.js +2 -2
- package/dist/lib/db-daemon-client.js +2 -2
- package/dist/lib/db.js +2 -2
- package/dist/lib/embed-worker.js +1 -0
- package/dist/lib/embedder.js +7 -3
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon-client.js +2 -2
- package/dist/lib/exe-daemon.js +160 -79
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/messaging.js +11 -11
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +6 -6
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +12 -12
- package/dist/lib/tmux-routing.js +12 -10
- package/dist/lib/tmux-transport.js +1 -1
- package/dist/lib/token-spend.js +3 -3
- package/dist/lib/transport.js +2 -2
- package/dist/mcp/register-tools.js +62 -61
- package/dist/mcp/server.js +63 -62
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +14 -14
- package/dist/mcp/tools/deactivate-behavior.js +7 -7
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +14 -14
- package/dist/mcp/tools/send-message.js +13 -13
- package/dist/mcp/tools/update-task.js +13 -13
- package/dist/mcp-http-config-PQTOLCTP.js +29 -0
- package/dist/memory-cards-4RVDZIY2.js +180 -0
- package/dist/memory-graph-extractor-L6YC7G4M.js +22 -0
- package/dist/memory-poisoning-defense-4YVJYH4G.js +224 -0
- package/dist/memory-queue-client-MVAUOZNJ.js +16 -0
- package/dist/memory-reflection-SHHDQNOH.js +244 -0
- package/dist/message-queue-client-DCKZT6X2.js +92 -0
- package/dist/notifications-JFR3G42W.js +47 -0
- package/dist/orchestration-events-MGCGPTDN.js +27 -0
- package/dist/orchestrator-DAFL2YZB.js +35 -0
- package/dist/pipeline-router-WWSZVPCH.js +15 -0
- package/dist/plan-limits-C7XCSDZC.js +28 -0
- package/dist/project-boot-N3NTBVLE.js +299 -0
- package/dist/projection-worker-MTPAPCWX.js +1084 -0
- package/dist/prospective-memory-BTIVUJSB.js +232 -0
- package/dist/reranker-UA6WVESJ.js +19 -0
- package/dist/retrieval-health-7XNZJEBF.js +12 -0
- package/dist/review-polling-4ALGMXC3.js +126 -0
- package/dist/runtime/index.js +13 -13
- package/dist/self-query-router-MROFQLQB.js +192 -0
- package/dist/session-events-CK44XOU4.js +38 -0
- package/dist/session-kill-telemetry-MT6ITDOG.js +31 -0
- package/dist/session-scope-3XDBWV65.js +88 -0
- package/dist/setup-wizard-X6DOD7MC.js +12 -0
- package/dist/skill-refinement-G2CCY3GM.js +159 -0
- package/dist/stack-update-JF7F56AS.js +84 -0
- package/dist/steward-gate-YF2CYXE7.js +15 -0
- package/dist/task-enforcement-YN6HK7NE.js +506 -0
- package/dist/task-scope-CVK6ISCZ.js +37 -0
- package/dist/tasks-crud-NTNET4JE.js +79 -0
- package/dist/tasks-notify-4LJVFPCV.js +40 -0
- package/dist/tasks-review-3V4WOIRG.js +49 -0
- package/dist/telemetry-upload-5PNUKGTM.js +741 -0
- package/dist/token-budget-E46G7ZAQ.js +86 -0
- package/dist/tool-capability-index-JDSMKJER.js +10 -0
- package/dist/tool-telemetry-J3NLS3LJ.js +17 -0
- package/dist/tui/App.js +18 -18
- package/dist/tui-data-6DOMUUCM.js +260 -0
- package/dist/wiki-acl-5UK37LKF.js +111 -0
- package/dist/worker-gate-FM7AEC7G.js +21 -0
- package/dist/workflow-engine-2EDUHUIY.js +28 -0
- package/dist/worktree-7YKKJIYR.js +28 -0
- package/dist/worktree-sweep-C3ELFGDN.js +21 -0
- package/package.json +1 -1
- package/release-notes.json +88 -88
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getActiveAgent
|
|
3
|
+
} from "./chunk-AKV44JEH.js";
|
|
4
|
+
import {
|
|
5
|
+
listTasks
|
|
6
|
+
} from "./chunk-K5ZO532Q.js";
|
|
7
|
+
import {
|
|
8
|
+
getAgentContext
|
|
9
|
+
} from "./chunk-GJV3WDWM.js";
|
|
10
|
+
import {
|
|
11
|
+
isCoordinatorName
|
|
12
|
+
} from "./chunk-WUKHLCBE.js";
|
|
13
|
+
|
|
14
|
+
// src/mcp/tools/list-tasks.ts
|
|
15
|
+
import { z } from "zod";
|
|
16
|
+
function registerListTasks(server) {
|
|
17
|
+
server.registerTool(
|
|
18
|
+
"list_tasks",
|
|
19
|
+
{
|
|
20
|
+
title: "List Tasks",
|
|
21
|
+
description: "Query tasks by assignee, status, project, or priority. Defaults to current project. Pass project_name='all' for all projects. When querying your own tasks, project filter is skipped automatically.",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
assigned_to: z.string().optional().describe("Filter by employee name"),
|
|
24
|
+
status: z.enum(["open", "in_progress", "done", "needs_review", "blocked", "cancelled", "closed"]).optional().describe("Filter by status. Default: active tasks only (excludes closed/cancelled)"),
|
|
25
|
+
project_name: z.string().optional().describe("Project name. Defaults to current project. Pass 'all' for all projects."),
|
|
26
|
+
priority: z.enum(["p0", "p1", "p2"]).optional().describe("Filter by priority"),
|
|
27
|
+
cross_session: z.boolean().optional().describe("When true, return tasks from ALL coordinator sessions (read-only). Default: false.")
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
async ({ assigned_to, status, project_name, priority, cross_session }) => {
|
|
31
|
+
try {
|
|
32
|
+
const { agentId } = getActiveAgent();
|
|
33
|
+
const isReviewQueue = status === "needs_review";
|
|
34
|
+
const shouldDefaultToOwnQueue = !assigned_to && !isReviewQueue && !isCoordinatorName(agentId);
|
|
35
|
+
const effectiveAssignedTo = assigned_to ?? (shouldDefaultToOwnQueue ? agentId : void 0);
|
|
36
|
+
const effectiveReviewer = !assigned_to && isReviewQueue ? agentId : void 0;
|
|
37
|
+
const isOwnQuery = effectiveAssignedTo === agentId;
|
|
38
|
+
const callerSession = getAgentContext()?.sessionHint || process.env.EXE_SESSION_NAME || process.env.EXE_SESSION || null;
|
|
39
|
+
const resolvedProject = project_name && project_name !== "all" ? project_name : null;
|
|
40
|
+
const effectiveCrossSession = cross_session === true;
|
|
41
|
+
const identityAmbiguous = !callerSession && (agentId === "default" || !agentId);
|
|
42
|
+
let tasks = await listTasks({
|
|
43
|
+
assignedTo: effectiveAssignedTo,
|
|
44
|
+
reviewer: effectiveReviewer,
|
|
45
|
+
status,
|
|
46
|
+
projectName: resolvedProject,
|
|
47
|
+
priority,
|
|
48
|
+
crossSession: effectiveCrossSession,
|
|
49
|
+
isOwnQuery: !!isOwnQuery,
|
|
50
|
+
callerSession
|
|
51
|
+
});
|
|
52
|
+
let recoveredCrossSession = false;
|
|
53
|
+
if (tasks.length === 0 && identityAmbiguous && !effectiveCrossSession) {
|
|
54
|
+
const crossTasks = await listTasks({
|
|
55
|
+
// Drop the own-queue assignee default — identity is unreliable here.
|
|
56
|
+
assignedTo: assigned_to,
|
|
57
|
+
reviewer: effectiveReviewer,
|
|
58
|
+
status,
|
|
59
|
+
projectName: resolvedProject,
|
|
60
|
+
priority,
|
|
61
|
+
crossSession: true,
|
|
62
|
+
isOwnQuery: false,
|
|
63
|
+
callerSession: null
|
|
64
|
+
});
|
|
65
|
+
if (crossTasks.length > 0) {
|
|
66
|
+
tasks = crossTasks;
|
|
67
|
+
recoveredCrossSession = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (tasks.length === 0) {
|
|
71
|
+
if (identityAmbiguous) {
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: "Could not resolve your session identity (multiple coordinator sessions are live and no per-session MCP header was provided). Task scoping is unreliable, and a cross-session read also returned no rows. If you expect tasks to exist, retry with cross_session=true and an explicit project_name='all', or configure a per-session MCP header (X-Exe-Session). Treat this as 'unknown', NOT 'empty'."
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
isError: true
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
content: [{ type: "text", text: "No tasks found." }]
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const lines = tasks.map((t) => {
|
|
87
|
+
const cpIndicator = t.checkpointCount && t.checkpointCount > 0 ? ` [cp:${t.checkpointCount}]` : "";
|
|
88
|
+
let budgetNote = "";
|
|
89
|
+
if (t.budgetTokens !== null) {
|
|
90
|
+
const pct = Math.round(t.tokensUsed / t.budgetTokens * 100);
|
|
91
|
+
budgetNote = ` [${t.tokensUsed}/${t.budgetTokens} tokens, ${pct}%]`;
|
|
92
|
+
}
|
|
93
|
+
const shortId = t.id.slice(0, 8);
|
|
94
|
+
const showSession = cross_session || recoveredCrossSession;
|
|
95
|
+
const sessionNote = showSession && t.sessionScope ? ` [session:${t.sessionScope}]` : "";
|
|
96
|
+
return `- [${t.priority.toUpperCase()}] ${t.title} (${t.projectName}) \u2014 ${t.status}${cpIndicator}${budgetNote}${sessionNote} \u2192 ${t.assignedTo} [id:${shortId}]`;
|
|
97
|
+
});
|
|
98
|
+
const header = recoveredCrossSession ? `WARNING: session identity was ambiguous (multiple coordinator sessions, no per-session MCP header) \u2014 showing tasks ACROSS ALL sessions. Configure a per-session X-Exe-Session header for scoped results.
|
|
99
|
+
${tasks.length} task(s) (cross-session):` : `${tasks.length} task(s):`;
|
|
100
|
+
return {
|
|
101
|
+
content: [
|
|
102
|
+
{
|
|
103
|
+
type: "text",
|
|
104
|
+
text: `${header}
|
|
105
|
+
${lines.join("\n")}`
|
|
106
|
+
}
|
|
107
|
+
]
|
|
108
|
+
};
|
|
109
|
+
} catch (err) {
|
|
110
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
111
|
+
return {
|
|
112
|
+
content: [{ type: "text", text: `Failed to list tasks: ${msg}` }],
|
|
113
|
+
isError: true
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export {
|
|
121
|
+
registerListTasks
|
|
122
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/lib/daemon-heap.ts
|
|
2
|
+
function computeDaemonHeapCapMb(_totalGb) {
|
|
3
|
+
return 2048;
|
|
4
|
+
}
|
|
5
|
+
var HEAP_FLAG_RE = /^--(max[-_]old[-_]space[-_]size|max[-_]semi[-_]space[-_]size|max[-_]heap[-_]size)(=|$)/i;
|
|
6
|
+
var EMBED_WORKER_DEFAULT_HEAP_MB = 6144;
|
|
7
|
+
var EMBED_WORKER_MIN_HEAP_MB = 3072;
|
|
8
|
+
var EMBED_WORKER_RSS_HEADROOM_MB = 2048;
|
|
9
|
+
var EMBED_WORKER_RSS_KILL_FLOOR_MB = 8192;
|
|
10
|
+
function resolveEmbedWorkerRssKillMb(envValue, heapMb) {
|
|
11
|
+
const heap = Number.isFinite(heapMb) && heapMb > 0 ? heapMb : EMBED_WORKER_DEFAULT_HEAP_MB;
|
|
12
|
+
const safeDefault = Math.max(heap + EMBED_WORKER_RSS_HEADROOM_MB, EMBED_WORKER_RSS_KILL_FLOOR_MB);
|
|
13
|
+
const raw = parseInt(envValue ?? "", 10);
|
|
14
|
+
if (Number.isFinite(raw) && raw > heap + EMBED_WORKER_RSS_HEADROOM_MB) return raw;
|
|
15
|
+
return safeDefault;
|
|
16
|
+
}
|
|
17
|
+
var EMBED_MAX_RESPAWNS = 3;
|
|
18
|
+
var EMBED_BACKOFF_BASE_MS = 1e4;
|
|
19
|
+
var EMBED_BACKOFF_MAX_MS = 6e4;
|
|
20
|
+
function resolveEmbedWorkerHeapMb(envValue) {
|
|
21
|
+
const raw = parseInt(envValue ?? "", 10);
|
|
22
|
+
return Number.isFinite(raw) && raw >= EMBED_WORKER_MIN_HEAP_MB ? raw : EMBED_WORKER_DEFAULT_HEAP_MB;
|
|
23
|
+
}
|
|
24
|
+
function buildEmbedWorkerExecArgv(parentExecArgv, heapMb) {
|
|
25
|
+
return [
|
|
26
|
+
...parentExecArgv.filter((a) => !HEAP_FLAG_RE.test(a)),
|
|
27
|
+
`--max-old-space-size=${heapMb}`
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
function computeEmbedRespawnDelayMs(respawnCount) {
|
|
31
|
+
if (respawnCount > EMBED_MAX_RESPAWNS) return null;
|
|
32
|
+
return Math.min(EMBED_BACKOFF_BASE_MS * 2 ** (respawnCount - 1), EMBED_BACKOFF_MAX_MS);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
computeDaemonHeapCapMb,
|
|
37
|
+
HEAP_FLAG_RE,
|
|
38
|
+
resolveEmbedWorkerRssKillMb,
|
|
39
|
+
EMBED_MAX_RESPAWNS,
|
|
40
|
+
resolveEmbedWorkerHeapMb,
|
|
41
|
+
buildEmbedWorkerExecArgv,
|
|
42
|
+
computeEmbedRespawnDelayMs
|
|
43
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// src/lib/tool-telemetry.ts
|
|
2
|
+
var _toolCalls = /* @__PURE__ */ new Map();
|
|
3
|
+
var _sessionStartedAt = Date.now();
|
|
4
|
+
var _flushTimer = null;
|
|
5
|
+
function recordCall(toolName, action, isError) {
|
|
6
|
+
let record = _toolCalls.get(toolName);
|
|
7
|
+
if (!record) {
|
|
8
|
+
record = { count: 0, actions: /* @__PURE__ */ new Map(), lastCalledAt: 0, errors: 0 };
|
|
9
|
+
_toolCalls.set(toolName, record);
|
|
10
|
+
}
|
|
11
|
+
record.count++;
|
|
12
|
+
record.lastCalledAt = Date.now();
|
|
13
|
+
if (isError) record.errors++;
|
|
14
|
+
if (action) {
|
|
15
|
+
record.actions.set(action, (record.actions.get(action) ?? 0) + 1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function wrapServerWithTelemetry(server) {
|
|
19
|
+
const originalRegisterTool = server.registerTool.bind(server);
|
|
20
|
+
server.registerTool = (name, config, handler) => {
|
|
21
|
+
const wrappedHandler = async (input, extra) => {
|
|
22
|
+
const action = input.action;
|
|
23
|
+
try {
|
|
24
|
+
const result = await handler(input, extra);
|
|
25
|
+
const isError = result?.isError === true;
|
|
26
|
+
recordCall(name, action, isError);
|
|
27
|
+
return result;
|
|
28
|
+
} catch (err) {
|
|
29
|
+
recordCall(name, action, true);
|
|
30
|
+
throw err;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
return originalRegisterTool(name, config, wrappedHandler);
|
|
34
|
+
};
|
|
35
|
+
return server;
|
|
36
|
+
}
|
|
37
|
+
function getToolUsageStats() {
|
|
38
|
+
let totalCalls = 0;
|
|
39
|
+
let totalErrors = 0;
|
|
40
|
+
const tools = {};
|
|
41
|
+
for (const [name, record] of _toolCalls) {
|
|
42
|
+
totalCalls += record.count;
|
|
43
|
+
totalErrors += record.errors;
|
|
44
|
+
const entry = {
|
|
45
|
+
calls: record.count,
|
|
46
|
+
errors: record.errors,
|
|
47
|
+
lastCalledAt: new Date(record.lastCalledAt).toISOString()
|
|
48
|
+
};
|
|
49
|
+
if (record.actions.size > 0) {
|
|
50
|
+
entry.actions = Object.fromEntries(record.actions);
|
|
51
|
+
}
|
|
52
|
+
tools[name] = entry;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
sessionStartedAt: new Date(_sessionStartedAt).toISOString(),
|
|
56
|
+
uptimeMs: Date.now() - _sessionStartedAt,
|
|
57
|
+
totalCalls,
|
|
58
|
+
totalErrors,
|
|
59
|
+
tools
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function resetToolUsageStats() {
|
|
63
|
+
_toolCalls.clear();
|
|
64
|
+
_sessionStartedAt = Date.now();
|
|
65
|
+
}
|
|
66
|
+
var FLUSH_INTERVAL_MS = 5 * 60 * 1e3;
|
|
67
|
+
var _lastFlushedAt = 0;
|
|
68
|
+
async function flushToMemory() {
|
|
69
|
+
const stats = getToolUsageStats();
|
|
70
|
+
if (stats.totalCalls === 0) return;
|
|
71
|
+
if (stats.totalCalls === _lastFlushedAt) return;
|
|
72
|
+
try {
|
|
73
|
+
const { getClient, isInitialized } = await import("./lib/database.js");
|
|
74
|
+
if (!isInitialized()) return;
|
|
75
|
+
const client = getClient();
|
|
76
|
+
const toolSummary = Object.entries(stats.tools).sort((a, b) => b[1].calls - a[1].calls).map(([name, t]) => {
|
|
77
|
+
const actionStr = t.actions ? ` (${Object.entries(t.actions).sort((a, b) => b[1] - a[1]).map(([a, c]) => `${a}:${c}`).join(", ")})` : "";
|
|
78
|
+
return `${name}: ${t.calls} calls${t.errors > 0 ? ` (${t.errors} errors)` : ""}${actionStr}`;
|
|
79
|
+
}).join("\n");
|
|
80
|
+
const raw_text = `Tool usage since ${stats.sessionStartedAt} (${Math.round(stats.uptimeMs / 6e4)}min):
|
|
81
|
+
Total: ${stats.totalCalls} calls, ${stats.totalErrors} errors
|
|
82
|
+
|
|
83
|
+
${toolSummary}`;
|
|
84
|
+
await client.execute({
|
|
85
|
+
sql: `INSERT INTO memories (id, agent_id, raw_text, memory_type, project_name, importance, created_at, updated_at, session_scope)
|
|
86
|
+
VALUES (?, 'system', ?, 'telemetry', 'exe-os', 2, datetime('now'), datetime('now'), NULL)`,
|
|
87
|
+
args: [
|
|
88
|
+
`telemetry-tools-${Date.now()}`,
|
|
89
|
+
raw_text
|
|
90
|
+
]
|
|
91
|
+
});
|
|
92
|
+
_lastFlushedAt = stats.totalCalls;
|
|
93
|
+
} catch {
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function startToolTelemetryFlush() {
|
|
97
|
+
if (_flushTimer) return;
|
|
98
|
+
_sessionStartedAt = Date.now();
|
|
99
|
+
_flushTimer = setInterval(() => void flushToMemory(), FLUSH_INTERVAL_MS);
|
|
100
|
+
_flushTimer.unref();
|
|
101
|
+
}
|
|
102
|
+
async function stopToolTelemetryFlush() {
|
|
103
|
+
if (_flushTimer) {
|
|
104
|
+
clearInterval(_flushTimer);
|
|
105
|
+
_flushTimer = null;
|
|
106
|
+
}
|
|
107
|
+
await flushToMemory();
|
|
108
|
+
}
|
|
109
|
+
function getToolUsageSummary() {
|
|
110
|
+
const summary = {};
|
|
111
|
+
for (const [tool, record] of _toolCalls) {
|
|
112
|
+
summary[tool] = {
|
|
113
|
+
count: record.count,
|
|
114
|
+
errors: record.errors,
|
|
115
|
+
actions: Object.fromEntries(record.actions)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return summary;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
wrapServerWithTelemetry,
|
|
123
|
+
getToolUsageStats,
|
|
124
|
+
resetToolUsageStats,
|
|
125
|
+
startToolTelemetryFlush,
|
|
126
|
+
stopToolTelemetryFlush,
|
|
127
|
+
getToolUsageSummary
|
|
128
|
+
};
|