@memnexus-ai/mx-agent-cli 0.1.174 → 0.1.176
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/__tests__/config-command.test.js +20 -0
- package/dist/__tests__/config-command.test.js.map +1 -1
- package/dist/__tests__/coordination-brief.test.js +5 -1
- package/dist/__tests__/coordination-brief.test.js.map +1 -1
- package/dist/__tests__/coordination-command.test.js +2 -0
- package/dist/__tests__/coordination-command.test.js.map +1 -1
- package/dist/__tests__/coordination-history.test.js +5 -1
- package/dist/__tests__/coordination-history.test.js.map +1 -1
- package/dist/__tests__/coordination-memory.test.d.ts +14 -0
- package/dist/__tests__/coordination-memory.test.d.ts.map +1 -0
- package/dist/__tests__/coordination-memory.test.js +261 -0
- package/dist/__tests__/coordination-memory.test.js.map +1 -0
- package/dist/__tests__/coordination-provision.test.d.ts +12 -0
- package/dist/__tests__/coordination-provision.test.d.ts.map +1 -0
- package/dist/__tests__/coordination-provision.test.js +77 -0
- package/dist/__tests__/coordination-provision.test.js.map +1 -0
- package/dist/__tests__/coordination-token.test.d.ts +11 -0
- package/dist/__tests__/coordination-token.test.d.ts.map +1 -0
- package/dist/__tests__/coordination-token.test.js +166 -0
- package/dist/__tests__/coordination-token.test.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +12 -0
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/coordination.d.ts +37 -17
- package/dist/commands/coordination.d.ts.map +1 -1
- package/dist/commands/coordination.js +145 -16
- package/dist/commands/coordination.js.map +1 -1
- package/dist/lib/coordination-client.d.ts +21 -0
- package/dist/lib/coordination-client.d.ts.map +1 -1
- package/dist/lib/coordination-client.js +24 -0
- package/dist/lib/coordination-client.js.map +1 -1
- package/dist/lib/coordination-memory.d.ts +125 -0
- package/dist/lib/coordination-memory.d.ts.map +1 -0
- package/dist/lib/coordination-memory.js +318 -0
- package/dist/lib/coordination-memory.js.map +1 -0
- package/dist/lib/coordination-token.d.ts +75 -0
- package/dist/lib/coordination-token.d.ts.map +1 -0
- package/dist/lib/coordination-token.js +168 -0
- package/dist/lib/coordination-token.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* coordination-token -- self-provision the coordination service bearer token.
|
|
3
|
+
*
|
|
4
|
+
* Ports the security-reviewed KV-fetch logic from the agent-config hook
|
|
5
|
+
* `coordination-brief.sh` into the CLI so that a bare `mx-agent coordination
|
|
6
|
+
* brief` (and drain/escalate/history) resolves its own token when none is
|
|
7
|
+
* configured, instead of failing with "token not set" and falling back to the
|
|
8
|
+
* old channel. The isolation properties the security review required are
|
|
9
|
+
* preserved 1:1:
|
|
10
|
+
*
|
|
11
|
+
* - MF-2 The team slug is read from the authoritative worktree marker
|
|
12
|
+
* (.mx-coordination-team). It is NEVER derived from CLAUDE_TEAM_NAME
|
|
13
|
+
* or the worktree name.
|
|
14
|
+
* - SF-2 The slug is validated against the exact roster BEFORE any `az` call.
|
|
15
|
+
* A non-member fails CLOSED (no fetch) so the caller falls back.
|
|
16
|
+
* - MF-1 The token cache filename embeds the slug
|
|
17
|
+
* (.mx-coordination-token-<slug>), per worktree. A worktree recycled
|
|
18
|
+
* to a different team can never read another team's cached token.
|
|
19
|
+
* - SF-3 The cache is created born 0600 (mode on create — no readable window).
|
|
20
|
+
* - No shell: the roster-validated slug is passed to `az` via execFile with an
|
|
21
|
+
* args array, never interpolated into a shell string.
|
|
22
|
+
* - The token is NEVER written to the global ~/.mx-agent config (that clobbers
|
|
23
|
+
* across worktrees — the MF-2 defect) and is NEVER logged.
|
|
24
|
+
* - Fail-OPEN on infra errors (no marker, az not logged in, KV unreachable):
|
|
25
|
+
* report "unprovisioned" so the caller degrades, never crash.
|
|
26
|
+
* - Fail-CLOSED only on a roster mismatch.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* SF-2 canonical roster — mirror of coordination-brief.sh's COORD_ROSTER. The
|
|
30
|
+
* marker slug MUST be an exact member of this list before it is ever passed to
|
|
31
|
+
* `az`. Aliases (mx-agent / mx-agent-system) are intentionally excluded.
|
|
32
|
+
*/
|
|
33
|
+
export declare const COORD_ROSTER: readonly ["platform", "retrieval", "mcp", "pipeline", "marketing", "customer-portal", "eval", "product"];
|
|
34
|
+
export declare const KEYVAULT_NAME = "mx-dev-eastus2-kv-001";
|
|
35
|
+
export type TokenResolveStatus =
|
|
36
|
+
/** A token was already in env/config; KV is skipped (hook path + manual override). */
|
|
37
|
+
'already-configured'
|
|
38
|
+
/** A token was provisioned (from the per-worktree cache or a fresh KV fetch). */
|
|
39
|
+
| 'resolved'
|
|
40
|
+
/** Fail-CLOSED: the marker slug is not on the roster — no fetch performed. */
|
|
41
|
+
| 'not-on-roster'
|
|
42
|
+
/** Fail-OPEN: no marker, az not logged in, KV unreachable, or empty secret. */
|
|
43
|
+
| 'unprovisioned';
|
|
44
|
+
export interface TokenResolveResult {
|
|
45
|
+
status: TokenResolveStatus;
|
|
46
|
+
/** The resolved token — set only for 'already-configured' and 'resolved'. */
|
|
47
|
+
token?: string;
|
|
48
|
+
/** The marker slug, when one was read (roster or not). */
|
|
49
|
+
slug?: string;
|
|
50
|
+
/** Where the token came from — for diagnostics; never includes the token. */
|
|
51
|
+
source?: 'env' | 'config' | 'cache' | 'keyvault';
|
|
52
|
+
/** Non-secret reason for a fail-open, safe to print to stderr. */
|
|
53
|
+
detail?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface TokenResolveDeps {
|
|
56
|
+
/** Environment to read (default process.env). */
|
|
57
|
+
env?: NodeJS.ProcessEnv;
|
|
58
|
+
/**
|
|
59
|
+
* Fetch a Key Vault secret's value by validated name. Overridable in tests to
|
|
60
|
+
* mock `az`. Returns undefined on any failure (fail-open).
|
|
61
|
+
*/
|
|
62
|
+
fetchSecret?: (vault: string, secretName: string) => string | undefined;
|
|
63
|
+
/** Read a file's text, or undefined if missing/unreadable. Overridable in tests. */
|
|
64
|
+
readFileText?: (path: string) => string | undefined;
|
|
65
|
+
/** Persist the fetched token to the per-worktree cache (born 0600). */
|
|
66
|
+
writeCache?: (path: string, value: string) => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the coordination token, self-provisioning from Key Vault when none is
|
|
70
|
+
* configured. Never throws — every failure is a typed result the caller acts on.
|
|
71
|
+
* The returned token (when present) must be handed to the client in-memory
|
|
72
|
+
* (process env for the request); it must NOT be written to the global config.
|
|
73
|
+
*/
|
|
74
|
+
export declare function resolveCoordinationToken(deps?: TokenResolveDeps): TokenResolveResult;
|
|
75
|
+
//# sourceMappingURL=coordination-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination-token.d.ts","sourceRoot":"","sources":["../../src/lib/coordination-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH;;;;GAIG;AACH,eAAO,MAAM,YAAY,0GASf,CAAC;AAEX,eAAO,MAAM,aAAa,0BAA0B,CAAC;AAKrD,MAAM,MAAM,kBAAkB;AAC5B,sFAAsF;AACpF,oBAAoB;AACtB,iFAAiF;GAC/E,UAAU;AACZ,8EAA8E;GAC5E,eAAe;AACjB,+EAA+E;GAC7E,eAAe,CAAC;AAEpB,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;IACjD,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,oFAAoF;IACpF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACpD,uEAAuE;IACvE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpD;AAmDD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,GAAE,gBAAqB,GAAG,kBAAkB,CAmExF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* coordination-token -- self-provision the coordination service bearer token.
|
|
3
|
+
*
|
|
4
|
+
* Ports the security-reviewed KV-fetch logic from the agent-config hook
|
|
5
|
+
* `coordination-brief.sh` into the CLI so that a bare `mx-agent coordination
|
|
6
|
+
* brief` (and drain/escalate/history) resolves its own token when none is
|
|
7
|
+
* configured, instead of failing with "token not set" and falling back to the
|
|
8
|
+
* old channel. The isolation properties the security review required are
|
|
9
|
+
* preserved 1:1:
|
|
10
|
+
*
|
|
11
|
+
* - MF-2 The team slug is read from the authoritative worktree marker
|
|
12
|
+
* (.mx-coordination-team). It is NEVER derived from CLAUDE_TEAM_NAME
|
|
13
|
+
* or the worktree name.
|
|
14
|
+
* - SF-2 The slug is validated against the exact roster BEFORE any `az` call.
|
|
15
|
+
* A non-member fails CLOSED (no fetch) so the caller falls back.
|
|
16
|
+
* - MF-1 The token cache filename embeds the slug
|
|
17
|
+
* (.mx-coordination-token-<slug>), per worktree. A worktree recycled
|
|
18
|
+
* to a different team can never read another team's cached token.
|
|
19
|
+
* - SF-3 The cache is created born 0600 (mode on create — no readable window).
|
|
20
|
+
* - No shell: the roster-validated slug is passed to `az` via execFile with an
|
|
21
|
+
* args array, never interpolated into a shell string.
|
|
22
|
+
* - The token is NEVER written to the global ~/.mx-agent config (that clobbers
|
|
23
|
+
* across worktrees — the MF-2 defect) and is NEVER logged.
|
|
24
|
+
* - Fail-OPEN on infra errors (no marker, az not logged in, KV unreachable):
|
|
25
|
+
* report "unprovisioned" so the caller degrades, never crash.
|
|
26
|
+
* - Fail-CLOSED only on a roster mismatch.
|
|
27
|
+
*/
|
|
28
|
+
import { execFileSync } from 'node:child_process';
|
|
29
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
30
|
+
import { join } from 'node:path';
|
|
31
|
+
import { getConfigValue } from './config.js';
|
|
32
|
+
import { CONFIG_KEY_TOKEN } from './coordination-client.js';
|
|
33
|
+
/**
|
|
34
|
+
* SF-2 canonical roster — mirror of coordination-brief.sh's COORD_ROSTER. The
|
|
35
|
+
* marker slug MUST be an exact member of this list before it is ever passed to
|
|
36
|
+
* `az`. Aliases (mx-agent / mx-agent-system) are intentionally excluded.
|
|
37
|
+
*/
|
|
38
|
+
export const COORD_ROSTER = [
|
|
39
|
+
'platform',
|
|
40
|
+
'retrieval',
|
|
41
|
+
'mcp',
|
|
42
|
+
'pipeline',
|
|
43
|
+
'marketing',
|
|
44
|
+
'customer-portal',
|
|
45
|
+
'eval',
|
|
46
|
+
'product',
|
|
47
|
+
];
|
|
48
|
+
export const KEYVAULT_NAME = 'mx-dev-eastus2-kv-001';
|
|
49
|
+
const MARKER_FILE = '.mx-coordination-team';
|
|
50
|
+
const CACHE_PREFIX = '.mx-coordination-token-';
|
|
51
|
+
/** Default marker/cache reader: undefined on missing or unreadable file. */
|
|
52
|
+
function defaultReadFileText(path) {
|
|
53
|
+
try {
|
|
54
|
+
if (!existsSync(path))
|
|
55
|
+
return undefined;
|
|
56
|
+
return readFileSync(path, 'utf-8');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Default KV fetch. The slug embedded in `secretName` is roster-validated by the
|
|
64
|
+
* caller; it is passed to `az` as a single argv element via execFile (no shell),
|
|
65
|
+
* so a metacharacter in a slug could never inject a command even if the roster
|
|
66
|
+
* gate were bypassed. Any failure (az not logged in, KV unreachable, missing
|
|
67
|
+
* secret) returns undefined → fail-open.
|
|
68
|
+
*/
|
|
69
|
+
function defaultFetchSecret(vault, secretName) {
|
|
70
|
+
try {
|
|
71
|
+
const out = execFileSync('az', ['keyvault', 'secret', 'show', '--vault-name', vault, '--name', secretName, '--query', 'value', '-o', 'tsv'], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
72
|
+
const trimmed = out.trim();
|
|
73
|
+
return trimmed || undefined;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** SF-3 born-0600 cache write. A write failure is tolerated (fail-open). */
|
|
80
|
+
function defaultWriteCache(path, value) {
|
|
81
|
+
try {
|
|
82
|
+
// mode 0600 on create — 0600 has no group/other bits, so no umask can widen
|
|
83
|
+
// it. The cache is only written when absent (see resolveCoordinationToken),
|
|
84
|
+
// so this is always a create.
|
|
85
|
+
writeFileSync(path, value, { mode: 0o600 });
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
/* A cache-write failure must not break provisioning — the token is still returned. */
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Extract the first line and strip all whitespace (marker/cache are single-value). */
|
|
92
|
+
function firstLineNoSpace(raw) {
|
|
93
|
+
const firstLine = raw.split(/\r?\n/, 1)[0] ?? '';
|
|
94
|
+
return firstLine.replace(/\s+/g, '');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolve the coordination token, self-provisioning from Key Vault when none is
|
|
98
|
+
* configured. Never throws — every failure is a typed result the caller acts on.
|
|
99
|
+
* The returned token (when present) must be handed to the client in-memory
|
|
100
|
+
* (process env for the request); it must NOT be written to the global config.
|
|
101
|
+
*/
|
|
102
|
+
export function resolveCoordinationToken(deps = {}) {
|
|
103
|
+
const env = deps.env ?? process.env;
|
|
104
|
+
const readFileText = deps.readFileText ?? defaultReadFileText;
|
|
105
|
+
// 1. Already configured → use it, skip KV. Env preferred, then global config.
|
|
106
|
+
// This keeps the hook path (which injects MX_COORD_SERVICE_TOKEN) and any
|
|
107
|
+
// manual `mx-agent config set coordination-service-token` working unchanged.
|
|
108
|
+
const envToken = env.MX_COORD_SERVICE_TOKEN;
|
|
109
|
+
if (envToken)
|
|
110
|
+
return { status: 'already-configured', token: envToken, source: 'env' };
|
|
111
|
+
// Belt-and-suspenders for the SF-A never-crash contract: getConfigValue →
|
|
112
|
+
// loadConfig → getConfigDir calls mkdirSync, which throws on an unwritable/
|
|
113
|
+
// read-only HOME (EACCES/EROFS/ENOSPC). Swallow it and treat the config token
|
|
114
|
+
// as absent so resolution continues to the marker/KV path instead of throwing.
|
|
115
|
+
let configToken;
|
|
116
|
+
try {
|
|
117
|
+
configToken = getConfigValue(CONFIG_KEY_TOKEN);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
configToken = undefined;
|
|
121
|
+
}
|
|
122
|
+
if (configToken)
|
|
123
|
+
return { status: 'already-configured', token: configToken, source: 'config' };
|
|
124
|
+
// 2. MF-2: read the authoritative marker. No worktree path or no marker →
|
|
125
|
+
// fail-OPEN. We do NOT derive the slug from any other signal.
|
|
126
|
+
const worktree = env.CLAUDE_WORKTREE_PATH;
|
|
127
|
+
if (!worktree) {
|
|
128
|
+
return { status: 'unprovisioned', detail: 'CLAUDE_WORKTREE_PATH is unset — cannot locate the coordination marker' };
|
|
129
|
+
}
|
|
130
|
+
const markerRaw = readFileText(join(worktree, MARKER_FILE));
|
|
131
|
+
if (markerRaw === undefined) {
|
|
132
|
+
return { status: 'unprovisioned', detail: 'no coordination marker (.mx-coordination-team) in this worktree' };
|
|
133
|
+
}
|
|
134
|
+
const slug = firstLineNoSpace(markerRaw);
|
|
135
|
+
if (!slug) {
|
|
136
|
+
return { status: 'unprovisioned', detail: 'coordination marker is empty' };
|
|
137
|
+
}
|
|
138
|
+
// 3. SF-2: roster-membership gate BEFORE any az call. Not a member → fail-CLOSED.
|
|
139
|
+
if (!COORD_ROSTER.includes(slug)) {
|
|
140
|
+
return { status: 'not-on-roster', slug };
|
|
141
|
+
}
|
|
142
|
+
// 4. MF-1: slug-bound per-worktree cache. The slug is in the filename, so a
|
|
143
|
+
// worktree recycled to another team (marker rewritten) can never read the
|
|
144
|
+
// prior team's token — its cache path simply does not exist yet.
|
|
145
|
+
const cachePath = join(worktree, `${CACHE_PREFIX}${slug}`);
|
|
146
|
+
const cachedRaw = readFileText(cachePath);
|
|
147
|
+
if (cachedRaw) {
|
|
148
|
+
const cached = firstLineNoSpace(cachedRaw);
|
|
149
|
+
if (cached)
|
|
150
|
+
return { status: 'resolved', token: cached, slug, source: 'cache' };
|
|
151
|
+
}
|
|
152
|
+
// 5. Fetch from Key Vault once. The roster-validated slug is the only variable
|
|
153
|
+
// part of the secret name, passed via execFile args (no shell).
|
|
154
|
+
const fetchSecret = deps.fetchSecret ?? defaultFetchSecret;
|
|
155
|
+
const fetched = fetchSecret(KEYVAULT_NAME, `coordination-token-${slug}`);
|
|
156
|
+
if (!fetched) {
|
|
157
|
+
return {
|
|
158
|
+
status: 'unprovisioned',
|
|
159
|
+
slug,
|
|
160
|
+
detail: 'Key Vault returned no token (az not logged in, KV unreachable, or secret missing)',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// SF-3: cache born 0600. NEVER persisted to the global config.
|
|
164
|
+
const writeCache = deps.writeCache ?? defaultWriteCache;
|
|
165
|
+
writeCache(cachePath, fetched);
|
|
166
|
+
return { status: 'resolved', token: fetched, slug, source: 'keyvault' };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=coordination-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination-token.js","sourceRoot":"","sources":["../../src/lib/coordination-token.ts"],"names":[],"mappings":"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"}
|