@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.
Files changed (40) hide show
  1. package/dist/__tests__/config-command.test.js +20 -0
  2. package/dist/__tests__/config-command.test.js.map +1 -1
  3. package/dist/__tests__/coordination-brief.test.js +5 -1
  4. package/dist/__tests__/coordination-brief.test.js.map +1 -1
  5. package/dist/__tests__/coordination-command.test.js +2 -0
  6. package/dist/__tests__/coordination-command.test.js.map +1 -1
  7. package/dist/__tests__/coordination-history.test.js +5 -1
  8. package/dist/__tests__/coordination-history.test.js.map +1 -1
  9. package/dist/__tests__/coordination-memory.test.d.ts +14 -0
  10. package/dist/__tests__/coordination-memory.test.d.ts.map +1 -0
  11. package/dist/__tests__/coordination-memory.test.js +261 -0
  12. package/dist/__tests__/coordination-memory.test.js.map +1 -0
  13. package/dist/__tests__/coordination-provision.test.d.ts +12 -0
  14. package/dist/__tests__/coordination-provision.test.d.ts.map +1 -0
  15. package/dist/__tests__/coordination-provision.test.js +77 -0
  16. package/dist/__tests__/coordination-provision.test.js.map +1 -0
  17. package/dist/__tests__/coordination-token.test.d.ts +11 -0
  18. package/dist/__tests__/coordination-token.test.d.ts.map +1 -0
  19. package/dist/__tests__/coordination-token.test.js +166 -0
  20. package/dist/__tests__/coordination-token.test.js.map +1 -0
  21. package/dist/commands/config.d.ts.map +1 -1
  22. package/dist/commands/config.js +12 -0
  23. package/dist/commands/config.js.map +1 -1
  24. package/dist/commands/coordination.d.ts +37 -17
  25. package/dist/commands/coordination.d.ts.map +1 -1
  26. package/dist/commands/coordination.js +145 -16
  27. package/dist/commands/coordination.js.map +1 -1
  28. package/dist/lib/coordination-client.d.ts +21 -0
  29. package/dist/lib/coordination-client.d.ts.map +1 -1
  30. package/dist/lib/coordination-client.js +24 -0
  31. package/dist/lib/coordination-client.js.map +1 -1
  32. package/dist/lib/coordination-memory.d.ts +125 -0
  33. package/dist/lib/coordination-memory.d.ts.map +1 -0
  34. package/dist/lib/coordination-memory.js +318 -0
  35. package/dist/lib/coordination-memory.js.map +1 -0
  36. package/dist/lib/coordination-token.d.ts +75 -0
  37. package/dist/lib/coordination-token.d.ts.map +1 -0
  38. package/dist/lib/coordination-token.js +168 -0
  39. package/dist/lib/coordination-token.js.map +1 -0
  40. 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memnexus-ai/mx-agent-cli",
3
- "version": "0.1.174",
3
+ "version": "0.1.176",
4
4
  "description": "CLI for creating and managing AI agent teams",
5
5
  "type": "module",
6
6
  "bin": {