abmind 0.2.5-alpha.0 → 0.2.5
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/SUPPORTED-SURFACE.md +52 -0
- package/dist/cli/abmind-backup.js +1 -1
- package/dist/cli/abmind-backup.js.map +1 -1
- package/dist/cli/abmind-deps.d.ts +8 -0
- package/dist/cli/abmind-deps.d.ts.map +1 -0
- package/dist/cli/abmind-deps.js +55 -0
- package/dist/cli/abmind-deps.js.map +1 -0
- package/dist/cli/abmind-doctor.js +9 -7
- package/dist/cli/abmind-doctor.js.map +1 -1
- package/dist/cli/abmind-embed.js +2 -3
- package/dist/cli/abmind-embed.js.map +1 -1
- package/dist/cli/abmind-expand.d.ts.map +1 -1
- package/dist/cli/abmind-expand.js +2 -3
- package/dist/cli/abmind-expand.js.map +1 -1
- package/dist/cli/abmind-install.js +9 -23
- package/dist/cli/abmind-install.js.map +1 -1
- package/dist/cli/abmind-passwd.js +2 -3
- package/dist/cli/abmind-passwd.js.map +1 -1
- package/dist/cli/abmind-secrets.d.ts.map +1 -1
- package/dist/cli/abmind-secrets.js +2 -3
- package/dist/cli/abmind-secrets.js.map +1 -1
- package/dist/cli/abmind-status-runtime.js +10 -12
- package/dist/cli/abmind-status-runtime.js.map +1 -1
- package/dist/cli/abmind-update-args.d.ts +26 -0
- package/dist/cli/abmind-update-args.d.ts.map +1 -0
- package/dist/cli/abmind-update-args.js +56 -0
- package/dist/cli/abmind-update-args.js.map +1 -0
- package/dist/cli/abmind-update.d.ts +13 -5
- package/dist/cli/abmind-update.d.ts.map +1 -1
- package/dist/cli/abmind-update.js +151 -147
- package/dist/cli/abmind-update.js.map +1 -1
- package/dist/cli/abmind.js +6 -10
- package/dist/cli/abmind.js.map +1 -1
- package/dist/cli/banner.d.ts +6 -0
- package/dist/cli/banner.d.ts.map +1 -1
- package/dist/cli/banner.js +14 -22
- package/dist/cli/banner.js.map +1 -1
- package/dist/cli/lib/native-dep.d.ts +15 -0
- package/dist/cli/lib/native-dep.d.ts.map +1 -0
- package/dist/cli/lib/native-dep.js +25 -0
- package/dist/cli/lib/native-dep.js.map +1 -0
- package/dist/src/context-orchestrator.d.ts +38 -2
- package/dist/src/context-orchestrator.d.ts.map +1 -1
- package/dist/src/context-orchestrator.js +84 -12
- package/dist/src/context-orchestrator.js.map +1 -1
- package/dist/src/index.d.ts +5 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory-db.d.ts.map +1 -1
- package/dist/src/memory-db.js +13 -5
- package/dist/src/memory-db.js.map +1 -1
- package/dist/src/memory-manager.d.ts +8 -0
- package/dist/src/memory-manager.d.ts.map +1 -1
- package/dist/src/memory-manager.js +8 -0
- package/dist/src/memory-manager.js.map +1 -1
- package/dist/src/ollama-embed.d.ts.map +1 -1
- package/dist/src/ollama-embed.js +11 -1
- package/dist/src/ollama-embed.js.map +1 -1
- package/dist/src/sleep/audit.d.ts +27 -0
- package/dist/src/sleep/audit.d.ts.map +1 -0
- package/dist/src/sleep/audit.js +162 -0
- package/dist/src/sleep/audit.js.map +1 -0
- package/dist/src/sleep/locks.d.ts +15 -0
- package/dist/src/sleep/locks.d.ts.map +1 -0
- package/dist/src/sleep/locks.js +45 -0
- package/dist/src/sleep/locks.js.map +1 -0
- package/dist/src/sleep/orchestrator.d.ts +33 -0
- package/dist/src/sleep/orchestrator.d.ts.map +1 -1
- package/dist/src/sleep/orchestrator.js +186 -22
- package/dist/src/sleep/orchestrator.js.map +1 -1
- package/dist/src/sleep/sleep-prompt-loader.d.ts +0 -5
- package/dist/src/sleep/sleep-prompt-loader.d.ts.map +1 -1
- package/dist/src/sleep/sleep-prompt-loader.js +0 -12
- package/dist/src/sleep/sleep-prompt-loader.js.map +1 -1
- package/dist/src/sleep/state.d.ts +47 -0
- package/dist/src/sleep/state.d.ts.map +1 -0
- package/dist/src/sleep/state.js +45 -0
- package/dist/src/sleep/state.js.map +1 -0
- package/package.json +2 -5
|
@@ -8,9 +8,8 @@
|
|
|
8
8
|
* (see cli/abmind.ts). Previously smuggled via process.env["ABMIND_SECRET_ACTION"].
|
|
9
9
|
*/
|
|
10
10
|
import { join } from "node:path";
|
|
11
|
-
import {
|
|
12
|
-
const
|
|
13
|
-
const Database = require("better-sqlite3");
|
|
11
|
+
import { requireNativeDep } from "./lib/native-dep.js";
|
|
12
|
+
const Database = requireNativeDep("better-sqlite3");
|
|
14
13
|
import { loadMemoryConfig } from "../src/memory-config.js";
|
|
15
14
|
import { encrypt, loadKey, loadKeyFromFile, decryptWithKey, hasKey } from "../src/crypto.js";
|
|
16
15
|
export function runSecretsCommand(action) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abmind-secrets.js","sourceRoot":"","sources":["../../cli/abmind-secrets.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"abmind-secrets.js","sourceRoot":"","sources":["../../cli/abmind-secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,19 @@
|
|
|
3
3
|
const _origErr = console.error;
|
|
4
4
|
console.error = () => { };
|
|
5
5
|
/**
|
|
6
|
-
* abmind status-runtime — print
|
|
6
|
+
* abmind status-runtime — print runtime state (lock, key, SOUL, memory, sleep, hooks).
|
|
7
|
+
*
|
|
8
|
+
* #863: the release slot is gone. Version is read from the global install's
|
|
9
|
+
* package.json (via getPackageVersion), not from the manifest. The `current`
|
|
10
|
+
* symlink check is removed. The manifest is still read for install-time
|
|
11
|
+
* metadata (commit, branch, source, activatedAt, host) but those fields
|
|
12
|
+
* are no longer maintained by `abmind update`.
|
|
7
13
|
*
|
|
8
14
|
* Named status-runtime to avoid collision with the renamed memory-stats
|
|
9
15
|
* command. Dispatcher exposes it as `abmind status`.
|
|
10
16
|
*/
|
|
11
|
-
import { inspectLock, packagePaths,
|
|
17
|
+
import { inspectLock, packagePaths, readManifest } from '../src/deploy-lib/index.js';
|
|
18
|
+
import { getPackageVersion } from './banner.js';
|
|
12
19
|
import { printBanner } from './banner.js';
|
|
13
20
|
import { loadMemoryConfig } from '../src/memory-config.js';
|
|
14
21
|
import { MemoryManager } from '../src/memory-manager.js';
|
|
@@ -19,7 +26,6 @@ async function run() {
|
|
|
19
26
|
const paths = packagePaths('abmind');
|
|
20
27
|
const manifest = await readManifest(paths.manifest);
|
|
21
28
|
await printBanner("status");
|
|
22
|
-
const current = await readCurrent(paths.current);
|
|
23
29
|
const lock = await inspectLock(paths.lock);
|
|
24
30
|
if (!manifest) {
|
|
25
31
|
process.stdout.write(`abmind: not installed (no manifest at ${paths.manifest})\n` +
|
|
@@ -29,7 +35,7 @@ async function run() {
|
|
|
29
35
|
const lines = [
|
|
30
36
|
`abmind status`,
|
|
31
37
|
` home: ${paths.home}`,
|
|
32
|
-
` version: ${
|
|
38
|
+
` version: ${getPackageVersion()}`,
|
|
33
39
|
];
|
|
34
40
|
// Only show commit/branch if known
|
|
35
41
|
if (manifest.commit && manifest.commit !== '(unknown)')
|
|
@@ -38,9 +44,6 @@ async function run() {
|
|
|
38
44
|
lines.push(` branch: ${manifest.branch}`);
|
|
39
45
|
lines.push(` source: ${manifest.source}`);
|
|
40
46
|
lines.push(` activated: ${manifest.activatedAt}`);
|
|
41
|
-
// Only show current if releases layout exists
|
|
42
|
-
if (current)
|
|
43
|
-
lines.push(` current ->: ${current}`);
|
|
44
47
|
lines.push(` host: ${manifest.host}`);
|
|
45
48
|
// Key, SOUL, embedding status
|
|
46
49
|
const { statSync, readFileSync: readFs } = await import('node:fs');
|
|
@@ -137,11 +140,6 @@ async function run() {
|
|
|
137
140
|
}
|
|
138
141
|
}
|
|
139
142
|
catch { /* hooks paths unavailable — skip */ }
|
|
140
|
-
if (current !== null && manifest.version !== '' && current !== manifest.version) {
|
|
141
|
-
process.stderr.write(`\nWarning: current symlink points at '${current}' but manifest says '${manifest.version}'.\n` +
|
|
142
|
-
`Re-run 'abmind update' or 'abmind rollback' to reconcile.\n`);
|
|
143
|
-
return 1;
|
|
144
|
-
}
|
|
145
143
|
return 0;
|
|
146
144
|
}
|
|
147
145
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abmind-status-runtime.js","sourceRoot":"","sources":["../../cli/abmind-status-runtime.ts"],"names":[],"mappings":";AACA,sDAAsD;AACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;AAC/B,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;AACzB
|
|
1
|
+
{"version":3,"file":"abmind-status-runtime.js","sourceRoot":"","sources":["../../cli/abmind-status-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* abmind update — CLI argument parsing (#1308).
|
|
3
|
+
*
|
|
4
|
+
* Extracted from abmind-update.ts into a side-effect-free module so it can be
|
|
5
|
+
* unit-tested. abmind-update.ts is dispatched via import-side-effects (the
|
|
6
|
+
* abmind dispatcher does a bare `await load(file)`), so the main module cannot
|
|
7
|
+
* be imported in a test without firing run()/process.exit. This module has no
|
|
8
|
+
* side effects and no path resolution — `localDir` is the raw token; the caller
|
|
9
|
+
* resolves it to an absolute path.
|
|
10
|
+
*/
|
|
11
|
+
export type Channel = "dev" | "alpha" | "stable";
|
|
12
|
+
export interface ParsedArgs {
|
|
13
|
+
readonly channel: Channel;
|
|
14
|
+
/** Raw `<DIR>` token for `--dev <DIR>` (may be relative). Undefined → pull mode. */
|
|
15
|
+
readonly localDir?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse `abmind update` argv.
|
|
19
|
+
*
|
|
20
|
+
* - `--dev` with no dir (or followed by another flag) → pull mode (localDir undefined).
|
|
21
|
+
* - `--dev <DIR>` → manual mode (build that tree as-is, no git fetch).
|
|
22
|
+
* - Multiple channels → "error" (keeps strictness: `--dev --alpha` is rejected,
|
|
23
|
+
* not silently reinterpreted as an alpha install).
|
|
24
|
+
*/
|
|
25
|
+
export declare function parseArgs(argv: readonly string[]): ParsedArgs | "help" | "error";
|
|
26
|
+
//# sourceMappingURL=abmind-update-args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abmind-update-args.d.ts","sourceRoot":"","sources":["../../cli/abmind-update-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CA4BhF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* abmind update — CLI argument parsing (#1308).
|
|
3
|
+
*
|
|
4
|
+
* Extracted from abmind-update.ts into a side-effect-free module so it can be
|
|
5
|
+
* unit-tested. abmind-update.ts is dispatched via import-side-effects (the
|
|
6
|
+
* abmind dispatcher does a bare `await load(file)`), so the main module cannot
|
|
7
|
+
* be imported in a test without firing run()/process.exit. This module has no
|
|
8
|
+
* side effects and no path resolution — `localDir` is the raw token; the caller
|
|
9
|
+
* resolves it to an absolute path.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Parse `abmind update` argv.
|
|
13
|
+
*
|
|
14
|
+
* - `--dev` with no dir (or followed by another flag) → pull mode (localDir undefined).
|
|
15
|
+
* - `--dev <DIR>` → manual mode (build that tree as-is, no git fetch).
|
|
16
|
+
* - Multiple channels → "error" (keeps strictness: `--dev --alpha` is rejected,
|
|
17
|
+
* not silently reinterpreted as an alpha install).
|
|
18
|
+
*/
|
|
19
|
+
export function parseArgs(argv) {
|
|
20
|
+
let channel = null;
|
|
21
|
+
let localDir;
|
|
22
|
+
for (let i = 0; i < argv.length; i++) {
|
|
23
|
+
const a = argv[i];
|
|
24
|
+
if (a === "--dev") {
|
|
25
|
+
if (channel)
|
|
26
|
+
return "error"; // multiple channels → error
|
|
27
|
+
channel = "dev";
|
|
28
|
+
const next = argv[i + 1];
|
|
29
|
+
if (next && !next.startsWith("--")) { // explicit dir → manual mode
|
|
30
|
+
localDir = next;
|
|
31
|
+
i++;
|
|
32
|
+
}
|
|
33
|
+
// no dir (or next is a flag) → localDir stays undefined → pull mode
|
|
34
|
+
}
|
|
35
|
+
else if (a === "--alpha") {
|
|
36
|
+
if (channel)
|
|
37
|
+
return "error"; // e.g. `--dev --alpha` → error
|
|
38
|
+
channel = "alpha";
|
|
39
|
+
}
|
|
40
|
+
else if (a === "--stable") {
|
|
41
|
+
if (channel)
|
|
42
|
+
return "error";
|
|
43
|
+
channel = "stable";
|
|
44
|
+
}
|
|
45
|
+
else if (a === "--help" || a === "-h") {
|
|
46
|
+
return "help";
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
return "error";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!channel)
|
|
53
|
+
return "error";
|
|
54
|
+
return { channel, localDir };
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=abmind-update-args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abmind-update-args.js","sourceRoot":"","sources":["../../cli/abmind-update-args.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,IAAuB;IAC/C,IAAI,OAAO,GAAmB,IAAI,CAAC;IACnC,IAAI,QAA4B,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;YAClB,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC,CAAmB,4BAA4B;YAC3E,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACzB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAU,6BAA6B;gBAC1E,QAAQ,GAAG,IAAI,CAAC;gBAChB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,oEAAoE;QACtE,CAAC;aAAM,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC,CAAmB,+BAA+B;YAC9E,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;YAC5B,OAAO,GAAG,QAAQ,CAAC;QACrB,CAAC;aAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* abmind update
|
|
3
|
+
* abmind update — install a new abmind build to the global npm location.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* Channels:
|
|
6
|
+
* --dev [<DIR>] pull dev into ~/.abmind/src/abmind (no <DIR>), or build
|
|
7
|
+
* the tree at <DIR> as-is, then install globally
|
|
8
|
+
* --alpha npm install -g abmind@alpha
|
|
9
|
+
* --stable npm install -g abmind@latest
|
|
10
|
+
*
|
|
11
|
+
* #863: writes ONLY to the global install. No release slot, no rollback.
|
|
12
|
+
* #1268: writes manifest (version + commit + source) after successful install
|
|
13
|
+
* so the /update slash command can detect channel changes and skip no-op deploys.
|
|
14
|
+
* #1308: --dev owns its source. No <DIR> → clone/fetch dev into
|
|
15
|
+
* ~/.abmind/src/abmind, then build + install. No-op skip when the pulled HEAD
|
|
16
|
+
* matches the installed local commit. Explicit <DIR> always builds (no pull).
|
|
9
17
|
*/
|
|
10
18
|
export {};
|
|
11
19
|
//# sourceMappingURL=abmind-update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abmind-update.d.ts","sourceRoot":"","sources":["../../cli/abmind-update.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"abmind-update.d.ts","sourceRoot":"","sources":["../../cli/abmind-update.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -1,177 +1,181 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* abmind update
|
|
3
|
+
* abmind update — install a new abmind build to the global npm location.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* Channels:
|
|
6
|
+
* --dev [<DIR>] pull dev into ~/.abmind/src/abmind (no <DIR>), or build
|
|
7
|
+
* the tree at <DIR> as-is, then install globally
|
|
8
|
+
* --alpha npm install -g abmind@alpha
|
|
9
|
+
* --stable npm install -g abmind@latest
|
|
10
|
+
*
|
|
11
|
+
* #863: writes ONLY to the global install. No release slot, no rollback.
|
|
12
|
+
* #1268: writes manifest (version + commit + source) after successful install
|
|
13
|
+
* so the /update slash command can detect channel changes and skip no-op deploys.
|
|
14
|
+
* #1308: --dev owns its source. No <DIR> → clone/fetch dev into
|
|
15
|
+
* ~/.abmind/src/abmind, then build + install. No-op skip when the pulled HEAD
|
|
16
|
+
* matches the installed local commit. Explicit <DIR> always builds (no pull).
|
|
9
17
|
*/
|
|
10
|
-
import { spawnSync } from
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
18
|
+
import { spawnSync } from "node:child_process";
|
|
19
|
+
import { existsSync, lstatSync, unlinkSync, rmSync, writeFileSync, readFileSync, mkdirSync } from "node:fs";
|
|
20
|
+
import { homedir, hostname } from "node:os";
|
|
21
|
+
import { isAbsolute, join, resolve, dirname } from "node:path";
|
|
22
|
+
import { acquireLock, packagePaths, readManifest, writeManifest, emptyManifest } from "../src/deploy-lib/index.js";
|
|
23
|
+
import { parseArgs } from "./abmind-update-args.js";
|
|
24
|
+
/** Git remote for the abmind dev source (#1308). */
|
|
25
|
+
const ABMIND_DEV_REPO = "https://github.com/aksika/abmind.git";
|
|
16
26
|
function runCmd(cmd, args, cwd) {
|
|
17
|
-
const r = spawnSync(cmd, args, { cwd, stdio:
|
|
27
|
+
const r = spawnSync(cmd, args, { cwd, stdio: "inherit" });
|
|
18
28
|
if (r.status !== 0) {
|
|
19
|
-
throw new Error(`${cmd} ${args.join(
|
|
29
|
+
throw new Error(`${cmd} ${args.join(" ")} exited with status ${r.status ?? -1}`);
|
|
20
30
|
}
|
|
21
31
|
}
|
|
22
|
-
function
|
|
23
|
-
const r = spawnSync(cmd, args, { cwd, encoding:
|
|
32
|
+
function runCmdStdout(cmd, args, cwd) {
|
|
33
|
+
const r = spawnSync(cmd, args, { cwd, encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
|
|
24
34
|
if (r.status !== 0)
|
|
25
|
-
|
|
35
|
+
throw new Error(`${cmd} ${args.join(" ")} exited with status ${r.status}`);
|
|
26
36
|
return r.stdout.trim();
|
|
27
37
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Ensure `dir` holds a fresh checkout of abmind's dev branch (#1308).
|
|
40
|
+
* Clone (shallow, -b dev) if absent; otherwise fetch + force-checkout origin/dev.
|
|
41
|
+
* Throws on any git failure — the caller surfaces a loud error, never silent.
|
|
42
|
+
*/
|
|
43
|
+
function pullDevSource(dir) {
|
|
44
|
+
if (!existsSync(join(dir, ".git"))) {
|
|
45
|
+
mkdirSync(dirname(dir), { recursive: true });
|
|
46
|
+
runCmd("git", ["clone", "--depth", "1", "-b", "dev", ABMIND_DEV_REPO, dir], dirname(dir));
|
|
34
47
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (branch === 'HEAD' || branch === null) {
|
|
39
|
-
throw new Error('Detached HEAD (no current branch). Pass --from-local to proceed.');
|
|
48
|
+
else {
|
|
49
|
+
runCmd("git", ["-C", dir, "fetch", "origin", "dev"], dir);
|
|
50
|
+
runCmd("git", ["-C", dir, "checkout", "-f", "origin/dev"], dir);
|
|
40
51
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
}
|
|
53
|
+
function printHelp() {
|
|
54
|
+
process.stdout.write(`abmind update — install a new abmind build
|
|
55
|
+
|
|
56
|
+
Usage:
|
|
57
|
+
abmind update --dev [<DIR>] Pull dev into ~/.abmind/src/abmind (no <DIR>),
|
|
58
|
+
build, and install globally. With <DIR>, build
|
|
59
|
+
that tree as-is (no git fetch).
|
|
60
|
+
abmind update --alpha Install latest alpha from npm
|
|
61
|
+
abmind update --stable Install latest stable from npm
|
|
62
|
+
|
|
63
|
+
Updates the global abmind install at \$(npm root -g)/abmind. The \`abmind\`
|
|
64
|
+
command on PATH picks up the new code immediately. Writes manifest
|
|
65
|
+
(version + commit + source) for /update slash command coordination.
|
|
66
|
+
`);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* One-shot cleanup of the old release slot system, removed by #863.
|
|
70
|
+
* Runs once per host, guarded by a marker file.
|
|
71
|
+
*/
|
|
72
|
+
function cleanupOldReleaseSlot(home) {
|
|
73
|
+
const marker = join(home, ".update-v2-cleanup-done");
|
|
74
|
+
if (existsSync(marker))
|
|
75
|
+
return;
|
|
76
|
+
const currentLink = join(home, "current");
|
|
77
|
+
const releasesDir = join(home, "releases");
|
|
78
|
+
try {
|
|
79
|
+
if (lstatSync(currentLink).isSymbolicLink())
|
|
80
|
+
unlinkSync(currentLink);
|
|
45
81
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
throw new Error(`Could not determine how far HEAD is behind ${upstream}. Pass --from-local.`);
|
|
82
|
+
catch { /* not present */ }
|
|
83
|
+
try {
|
|
84
|
+
rmSync(releasesDir, { recursive: true, force: true });
|
|
50
85
|
}
|
|
51
|
-
|
|
52
|
-
|
|
86
|
+
catch { /* not present */ }
|
|
87
|
+
try {
|
|
88
|
+
writeFileSync(marker, new Date().toISOString());
|
|
53
89
|
}
|
|
54
|
-
|
|
90
|
+
catch { /* non-fatal — best-effort cleanup */ }
|
|
55
91
|
}
|
|
56
92
|
async function run() {
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
: 'local';
|
|
65
|
-
const fromLocal = argv.includes('--from-local');
|
|
66
|
-
if (source !== 'local' && source !== 'npm') {
|
|
67
|
-
process.stderr.write(`--source ${source} is not yet supported.\nUse --source local (default) or --source npm.\n`);
|
|
93
|
+
const parsed = parseArgs(process.argv.slice(2));
|
|
94
|
+
if (parsed === "help") {
|
|
95
|
+
printHelp();
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
if (parsed === "error") {
|
|
99
|
+
printHelp();
|
|
68
100
|
return 2;
|
|
69
101
|
}
|
|
70
|
-
const
|
|
102
|
+
const { printBanner } = await import("./banner.js");
|
|
103
|
+
await printBanner("update");
|
|
104
|
+
// One-shot cleanup of the old release slot (best-effort, non-fatal).
|
|
105
|
+
const home = process.env["ABMIND_HOME"] ?? join(homedir(), ".abmind");
|
|
106
|
+
cleanupOldReleaseSlot(home);
|
|
107
|
+
// Default dev source checkout owned by abmind (#1308). Only used on the
|
|
108
|
+
// no-<DIR> path; an explicit <DIR> builds that tree as-is (no pull).
|
|
109
|
+
const defaultDevSrc = join(home, "src", "abmind");
|
|
110
|
+
// Acquire the update lock to serialize concurrent updates.
|
|
111
|
+
// The lock is at ~/.abmind/.update.lock and is released on exit.
|
|
112
|
+
const paths = packagePaths("abmind");
|
|
113
|
+
const release = await acquireLock(paths.lock, `update --${parsed.channel}`);
|
|
114
|
+
let version;
|
|
115
|
+
let commit;
|
|
116
|
+
let source;
|
|
71
117
|
try {
|
|
72
|
-
if (
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
118
|
+
if (parsed.channel === "dev") {
|
|
119
|
+
const explicit = parsed.localDir !== undefined;
|
|
120
|
+
const dir = parsed.localDir !== undefined
|
|
121
|
+
? (isAbsolute(parsed.localDir) ? parsed.localDir : resolve(process.cwd(), parsed.localDir))
|
|
122
|
+
: defaultDevSrc;
|
|
123
|
+
if (!explicit) {
|
|
124
|
+
pullDevSource(dir);
|
|
125
|
+
const head = runCmdStdout("git", ["-C", dir, "rev-parse", "--short", "HEAD"]);
|
|
126
|
+
const prior = await readManifest(paths.manifest);
|
|
127
|
+
if (prior?.source === "local" && prior.commit === head) {
|
|
128
|
+
process.stdout.write(`abmind already up to date (${head}) — skipping build\n`);
|
|
129
|
+
return 0;
|
|
130
|
+
}
|
|
79
131
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return 0;
|
|
132
|
+
if (!existsSync(dir) || !existsSync(`${dir}/package.json`)) {
|
|
133
|
+
process.stderr.write(`Not an abmind source tree: ${dir}\n`);
|
|
134
|
+
return 2;
|
|
84
135
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
catch { }
|
|
95
|
-
runCmd('npm', ['install', '--omit=dev', '--no-audit', '--no-fund'], stagedPath);
|
|
96
|
-
await activate(join(paths.home, 'current'), latest);
|
|
97
|
-
await pruneReleases(paths.releases, [], latest);
|
|
98
|
-
process.stdout.write(`✓ abmind updated to ${latest} (npm)\n`);
|
|
99
|
-
return 0;
|
|
136
|
+
process.stdout.write(`Building abmind from ${dir}...\n`);
|
|
137
|
+
runCmd("npm", ["install", "--no-audit", "--no-fund"], dir);
|
|
138
|
+
runCmd("npm", ["run", "build"], dir);
|
|
139
|
+
process.stdout.write(`Installing to global location...\n`);
|
|
140
|
+
runCmd("npm", ["install", "-g", "--no-audit", "--no-fund", "."], dir);
|
|
141
|
+
const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf-8"));
|
|
142
|
+
version = pkg.version;
|
|
143
|
+
commit = runCmdStdout("git", ["-C", dir, "rev-parse", "--short", "HEAD"]);
|
|
144
|
+
source = "local";
|
|
100
145
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
runCmd('npm', ['run', 'build'], repoRoot);
|
|
110
|
-
const stagedPath = join(paths.releases, version);
|
|
111
|
-
await rm(stagedPath, { recursive: true, force: true });
|
|
112
|
-
await mkdir(stagedPath, { recursive: true });
|
|
113
|
-
await cp(join(repoRoot, 'dist'), join(stagedPath, 'dist'), { recursive: true });
|
|
114
|
-
// Sync node_modules/ via rsync -aL to dereference symlinks (the
|
|
115
|
-
// "abmind": "file:../abmind" package dep becomes a symlink that we
|
|
116
|
-
// must materialize into the release, or the runtime runs live code
|
|
117
|
-
// from the dev workspace. Also contends with npm test for SQLite locks.)
|
|
118
|
-
await rm(paths.nodeModules, { recursive: true, force: true });
|
|
119
|
-
await mkdir(paths.nodeModules, { recursive: true });
|
|
120
|
-
const rsyncResult = spawnSync('rsync', ['-aL', '--quiet', `${join(repoRoot, 'node_modules')}/`, `${paths.nodeModules}/`], { stdio: 'inherit' });
|
|
121
|
-
if (rsyncResult.status !== 0) {
|
|
122
|
-
throw new Error(`rsync of node_modules failed (status ${rsyncResult.status ?? -1})`);
|
|
146
|
+
else if (parsed.channel === "alpha") {
|
|
147
|
+
process.stdout.write(`Installing abmind@alpha from npm...\n`);
|
|
148
|
+
runCmd("npm", ["install", "-g", "--no-audit", "--no-fund", "abmind@alpha"], process.cwd());
|
|
149
|
+
const globalRoot = runCmdStdout("npm", ["root", "-g"]);
|
|
150
|
+
const globalPkg = JSON.parse(readFileSync(join(globalRoot, "abmind", "package.json"), "utf-8"));
|
|
151
|
+
version = globalPkg.version;
|
|
152
|
+
commit = `npm:${version}`;
|
|
153
|
+
source = "npm";
|
|
123
154
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
{
|
|
133
|
-
version: prior.version,
|
|
134
|
-
commit: prior.commit,
|
|
135
|
-
activatedAt: prior.activatedAt,
|
|
136
|
-
packageLockHash: prior.packageLockHash,
|
|
137
|
-
},
|
|
138
|
-
...(prior.priorReleases ?? []),
|
|
139
|
-
].slice(0, RETENTION - 1)
|
|
140
|
-
: prior?.priorReleases ?? [];
|
|
141
|
-
await writeManifest(paths.manifest, {
|
|
142
|
-
...(prior ?? emptyManifest('abmind', hostname())),
|
|
143
|
-
version,
|
|
144
|
-
commit,
|
|
145
|
-
branch,
|
|
146
|
-
packageLockHash,
|
|
147
|
-
activatedAt: now,
|
|
148
|
-
source: 'local',
|
|
149
|
-
priorReleases: newPriorReleases,
|
|
150
|
-
});
|
|
151
|
-
process.stdout.write(`✓ manifest updated\n`);
|
|
152
|
-
const pruned = await pruneReleases(paths.releases, [version, ...newPriorReleases.map((r) => r.version)], version, RETENTION);
|
|
153
|
-
if (pruned.length > 0) {
|
|
154
|
-
process.stdout.write(`✓ pruned ${pruned.length} old release(s): ${pruned.join(', ')}\n`);
|
|
155
|
+
else {
|
|
156
|
+
process.stdout.write(`Installing abmind@latest from npm...\n`);
|
|
157
|
+
runCmd("npm", ["install", "-g", "--no-audit", "--no-fund", "abmind@latest"], process.cwd());
|
|
158
|
+
const globalRoot = runCmdStdout("npm", ["root", "-g"]);
|
|
159
|
+
const globalPkg = JSON.parse(readFileSync(join(globalRoot, "abmind", "package.json"), "utf-8"));
|
|
160
|
+
version = globalPkg.version;
|
|
161
|
+
commit = `npm:${version}`;
|
|
162
|
+
source = "npm";
|
|
155
163
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
for (const p of stalePaths) {
|
|
169
|
-
try {
|
|
170
|
-
unlinkSync(p);
|
|
171
|
-
process.stdout.write(`✓ removed stale ${p}\n`);
|
|
172
|
-
}
|
|
173
|
-
catch { /* ENOENT — already gone */ }
|
|
164
|
+
// Write manifest — best-effort (#1268: partial revert of #863)
|
|
165
|
+
try {
|
|
166
|
+
mkdirSync(dirname(paths.manifest), { recursive: true });
|
|
167
|
+
const prior = await readManifest(paths.manifest);
|
|
168
|
+
const base = prior ?? emptyManifest("abmind", hostname());
|
|
169
|
+
await writeManifest(paths.manifest, {
|
|
170
|
+
...base,
|
|
171
|
+
version,
|
|
172
|
+
commit,
|
|
173
|
+
source,
|
|
174
|
+
activatedAt: new Date().toISOString(),
|
|
175
|
+
});
|
|
174
176
|
}
|
|
177
|
+
catch { /* best-effort — update succeeded even if manifest write fails */ }
|
|
178
|
+
process.stdout.write(`\u2713 abmind update complete\n`);
|
|
175
179
|
return 0;
|
|
176
180
|
}
|
|
177
181
|
finally {
|