@addai/node 0.30.16-msp.7 → 0.30.16-msp.8
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/mcp-direct.d.ts +22 -0
- package/dist/mcp-direct.js +163 -0
- package/dist/memory-pack.d.ts +7 -1
- package/dist/memory-pack.js +14 -2
- package/dist/memory-recall.js +49 -11
- package/dist/session-runner.js +18 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface InstalledCopy {
|
|
2
|
+
version: string;
|
|
3
|
+
bin: string;
|
|
4
|
+
}
|
|
5
|
+
interface McpEntry {
|
|
6
|
+
command: string;
|
|
7
|
+
args: string[] | null;
|
|
8
|
+
}
|
|
9
|
+
/** The package an `npx -y @addai/x[@latest]` entry runs. Null for any other
|
|
10
|
+
* entry, including one pinned to a version, which npx should keep resolving. */
|
|
11
|
+
export declare function npxPackage(entry: McpEntry): string | null;
|
|
12
|
+
/** True when a is a higher release than b. A prerelease counts as its release. */
|
|
13
|
+
export declare function isNewer(a: string, b: string): boolean;
|
|
14
|
+
/** The newest complete copy of a package in npx's cache. */
|
|
15
|
+
export declare function findInstalledCopy(pkg: string, roots?: string[]): InstalledCopy | null;
|
|
16
|
+
/** What the registry last said is latest, or null if it hasn't said yet. Asks
|
|
17
|
+
* again in the background once an hour, so it never holds a turn back. */
|
|
18
|
+
export declare function latestVersion(pkg: string): string | null;
|
|
19
|
+
/** The entries with our npx apps switched to their installed copies. The same
|
|
20
|
+
* array when there's nothing to switch, and the same object for every other entry. */
|
|
21
|
+
export declare function directMcps<T extends McpEntry>(mcps: T[], find?: (pkg: string) => InstalledCopy | null, latest?: (pkg: string) => string | null): T[];
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Starting our own apps without asking the npm registry first.
|
|
3
|
+
//
|
|
4
|
+
// An app registered as `npx -y @addai/x@latest` checks the registry before it
|
|
5
|
+
// starts, which makes it the slowest app on a turn: 1.7 s on PopadomTV, against
|
|
6
|
+
// 0.4-0.8 s for each remote app, and the agent waits for all of them. npx has
|
|
7
|
+
// already unpacked the package, so selector turns run that copy directly.
|
|
8
|
+
//
|
|
9
|
+
// `@latest` still means latest. The registry is asked in the background, and when
|
|
10
|
+
// it knows of a newer version than the copy, the app goes through npx for that
|
|
11
|
+
// turn, which updates the copy. Anything unexpected leaves the entry on npx, as it
|
|
12
|
+
// was. ADDAI_MCP_DIRECT=0 turns all of this off.
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.npxPackage = npxPackage;
|
|
48
|
+
exports.isNewer = isNewer;
|
|
49
|
+
exports.findInstalledCopy = findInstalledCopy;
|
|
50
|
+
exports.latestVersion = latestVersion;
|
|
51
|
+
exports.directMcps = directMcps;
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const os = __importStar(require("os"));
|
|
54
|
+
const path = __importStar(require("path"));
|
|
55
|
+
const OUR_PACKAGE = /^(@addai\/[a-z0-9._-]+)(?:@latest)?$/;
|
|
56
|
+
const LATEST_TTL_MS = 60 * 60 * 1000;
|
|
57
|
+
const LATEST_TIMEOUT_MS = 5000;
|
|
58
|
+
/** The package an `npx -y @addai/x[@latest]` entry runs. Null for any other
|
|
59
|
+
* entry, including one pinned to a version, which npx should keep resolving. */
|
|
60
|
+
function npxPackage(entry) {
|
|
61
|
+
const { command, args } = entry;
|
|
62
|
+
if (command !== 'npx' || !Array.isArray(args) || args.length !== 2 || args[0] !== '-y')
|
|
63
|
+
return null;
|
|
64
|
+
return OUR_PACKAGE.exec(args[1])?.[1] ?? null;
|
|
65
|
+
}
|
|
66
|
+
/** True when a is a higher release than b. A prerelease counts as its release. */
|
|
67
|
+
function isNewer(a, b) {
|
|
68
|
+
const parts = (v) => v.split('-')[0].split('.').map(n => parseInt(n, 10) || 0);
|
|
69
|
+
const [x, y] = [parts(a), parts(b)];
|
|
70
|
+
for (let i = 0; i < 3; i++) {
|
|
71
|
+
if ((x[i] ?? 0) !== (y[i] ?? 0))
|
|
72
|
+
return (x[i] ?? 0) > (y[i] ?? 0);
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
function npxRoots() {
|
|
77
|
+
const roots = [];
|
|
78
|
+
if (process.env.npm_config_cache)
|
|
79
|
+
roots.push(path.join(process.env.npm_config_cache, '_npx'));
|
|
80
|
+
if (process.platform === 'win32' && process.env.LOCALAPPDATA) {
|
|
81
|
+
roots.push(path.join(process.env.LOCALAPPDATA, 'npm-cache', '_npx'));
|
|
82
|
+
}
|
|
83
|
+
roots.push(path.join(os.homedir(), '.npm', '_npx'));
|
|
84
|
+
return roots;
|
|
85
|
+
}
|
|
86
|
+
function readCopy(modules, pkg) {
|
|
87
|
+
try {
|
|
88
|
+
const dir = path.join(modules, ...pkg.split('/'));
|
|
89
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8'));
|
|
90
|
+
const bins = typeof manifest.bin === 'string'
|
|
91
|
+
? { [pkg.split('/')[1]]: manifest.bin }
|
|
92
|
+
: manifest.bin ?? {};
|
|
93
|
+
const names = Object.keys(bins);
|
|
94
|
+
const bin = bins[pkg.split('/')[1]] ?? (names.length === 1 ? bins[names[0]] : undefined);
|
|
95
|
+
if (typeof bin !== 'string' || typeof manifest.version !== 'string')
|
|
96
|
+
return null;
|
|
97
|
+
const entry = path.resolve(dir, bin);
|
|
98
|
+
if (!fs.existsSync(entry))
|
|
99
|
+
return null;
|
|
100
|
+
// A half-finished install can hold the package without what it needs.
|
|
101
|
+
for (const dep of Object.keys(manifest.dependencies ?? {})) {
|
|
102
|
+
if (!fs.existsSync(path.join(modules, ...dep.split('/'), 'package.json')))
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
return { version: manifest.version, bin: entry };
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** The newest complete copy of a package in npx's cache. */
|
|
112
|
+
function findInstalledCopy(pkg, roots = npxRoots()) {
|
|
113
|
+
let best = null;
|
|
114
|
+
for (const root of roots) {
|
|
115
|
+
let dirs = [];
|
|
116
|
+
try {
|
|
117
|
+
dirs = fs.readdirSync(root);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
for (const dir of dirs) {
|
|
123
|
+
const copy = readCopy(path.join(root, dir, 'node_modules'), pkg);
|
|
124
|
+
if (copy && (!best || isNewer(copy.version, best.version)))
|
|
125
|
+
best = copy;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return best;
|
|
129
|
+
}
|
|
130
|
+
const latestKnown = new Map();
|
|
131
|
+
/** What the registry last said is latest, or null if it hasn't said yet. Asks
|
|
132
|
+
* again in the background once an hour, so it never holds a turn back. */
|
|
133
|
+
function latestVersion(pkg) {
|
|
134
|
+
const known = latestKnown.get(pkg);
|
|
135
|
+
if (known && Date.now() - known.at < LATEST_TTL_MS)
|
|
136
|
+
return known.version;
|
|
137
|
+
latestKnown.set(pkg, { version: known?.version ?? null, at: Date.now() });
|
|
138
|
+
void fetch(`https://registry.npmjs.org/${pkg.replace('/', '%2f')}/latest`, { signal: AbortSignal.timeout(LATEST_TIMEOUT_MS) })
|
|
139
|
+
.then(r => (r.ok ? r.json() : null))
|
|
140
|
+
.then(body => {
|
|
141
|
+
if (typeof body?.version === 'string')
|
|
142
|
+
latestKnown.set(pkg, { version: body.version, at: Date.now() });
|
|
143
|
+
})
|
|
144
|
+
.catch(() => { });
|
|
145
|
+
return known?.version ?? null;
|
|
146
|
+
}
|
|
147
|
+
/** The entries with our npx apps switched to their installed copies. The same
|
|
148
|
+
* array when there's nothing to switch, and the same object for every other entry. */
|
|
149
|
+
function directMcps(mcps, find = findInstalledCopy, latest = latestVersion) {
|
|
150
|
+
let changed = false;
|
|
151
|
+
const out = mcps.map(m => {
|
|
152
|
+
const pkg = npxPackage(m);
|
|
153
|
+
if (!pkg)
|
|
154
|
+
return m;
|
|
155
|
+
const copy = find(pkg);
|
|
156
|
+
const newest = latest(pkg);
|
|
157
|
+
if (!copy || (newest && isNewer(newest, copy.version)))
|
|
158
|
+
return m;
|
|
159
|
+
changed = true;
|
|
160
|
+
return { ...m, command: process.execPath, args: [copy.bin] };
|
|
161
|
+
});
|
|
162
|
+
return changed ? out : mcps;
|
|
163
|
+
}
|
package/dist/memory-pack.d.ts
CHANGED
|
@@ -11,11 +11,17 @@ export declare function fetchMemoryPack(baseUrl: string, serviceToken: string, a
|
|
|
11
11
|
prompt: string;
|
|
12
12
|
budgetTokens?: number;
|
|
13
13
|
memberProfileId?: string | null;
|
|
14
|
-
}, timeoutMs?: number): Promise<{
|
|
14
|
+
}, timeoutMs?: number, fn?: string): Promise<{
|
|
15
15
|
block: string;
|
|
16
16
|
degraded: boolean;
|
|
17
17
|
flagged: boolean;
|
|
18
18
|
}>;
|
|
19
|
+
export declare function fetchMemoryPackVia(copy: unknown, baseUrl: string, serviceToken: string, args: {
|
|
20
|
+
entityId: string;
|
|
21
|
+
prompt: string;
|
|
22
|
+
budgetTokens?: number;
|
|
23
|
+
memberProfileId?: string | null;
|
|
24
|
+
}): ReturnType<typeof fetchMemoryPack>;
|
|
19
25
|
export declare function resolvePackEntityId(req: {
|
|
20
26
|
entity_studio_entity_id?: string | null;
|
|
21
27
|
entity_id?: string | null;
|
package/dist/memory-pack.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.MEMORY_FALLBACK_MARKER = void 0;
|
|
|
4
4
|
exports.replaceMemoryBlock = replaceMemoryBlock;
|
|
5
5
|
exports.buildPackBody = buildPackBody;
|
|
6
6
|
exports.fetchMemoryPack = fetchMemoryPack;
|
|
7
|
+
exports.fetchMemoryPackVia = fetchMemoryPackVia;
|
|
7
8
|
exports.resolvePackEntityId = resolvePackEntityId;
|
|
8
9
|
exports.applyMemoryPack = applyMemoryPack;
|
|
9
10
|
// +Ai Memory (Task 7) — semantic memory pack fetcher.
|
|
@@ -68,9 +69,9 @@ function buildPackBody(args) {
|
|
|
68
69
|
async function fetchMemoryPack(baseUrl, serviceToken, args,
|
|
69
70
|
// edge fn steady-state ~600ms, cold start ~950ms; 3s bounds worst-case
|
|
70
71
|
// spawn latency
|
|
71
|
-
timeoutMs = 3000) {
|
|
72
|
+
timeoutMs = 3000, fn = 'entity-memory-pack') {
|
|
72
73
|
try {
|
|
73
|
-
const r = await fetch(`${baseUrl}/functions/v1
|
|
74
|
+
const r = await fetch(`${baseUrl}/functions/v1/${fn}`, {
|
|
74
75
|
method: 'POST',
|
|
75
76
|
headers: {
|
|
76
77
|
'content-type': 'application/json',
|
|
@@ -98,6 +99,17 @@ timeoutMs = 3000) {
|
|
|
98
99
|
return { block: exports.MEMORY_FALLBACK_MARKER, degraded: true, flagged: false };
|
|
99
100
|
}
|
|
100
101
|
}
|
|
102
|
+
// A selector setting can name a test copy of the pack, for proving a change to
|
|
103
|
+
// recall on one entity. If the copy fails, the real pack still answers.
|
|
104
|
+
const PACK_COPY = /^entity-memory-pack-[a-z0-9-]{1,40}$/;
|
|
105
|
+
async function fetchMemoryPackVia(copy, baseUrl, serviceToken, args) {
|
|
106
|
+
if (typeof copy === 'string' && PACK_COPY.test(copy)) {
|
|
107
|
+
const pack = await fetchMemoryPack(baseUrl, serviceToken, args, 3000, copy);
|
|
108
|
+
if (!pack.degraded)
|
|
109
|
+
return pack;
|
|
110
|
+
}
|
|
111
|
+
return fetchMemoryPack(baseUrl, serviceToken, args);
|
|
112
|
+
}
|
|
101
113
|
// +Ai Memory — runtime "entity_id alias" fix (final phase-3 review finding).
|
|
102
114
|
//
|
|
103
115
|
// runtime_pick_next_request (addai-entity-studio/supabase/migrations/
|
package/dist/memory-recall.js
CHANGED
|
@@ -53,29 +53,67 @@ const path = __importStar(require("path"));
|
|
|
53
53
|
/** Beside the session's other per-chat files. Holds hashes, no memory text. */
|
|
54
54
|
const SEEN_FILENAME = '.ainode.memory-seen.json';
|
|
55
55
|
const MAX_SEEN = 300;
|
|
56
|
-
/** The most one turn can add, so recall never becomes the bulk of a message.
|
|
57
|
-
|
|
56
|
+
/** The most one turn can add, so recall never becomes the bulk of a message. A
|
|
57
|
+
* single memory can run to several lines, so the characters are the real limit. */
|
|
58
|
+
const MAX_LINES = 16;
|
|
58
59
|
const MAX_CHARS = 2400;
|
|
59
60
|
// The pack sections that answer this message. The rest (working memory, recent,
|
|
60
61
|
// the person) don't change with the message, and the chat already carries them.
|
|
61
|
-
|
|
62
|
+
// The graph's links are bare keywords, nothing that can answer anything.
|
|
63
|
+
const RECALL_SECTIONS = new Set(['Corrections', 'Relevant memories']);
|
|
64
|
+
// Every heading a pack writes. A memory's own text can hold a markdown heading,
|
|
65
|
+
// which must not read as the end of the section.
|
|
66
|
+
const PACK_SECTIONS = new Set([
|
|
67
|
+
...RECALL_SECTIONS, 'Related (from your memory graph)', 'Memory index', 'Working memory', 'Recent', "Who you're talking to",
|
|
68
|
+
]);
|
|
69
|
+
// Search can also return the dream's own digests: its "Right now" notes and memory
|
|
70
|
+
// index, which have sections of their own, and a day's journal, whose lines all
|
|
71
|
+
// live on elsewhere. None of them is a memory matched to this message.
|
|
72
|
+
const DIGEST_HIT = /^- (?:Right now|Memory Index|\d{4}-\d{2}-\d{2}): /;
|
|
73
|
+
// The pack keeps this much of each hit, which is how to tell where a multi-line
|
|
74
|
+
// digest ends and the next hit starts.
|
|
75
|
+
const HIT_TEXT_LIMIT = 300;
|
|
62
76
|
/** The bullets of a memory pack worth showing for one message, in pack order. */
|
|
63
77
|
function recallLines(block) {
|
|
64
78
|
const lines = [];
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
79
|
+
const working = new Set();
|
|
80
|
+
let section = '';
|
|
81
|
+
let digestLeft = 0;
|
|
82
|
+
for (const raw of (block ?? '').split('\n')) {
|
|
83
|
+
const heading = /^#{2,3} (.+)$/.exec(raw.trim())?.[1].trim();
|
|
84
|
+
if (heading && PACK_SECTIONS.has(heading)) {
|
|
85
|
+
section = heading;
|
|
86
|
+
digestLeft = 0;
|
|
70
87
|
continue;
|
|
71
88
|
}
|
|
72
|
-
if (
|
|
73
|
-
|
|
89
|
+
if (section === 'Working memory') {
|
|
90
|
+
if (raw.startsWith('- '))
|
|
91
|
+
working.add(raw.trim());
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (!RECALL_SECTIONS.has(section))
|
|
95
|
+
continue;
|
|
96
|
+
if (digestLeft > 0) {
|
|
97
|
+
digestLeft -= raw.length + 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const digest = DIGEST_HIT.exec(raw);
|
|
101
|
+
if (digest) {
|
|
102
|
+
digestLeft = HIT_TEXT_LIMIT - (raw.length - digest[0].length) - 1;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (!raw.startsWith('- '))
|
|
106
|
+
continue;
|
|
107
|
+
const line = raw.trim().replace(/^- (?:- )+/, '- ');
|
|
108
|
+
if (!working.has(line))
|
|
109
|
+
lines.push(line);
|
|
74
110
|
}
|
|
75
111
|
return lines;
|
|
76
112
|
}
|
|
113
|
+
// The system prompt's pack and a message's pack render a memory with no heading
|
|
114
|
+
// differently, and it's still the one memory.
|
|
77
115
|
function hashLine(line) {
|
|
78
|
-
return (0, crypto_1.createHash)('sha1').update(line).digest('hex').slice(0, 16);
|
|
116
|
+
return (0, crypto_1.createHash)('sha1').update(line.replace(/^- memory: /, '- ')).digest('hex').slice(0, 16);
|
|
79
117
|
}
|
|
80
118
|
function readSeen(cwd) {
|
|
81
119
|
try {
|
package/dist/session-runner.js
CHANGED
|
@@ -78,6 +78,7 @@ const projects_2 = require("./projects");
|
|
|
78
78
|
const run_retry_1 = require("./run-retry");
|
|
79
79
|
const hang_watchdog_1 = require("./hang-watchdog");
|
|
80
80
|
const install_1 = require("./install");
|
|
81
|
+
const mcp_direct_1 = require("./mcp-direct");
|
|
81
82
|
const memory_capture_1 = require("./memory-capture");
|
|
82
83
|
const memory_pack_1 = require("./memory-pack");
|
|
83
84
|
const memory_recall_1 = require("./memory-recall");
|
|
@@ -2375,6 +2376,16 @@ function livingPresenceBlock() {
|
|
|
2375
2376
|
* question can still lean on memory, so it gets a moment, and no more: the pack
|
|
2376
2377
|
* usually lands around when the selector does, but can take seconds. */
|
|
2377
2378
|
const QUICK_RECALL_WAIT_MS = 500;
|
|
2379
|
+
/** Selector turns start our own apps from the copy npx already has. */
|
|
2380
|
+
function launchAppsDirectly(cwd, installed) {
|
|
2381
|
+
if (process.env.ADDAI_MCP_DIRECT === '0' || !installed.mcps?.length)
|
|
2382
|
+
return;
|
|
2383
|
+
const mcps = (0, mcp_direct_1.directMcps)(installed.mcps);
|
|
2384
|
+
if (mcps === installed.mcps)
|
|
2385
|
+
return;
|
|
2386
|
+
installed.mcps = mcps;
|
|
2387
|
+
installed.mcpConfigPath = (0, install_1.writeMcpConfig)(cwd, mcps) ?? installed.mcpConfigPath;
|
|
2388
|
+
}
|
|
2378
2389
|
/**
|
|
2379
2390
|
* Setup for a turn with the model selector on. It does what the block in
|
|
2380
2391
|
* runRequest does, without the wait: the Drive listing and memory pack run side
|
|
@@ -2385,6 +2396,12 @@ const QUICK_RECALL_WAIT_MS = 500;
|
|
|
2385
2396
|
async function prepareFastSetup(req, cwd, installed, pack, startedAt) {
|
|
2386
2397
|
const resumedClaude = req.agent !== 'codex' && !!req.resume_session_id;
|
|
2387
2398
|
const timing = { pack_ms: null };
|
|
2399
|
+
try {
|
|
2400
|
+
launchAppsDirectly(cwd, installed);
|
|
2401
|
+
}
|
|
2402
|
+
catch (err) {
|
|
2403
|
+
console.error(`[setup] direct app launch failed [reqId=${req.id}]: ${err.message}`);
|
|
2404
|
+
}
|
|
2388
2405
|
void pack.then(() => { timing.pack_ms = Date.now() - startedAt; });
|
|
2389
2406
|
// A listing from an earlier turn is good enough to point at. This turn's
|
|
2390
2407
|
// replaces it in the background, well before the agent's first look.
|
|
@@ -2514,7 +2531,7 @@ async function runRequest(req, entitybox) {
|
|
|
2514
2531
|
if (entityId && process.env.ADDAI_FAST_SETUP !== '0') {
|
|
2515
2532
|
const message = (0, model_selector_1.messageFromPrompt)(req.prompt ?? '');
|
|
2516
2533
|
earlyPack = setting.then(s => (s
|
|
2517
|
-
? (0, memory_pack_1.
|
|
2534
|
+
? (0, memory_pack_1.fetchMemoryPackVia)(s.config?.memory_pack, config_1.SUPABASE_URL, config_1.SUPABASE_ANON_KEY, { entityId, prompt: message, memberProfileId: req.member_profile_id ?? null })
|
|
2518
2535
|
: { block: '', degraded: false, flagged: false }));
|
|
2519
2536
|
}
|
|
2520
2537
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@addai/node",
|
|
3
|
-
"version": "0.30.16-msp.
|
|
3
|
+
"version": "0.30.16-msp.8",
|
|
4
4
|
"description": "Daemon that pairs a machine with your +Ai account and runs Claude / Codex / Kimi / Gemini agents on its behalf. Reachable via Supabase from Vault, Entity Studio, or any other +Ai surface.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"keywords": [
|