@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,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ingest
|
|
3
|
+
} from "./chunk-XJZBSTL5.js";
|
|
4
|
+
import "./chunk-WUKHLCBE.js";
|
|
5
|
+
import "./chunk-2I23RPSI.js";
|
|
6
|
+
import "./chunk-2E43UXRH.js";
|
|
7
|
+
import "./chunk-PNQDP3OA.js";
|
|
8
|
+
import "./chunk-7HLWBYH7.js";
|
|
9
|
+
import "./chunk-FXU7JOXK.js";
|
|
10
|
+
import "./chunk-R36FAN53.js";
|
|
11
|
+
import "./chunk-LYH5HE24.js";
|
|
12
|
+
import "./chunk-MLKGABMK.js";
|
|
13
|
+
export {
|
|
14
|
+
ingest
|
|
15
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PlanLimitError,
|
|
3
|
+
assertEmployeeLimit,
|
|
4
|
+
assertEmployeeLimitSync,
|
|
5
|
+
assertFeature,
|
|
6
|
+
assertMemoryLimit,
|
|
7
|
+
countActiveMemories,
|
|
8
|
+
getLicenseSync
|
|
9
|
+
} from "./chunk-5CCXU2AW.js";
|
|
10
|
+
import "./chunk-WUKHLCBE.js";
|
|
11
|
+
import "./chunk-2I23RPSI.js";
|
|
12
|
+
import "./chunk-2E43UXRH.js";
|
|
13
|
+
import "./chunk-PNQDP3OA.js";
|
|
14
|
+
import "./chunk-7HLWBYH7.js";
|
|
15
|
+
import "./chunk-FXU7JOXK.js";
|
|
16
|
+
import "./chunk-YTKVJJSU.js";
|
|
17
|
+
import "./chunk-R36FAN53.js";
|
|
18
|
+
import "./chunk-LYH5HE24.js";
|
|
19
|
+
import "./chunk-MLKGABMK.js";
|
|
20
|
+
export {
|
|
21
|
+
PlanLimitError,
|
|
22
|
+
assertEmployeeLimit,
|
|
23
|
+
assertEmployeeLimitSync,
|
|
24
|
+
assertFeature,
|
|
25
|
+
assertMemoryLimit,
|
|
26
|
+
countActiveMemories,
|
|
27
|
+
getLicenseSync
|
|
28
|
+
};
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EXE_AI_DIR
|
|
3
|
+
} from "./chunk-R36FAN53.js";
|
|
4
|
+
import "./chunk-LYH5HE24.js";
|
|
5
|
+
import "./chunk-MLKGABMK.js";
|
|
6
|
+
|
|
7
|
+
// src/bin/project-boot.ts
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
import { existsSync, readFileSync } from "fs";
|
|
11
|
+
import net from "net";
|
|
12
|
+
var DAEMON_URL = "http://127.0.0.1:48739";
|
|
13
|
+
var EXE_DIR = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? path.join(process.env.HOME ?? "/tmp", ".exe-os");
|
|
14
|
+
var SOCK_PATH = path.join(EXE_DIR, "exed.sock");
|
|
15
|
+
var TOKEN_PATH = path.join(EXE_DIR, "exed.token");
|
|
16
|
+
function getDaemonToken() {
|
|
17
|
+
try {
|
|
18
|
+
if (!existsSync(TOKEN_PATH)) return null;
|
|
19
|
+
return readFileSync(TOKEN_PATH, "utf-8").trim();
|
|
20
|
+
} catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function detectProject() {
|
|
25
|
+
try {
|
|
26
|
+
const root = execSync("git rev-parse --show-toplevel 2>/dev/null", {
|
|
27
|
+
encoding: "utf8",
|
|
28
|
+
timeout: 3e3
|
|
29
|
+
}).trim();
|
|
30
|
+
if (root) return path.basename(root);
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
function formatTimeAgo(isoTimestamp) {
|
|
36
|
+
const then = new Date(isoTimestamp).getTime();
|
|
37
|
+
if (Number.isNaN(then)) return "unknown";
|
|
38
|
+
const diffMs = Date.now() - then;
|
|
39
|
+
const diffMinutes = Math.floor(diffMs / 6e4);
|
|
40
|
+
if (diffMinutes < 60) return `${diffMinutes}m ago`;
|
|
41
|
+
const diffHours = Math.floor(diffMinutes / 60);
|
|
42
|
+
if (diffHours < 48) return `${diffHours}h ago`;
|
|
43
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
44
|
+
return `${diffDays}d ago`;
|
|
45
|
+
}
|
|
46
|
+
function getLastCommit() {
|
|
47
|
+
try {
|
|
48
|
+
return execSync("git log --oneline -1 2>/dev/null", {
|
|
49
|
+
encoding: "utf8",
|
|
50
|
+
timeout: 3e3
|
|
51
|
+
}).trim() || null;
|
|
52
|
+
} catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function getGitBranch() {
|
|
57
|
+
try {
|
|
58
|
+
return execSync("git branch --show-current 2>/dev/null", {
|
|
59
|
+
encoding: "utf8",
|
|
60
|
+
timeout: 3e3
|
|
61
|
+
}).trim() || null;
|
|
62
|
+
} catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function projectBoot(options) {
|
|
67
|
+
const startTime = performance.now();
|
|
68
|
+
const project = options.project || detectProject();
|
|
69
|
+
if (!project) {
|
|
70
|
+
return "Error: No --project specified and could not detect project from git repo.\nUsage: exe-os boot --project <name>";
|
|
71
|
+
}
|
|
72
|
+
const agentId = process.env.AGENT_ID || "default";
|
|
73
|
+
const testDbClient = process.env.VITEST === "true" || process.env.NODE_ENV === "test" ? (await import("./lib/database.js")).getClient() : null;
|
|
74
|
+
const daemonQuery = (sql, args) => {
|
|
75
|
+
if (testDbClient) {
|
|
76
|
+
return Promise.resolve(testDbClient.execute({ sql, args }));
|
|
77
|
+
}
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
if (!existsSync(SOCK_PATH)) {
|
|
80
|
+
reject(new Error("Daemon socket not found"));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const sock = net.createConnection(SOCK_PATH);
|
|
84
|
+
const id = `boot-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
85
|
+
let buf = "";
|
|
86
|
+
const timeout = setTimeout(() => {
|
|
87
|
+
sock.destroy();
|
|
88
|
+
reject(new Error("timeout"));
|
|
89
|
+
}, 5e3);
|
|
90
|
+
sock.on("connect", () => {
|
|
91
|
+
const token = getDaemonToken();
|
|
92
|
+
sock.write(JSON.stringify({ id, type: "db-execute", sql, args, token }) + "\n");
|
|
93
|
+
});
|
|
94
|
+
sock.on("data", (chunk) => {
|
|
95
|
+
buf += chunk.toString();
|
|
96
|
+
const lines = buf.split("\n");
|
|
97
|
+
for (const line of lines) {
|
|
98
|
+
if (!line.trim()) continue;
|
|
99
|
+
try {
|
|
100
|
+
const parsed = JSON.parse(line);
|
|
101
|
+
if (parsed.id === id) {
|
|
102
|
+
clearTimeout(timeout);
|
|
103
|
+
sock.destroy();
|
|
104
|
+
if (parsed.error) {
|
|
105
|
+
reject(new Error(String(parsed.error)));
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const db = parsed.db;
|
|
109
|
+
resolve({ rows: db?.rows ?? [] });
|
|
110
|
+
}
|
|
111
|
+
} catch {
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
sock.on("error", (err) => {
|
|
116
|
+
clearTimeout(timeout);
|
|
117
|
+
reject(err);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
const lastCommit = getLastCommit();
|
|
122
|
+
const gitBranch = getGitBranch();
|
|
123
|
+
let workingMemoryResult = 0;
|
|
124
|
+
let behaviorResult = { total: 0, p0: 0, p1: 0 };
|
|
125
|
+
let identityInfo;
|
|
126
|
+
let lastSessionResult = null;
|
|
127
|
+
let daemonResult = { healthy: false, pid: null };
|
|
128
|
+
let totalMemoryResult = 0;
|
|
129
|
+
let openTasksResult = 0;
|
|
130
|
+
try {
|
|
131
|
+
const results = await Promise.all([
|
|
132
|
+
// Working memory count
|
|
133
|
+
daemonQuery("SELECT COUNT(*) as cnt FROM memories WHERE project_name = ? AND importance >= 7", [project]).then((r) => Number(r.rows[0]?.cnt) || 0).catch(() => 0),
|
|
134
|
+
// Behavior counts
|
|
135
|
+
daemonQuery("SELECT priority, COUNT(*) as cnt FROM behaviors WHERE active = 1 AND agent_id = ? GROUP BY priority", [agentId]).then((r) => {
|
|
136
|
+
let total = 0, p0 = 0, p1 = 0;
|
|
137
|
+
for (const row2 of r.rows) {
|
|
138
|
+
const count = Number(row2.cnt) || 0;
|
|
139
|
+
total += count;
|
|
140
|
+
const pri = String(row2.priority ?? "p1").toLowerCase();
|
|
141
|
+
if (pri === "p0") p0 = count;
|
|
142
|
+
else if (pri === "p1") p1 = count;
|
|
143
|
+
}
|
|
144
|
+
return { total, p0, p1 };
|
|
145
|
+
}).catch(() => ({ total: 0, p0: 0, p1: 0 })),
|
|
146
|
+
// Identity — from file (fast, no DB)
|
|
147
|
+
(async () => {
|
|
148
|
+
try {
|
|
149
|
+
const identityFile = path.join(EXE_AI_DIR, "identity", `${agentId}.md`);
|
|
150
|
+
if (existsSync(identityFile)) {
|
|
151
|
+
const raw = readFileSync(identityFile, "utf-8");
|
|
152
|
+
const titleMatch = raw.match(/^title:\s*(.+)/m);
|
|
153
|
+
const roleMatch = raw.match(/^role:\s*(.+)/m);
|
|
154
|
+
return { found: true, display: titleMatch?.[1]?.trim() || roleMatch?.[1]?.trim() || "unknown" };
|
|
155
|
+
}
|
|
156
|
+
return { found: false, display: "unknown" };
|
|
157
|
+
} catch {
|
|
158
|
+
return { found: false, display: "unknown" };
|
|
159
|
+
}
|
|
160
|
+
})(),
|
|
161
|
+
// Last session summary
|
|
162
|
+
daemonQuery(
|
|
163
|
+
`SELECT raw_text, timestamp FROM memories
|
|
164
|
+
WHERE project_name = ?
|
|
165
|
+
AND (raw_text LIKE '%CONTEXT CHECKPOINT%' OR raw_text LIKE '%CONTEXT COMMIT%'
|
|
166
|
+
OR raw_text LIKE '%session-end%' OR raw_text LIKE '%session-handoff%'
|
|
167
|
+
OR raw_text LIKE '%Snapshot saved%' OR memory_type = 'commit_to_long_term_memory')
|
|
168
|
+
ORDER BY timestamp DESC LIMIT 1`,
|
|
169
|
+
[project]
|
|
170
|
+
).then((r) => {
|
|
171
|
+
if (r.rows.length > 0) {
|
|
172
|
+
return {
|
|
173
|
+
text: String(r.rows[0].raw_text ?? r.rows[0].text ?? ""),
|
|
174
|
+
timestamp: String(r.rows[0].timestamp ?? r.rows[0].created_at ?? "")
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}).catch(() => null),
|
|
179
|
+
// Daemon health — if we got this far, daemon socket is alive.
|
|
180
|
+
// Extract PID from daemon ping via HTTP (lightweight, non-blocking).
|
|
181
|
+
(async () => {
|
|
182
|
+
try {
|
|
183
|
+
const r = await fetch(`${DAEMON_URL}/v1/ping`, { signal: AbortSignal.timeout(3e3) });
|
|
184
|
+
if (r.ok) {
|
|
185
|
+
const data = await r.json();
|
|
186
|
+
return { healthy: true, pid: data.pid ?? null };
|
|
187
|
+
}
|
|
188
|
+
} catch {
|
|
189
|
+
}
|
|
190
|
+
if (process.env.VITEST === "true" || process.env.NODE_ENV === "test") {
|
|
191
|
+
return { healthy: false, pid: null };
|
|
192
|
+
}
|
|
193
|
+
return { healthy: true, pid: null };
|
|
194
|
+
})(),
|
|
195
|
+
// Total active memories — match memory(action='cardinality') so the boot
|
|
196
|
+
// brief cannot inflate counts by including deleted/archived rows.
|
|
197
|
+
daemonQuery("SELECT COUNT(*) as cnt FROM memories WHERE COALESCE(status, 'active') = 'active'", []).then((r) => Number(r.rows[0]?.cnt) || 0).catch(() => 0),
|
|
198
|
+
// Open tasks
|
|
199
|
+
daemonQuery(
|
|
200
|
+
"SELECT COUNT(*) as cnt FROM tasks WHERE assigned_to = ? AND status IN ('open', 'in_progress') AND project_name = ?",
|
|
201
|
+
[agentId, project]
|
|
202
|
+
).then((r) => Number(r.rows[0]?.cnt) || 0).catch(() => 0)
|
|
203
|
+
]);
|
|
204
|
+
workingMemoryResult = results[0];
|
|
205
|
+
behaviorResult = results[1];
|
|
206
|
+
identityInfo = results[2];
|
|
207
|
+
lastSessionResult = results[3];
|
|
208
|
+
daemonResult = results[4];
|
|
209
|
+
totalMemoryResult = results[5];
|
|
210
|
+
openTasksResult = results[6];
|
|
211
|
+
} catch (err) {
|
|
212
|
+
const elapsed2 = ((performance.now() - startTime) / 1e3).toFixed(1);
|
|
213
|
+
return [
|
|
214
|
+
`Boot failed for project: ${project}`,
|
|
215
|
+
`Daemon unavailable: ${err instanceof Error ? err.message : String(err)}`,
|
|
216
|
+
`Start daemon: exe-os update`,
|
|
217
|
+
`Failed in ${elapsed2}s`
|
|
218
|
+
].join("\n");
|
|
219
|
+
}
|
|
220
|
+
const elapsed = ((performance.now() - startTime) / 1e3).toFixed(1);
|
|
221
|
+
let sessionLine;
|
|
222
|
+
if (lastSessionResult) {
|
|
223
|
+
const timeAgo = formatTimeAgo(lastSessionResult.timestamp);
|
|
224
|
+
const lines = lastSessionResult.text.split("\n").filter((l) => l.trim() && !l.startsWith("#"));
|
|
225
|
+
const preview = (lines[0] || lastSessionResult.text).slice(0, 80);
|
|
226
|
+
sessionLine = `${timeAgo} \u2014 ${preview}${preview.length >= 80 ? "..." : ""}`;
|
|
227
|
+
} else {
|
|
228
|
+
sessionLine = "no previous session found";
|
|
229
|
+
}
|
|
230
|
+
let autoFixLine = "no recent cycles";
|
|
231
|
+
try {
|
|
232
|
+
const { execSync: exec } = await import("child_process");
|
|
233
|
+
const openPRs = exec("gh pr list --state open --label auto-fix --json number,title,createdAt 2>/dev/null || echo '[]'", {
|
|
234
|
+
encoding: "utf8",
|
|
235
|
+
timeout: 5e3
|
|
236
|
+
}).trim();
|
|
237
|
+
const open = JSON.parse(openPRs || "[]");
|
|
238
|
+
const mergedPRs = exec("gh pr list --state merged --label auto-fix --limit 3 --json number,title,mergedAt 2>/dev/null || echo '[]'", {
|
|
239
|
+
encoding: "utf8",
|
|
240
|
+
timeout: 5e3
|
|
241
|
+
}).trim();
|
|
242
|
+
const merged = JSON.parse(mergedPRs || "[]");
|
|
243
|
+
if (open.length > 0) {
|
|
244
|
+
autoFixLine = `\u{1F527} PR #${open[0].number} open (${formatTimeAgo(open[0].createdAt)})`;
|
|
245
|
+
} else if (merged.length > 0) {
|
|
246
|
+
autoFixLine = `\u2705 PR #${merged[0].number} merged ${formatTimeAgo(merged[0].mergedAt)}`;
|
|
247
|
+
}
|
|
248
|
+
} catch {
|
|
249
|
+
}
|
|
250
|
+
const rows = [
|
|
251
|
+
["Memory", `${workingMemoryResult.toLocaleString()} working`, `${totalMemoryResult.toLocaleString()} total`],
|
|
252
|
+
["Behaviors", `${behaviorResult.total} active`, `${behaviorResult.p0} p0, ${behaviorResult.p1} p1`],
|
|
253
|
+
["Identity", identityInfo.found ? `\u2705 ${agentId}` : `\u274C ${agentId}`, identityInfo.display],
|
|
254
|
+
["Daemon", daemonResult.healthy ? `\u2705 healthy` : `\u274C unhealthy`, daemonResult.pid ? `PID ${daemonResult.pid}` : "run: exe-os healthcheck"],
|
|
255
|
+
["Last session", sessionLine.slice(0, 60), sessionLine.length > 60 ? sessionLine.slice(60, 120) : ""]
|
|
256
|
+
];
|
|
257
|
+
if (lastCommit) {
|
|
258
|
+
const commitShort = lastCommit.length > 50 ? lastCommit.slice(0, 50) + "..." : lastCommit;
|
|
259
|
+
rows.push(["Last commit", commitShort, gitBranch ?? ""]);
|
|
260
|
+
}
|
|
261
|
+
if (openTasksResult > 0) {
|
|
262
|
+
rows.push(["Open tasks", `${openTasksResult} pending`, ""]);
|
|
263
|
+
}
|
|
264
|
+
rows.push(["Auto-fix", autoFixLine, ""]);
|
|
265
|
+
const col1W = Math.max(14, ...rows.map((r) => r[0].length)) + 2;
|
|
266
|
+
const col2W = Math.max(20, ...rows.map((r) => r[1].length)) + 2;
|
|
267
|
+
const col3W = Math.max(15, ...rows.map((r) => r[2].length)) + 2;
|
|
268
|
+
const row = (a, b, c) => "\u2502" + ` ${a}`.padEnd(col1W) + "\u2502" + ` ${b}`.padEnd(col2W) + "\u2502" + ` ${c}`.padEnd(col3W) + "\u2502";
|
|
269
|
+
const report = [
|
|
270
|
+
"",
|
|
271
|
+
` \u{1F680} exe-os boot \u2014 ${project} (${elapsed}s)`,
|
|
272
|
+
"",
|
|
273
|
+
" \u250C" + "\u2500".repeat(col1W) + "\u252C" + "\u2500".repeat(col2W) + "\u252C" + "\u2500".repeat(col3W) + "\u2510",
|
|
274
|
+
" " + row("Item", "Status", "Details"),
|
|
275
|
+
" \u251C" + "\u2500".repeat(col1W) + "\u253C" + "\u2500".repeat(col2W) + "\u253C" + "\u2500".repeat(col3W) + "\u2524"
|
|
276
|
+
];
|
|
277
|
+
for (const [a, b, c] of rows) {
|
|
278
|
+
report.push(" " + row(a, b, c));
|
|
279
|
+
}
|
|
280
|
+
report.push(" \u2514" + "\u2500".repeat(col1W) + "\u2534" + "\u2500".repeat(col2W) + "\u2534" + "\u2500".repeat(col3W) + "\u2518");
|
|
281
|
+
report.push("");
|
|
282
|
+
return report.join("\n");
|
|
283
|
+
}
|
|
284
|
+
function parseBootArgs(argv) {
|
|
285
|
+
const options = {};
|
|
286
|
+
for (let i = 0; i < argv.length; i++) {
|
|
287
|
+
const arg = argv[i];
|
|
288
|
+
if (arg === "--project" && argv[i + 1]) {
|
|
289
|
+
options.project = argv[++i];
|
|
290
|
+
} else if (arg.startsWith("--project=")) {
|
|
291
|
+
options.project = arg.slice("--project=".length);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return options;
|
|
295
|
+
}
|
|
296
|
+
export {
|
|
297
|
+
parseBootArgs,
|
|
298
|
+
projectBoot
|
|
299
|
+
};
|