@miakapp/cli 4.0.0-alpha.0 → 4.0.0-alpha.10

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 (63) hide show
  1. package/README.md +151 -35
  2. package/assets/agent-guide.md +232 -79
  3. package/assets/design/OFL-Manrope.txt +93 -0
  4. package/assets/design/components.css +139 -0
  5. package/assets/design/fonts.css +9 -0
  6. package/assets/design/gallery.html +667 -0
  7. package/assets/design/guide.md +77 -0
  8. package/assets/design/tokens.css +185 -0
  9. package/assets/starter/app/app/README.md +74 -0
  10. package/assets/starter/app/app/main.ts +124 -0
  11. package/assets/starter/app/app/miakapp.ts +156 -0
  12. package/assets/starter/app/app/theme.ts +8 -0
  13. package/assets/starter/app/tsconfig.json +23 -0
  14. package/bin/miakapp.js +5 -1
  15. package/dist/agent-pack.d.ts +11 -3
  16. package/dist/agent-pack.d.ts.map +1 -1
  17. package/dist/agent-pack.js +26 -10
  18. package/dist/agent-pack.js.map +1 -1
  19. package/dist/contexts.d.ts +59 -0
  20. package/dist/contexts.d.ts.map +1 -0
  21. package/dist/contexts.js +388 -0
  22. package/dist/contexts.js.map +1 -0
  23. package/dist/control-plane.d.ts +14 -0
  24. package/dist/control-plane.d.ts.map +1 -1
  25. package/dist/control-plane.js +33 -1
  26. package/dist/control-plane.js.map +1 -1
  27. package/dist/internal/names.d.ts +5 -0
  28. package/dist/internal/names.d.ts.map +1 -1
  29. package/dist/internal/names.js +6 -0
  30. package/dist/internal/names.js.map +1 -1
  31. package/dist/main.d.ts +22 -5
  32. package/dist/main.d.ts.map +1 -1
  33. package/dist/main.js +673 -60
  34. package/dist/main.js.map +1 -1
  35. package/dist/mcp.d.ts +7 -1
  36. package/dist/mcp.d.ts.map +1 -1
  37. package/dist/mcp.js +195 -26
  38. package/dist/mcp.js.map +1 -1
  39. package/dist/pairing.d.ts +27 -0
  40. package/dist/pairing.d.ts.map +1 -0
  41. package/dist/pairing.js +148 -0
  42. package/dist/pairing.js.map +1 -0
  43. package/dist/project.d.ts +3 -1
  44. package/dist/project.d.ts.map +1 -1
  45. package/dist/project.js +33 -6
  46. package/dist/project.js.map +1 -1
  47. package/dist/publication.d.ts +20 -5
  48. package/dist/publication.d.ts.map +1 -1
  49. package/dist/publication.js +58 -16
  50. package/dist/publication.js.map +1 -1
  51. package/dist/starter.d.ts +17 -0
  52. package/dist/starter.d.ts.map +1 -0
  53. package/dist/starter.js +72 -0
  54. package/dist/starter.js.map +1 -0
  55. package/dist/terminal.d.ts +10 -0
  56. package/dist/terminal.d.ts.map +1 -0
  57. package/dist/terminal.js +70 -0
  58. package/dist/terminal.js.map +1 -0
  59. package/dist/version.d.ts +15 -0
  60. package/dist/version.d.ts.map +1 -0
  61. package/dist/version.js +15 -0
  62. package/dist/version.js.map +1 -0
  63. package/package.json +6 -4
@@ -0,0 +1,388 @@
1
+ /**
2
+ * Persistent, multi-home CLI contexts in `~/.miakapp`.
3
+ *
4
+ * A context names one Home Key for one home at one issuer, so an agent or a
5
+ * machine that works on several homes never re-exports a secret and never
6
+ * guesses which secret belongs to which house. Two files, split by sensitivity:
7
+ *
8
+ * - `config.json` holds what is safe to show: the context names, their issuer,
9
+ * home ID, key ID, key label and the current context. Printing it leaks
10
+ * nothing.
11
+ * - `credentials.json` holds the Home Keys and nothing else.
12
+ *
13
+ * Both are written mode 0600 inside a 0700 directory, through a temporary file,
14
+ * an fsync and a rename, so a crash leaves either the old file or the new one
15
+ * and never half of each. A lock file serializes writers: two `miakapp pair`
16
+ * runs finishing at the same moment must both keep their context, because the
17
+ * code each one redeemed cannot be redeemed again.
18
+ *
19
+ * Reads refuse a credentials file that another account could read or replace,
20
+ * the way `ssh` refuses a private key with loose permissions: silently using a
21
+ * leaked key is worse than stopping.
22
+ */
23
+ import { randomBytes } from 'node:crypto';
24
+ import { isAbsolute, join } from 'node:path';
25
+ import { authorizationError, usageError } from './errors.js';
26
+ import { canonicalHttpsUrl } from './internal/http.js';
27
+ import { InvalidJsonError, boundedString, exactRecord, parseJson } from './internal/json.js';
28
+ import { isHomeId, isRandomId } from './internal/names.js';
29
+ export const CONFIG_DIRECTORY_VARIABLE = 'MIAKAPP_CONFIG_DIR';
30
+ export const CONFIG_FILE = 'config.json';
31
+ export const CREDENTIALS_FILE = 'credentials.json';
32
+ export const CONFIG_SCHEMA = 'miakapp.cli-config/1';
33
+ export const CREDENTIALS_SCHEMA = 'miakapp.cli-credentials/1';
34
+ const LOCK_FILE = 'lock';
35
+ const LOCK_WAIT_MS = 5_000;
36
+ const LOCK_STALE_MS = 30_000;
37
+ const MAXIMUM_FILE_BYTES = 262_144;
38
+ const MAXIMUM_CONTEXTS = 256;
39
+ const CONTEXT_NAME = /^[a-z0-9][a-z0-9._-]{0,62}$/;
40
+ const HOME_KEY = /^mhk1_([A-Za-z0-9_-]{22})_([A-Za-z0-9_-]{43})$/;
41
+ export function isContextName(value) {
42
+ return typeof value === 'string' && CONTEXT_NAME.test(value);
43
+ }
44
+ export function contextNameError(name) {
45
+ throw usageError(`Invalid context name ${JSON.stringify(name)}`, 'A context name is 1..63 characters of a-z, 0-9, ".", "_" and "-", starting with a letter or digit.');
46
+ }
47
+ /**
48
+ * The directory holding both files. `MIAKAPP_CONFIG_DIR` relocates it for CI,
49
+ * containers and tests; it must be absolute so a relative value can never
50
+ * resolve to a different directory from one working directory to the next.
51
+ */
52
+ export function configDirectory(env, home) {
53
+ const override = env(CONFIG_DIRECTORY_VARIABLE);
54
+ if (override !== undefined && override !== '') {
55
+ if (!isAbsolute(override)) {
56
+ throw usageError(`${CONFIG_DIRECTORY_VARIABLE} must be an absolute path`);
57
+ }
58
+ return override;
59
+ }
60
+ return join(home, '.miakapp');
61
+ }
62
+ function enforcesModes() {
63
+ return process.platform !== 'win32';
64
+ }
65
+ function errorCode(error) {
66
+ return typeof error === 'object' && error !== null && 'code' in error
67
+ ? String(error.code)
68
+ : undefined;
69
+ }
70
+ function storeError(path, problem) {
71
+ throw authorizationError(`${path} ${problem}`, 'Repair or remove the file, then pair again with miakapp pair. The CLI never guesses at a '
72
+ + 'credential store it cannot read exactly.');
73
+ }
74
+ async function readStoreFile(path, secret) {
75
+ const fs = await import('node:fs/promises');
76
+ let status;
77
+ try {
78
+ status = await fs.lstat(path);
79
+ }
80
+ catch (error) {
81
+ if (errorCode(error) === 'ENOENT')
82
+ return undefined;
83
+ throw error;
84
+ }
85
+ if (!status.isFile())
86
+ storeError(path, 'is not a regular file (symbolic links are refused)');
87
+ if (status.size > MAXIMUM_FILE_BYTES)
88
+ storeError(path, 'is larger than any context store');
89
+ if (enforcesModes()) {
90
+ const uid = process.getuid?.();
91
+ if (uid !== undefined && status.uid !== uid)
92
+ storeError(path, 'is owned by another account');
93
+ // The credentials must be private. The configuration holds no secret, but
94
+ // anyone able to rewrite it could repoint a context at their own issuer.
95
+ const forbidden = secret ? 0o077 : 0o022;
96
+ if ((status.mode & forbidden) !== 0) {
97
+ throw authorizationError(`${path} is accessible to other accounts (mode ${(status.mode & 0o777).toString(8)})`, `Run chmod 600 ${path}. Rotate the Home Keys it holds if anyone else could have read it.`);
98
+ }
99
+ }
100
+ return new Uint8Array(await fs.readFile(path));
101
+ }
102
+ function decodeDocument(path, bytes) {
103
+ try {
104
+ const value = parseJson(bytes);
105
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
106
+ return storeError(path, 'is not a JSON object');
107
+ }
108
+ return value;
109
+ }
110
+ catch (error) {
111
+ if (error instanceof InvalidJsonError)
112
+ return storeError(path, 'is not valid JSON');
113
+ throw error;
114
+ }
115
+ }
116
+ function decodeContext(path, name, value) {
117
+ try {
118
+ const entry = exactRecord(value, ['issuer', 'home_id', 'key_id', 'label', 'created_at']);
119
+ const issuer = canonicalHttpsUrl(entry.issuer, 'issuer');
120
+ if (issuer.endsWith('/') || !isHomeId(entry.home_id) || !isRandomId(entry.key_id)) {
121
+ throw new InvalidJsonError();
122
+ }
123
+ return Object.freeze({
124
+ name,
125
+ issuer,
126
+ homeId: entry.home_id,
127
+ keyId: entry.key_id,
128
+ label: boundedString(entry.label, 1, 64),
129
+ createdAt: boundedString(entry.created_at, 1, 64),
130
+ });
131
+ }
132
+ catch {
133
+ return storeError(path, `holds an invalid context ${JSON.stringify(name)}`);
134
+ }
135
+ }
136
+ async function readSnapshot(directory) {
137
+ const configPath = join(directory, CONFIG_FILE);
138
+ const credentialsPath = join(directory, CREDENTIALS_FILE);
139
+ const contexts = new Map();
140
+ const keys = new Map();
141
+ let current = null;
142
+ const configBytes = await readStoreFile(configPath, false);
143
+ if (configBytes !== undefined) {
144
+ const document = decodeDocument(configPath, configBytes);
145
+ if (document.schema !== CONFIG_SCHEMA)
146
+ storeError(configPath, `does not declare ${CONFIG_SCHEMA}`);
147
+ let entries;
148
+ try {
149
+ exactRecord(document, ['schema', 'current_context', 'contexts']);
150
+ entries = exactRecord(document.contexts, [], Object.keys(document.contexts ?? {}));
151
+ }
152
+ catch {
153
+ return storeError(configPath, 'does not match the closed configuration schema');
154
+ }
155
+ const names = Object.keys(entries);
156
+ if (names.length > MAXIMUM_CONTEXTS)
157
+ storeError(configPath, 'holds too many contexts');
158
+ for (const name of names) {
159
+ if (!isContextName(name))
160
+ storeError(configPath, `holds an invalid context name ${JSON.stringify(name)}`);
161
+ contexts.set(name, decodeContext(configPath, name, entries[name]));
162
+ }
163
+ const selected = document.current_context;
164
+ if (selected !== null && (typeof selected !== 'string' || !contexts.has(selected))) {
165
+ storeError(configPath, 'names a current context it does not define');
166
+ }
167
+ current = selected;
168
+ }
169
+ const credentialBytes = await readStoreFile(credentialsPath, true);
170
+ if (credentialBytes !== undefined) {
171
+ const document = decodeDocument(credentialsPath, credentialBytes);
172
+ if (document.schema !== CREDENTIALS_SCHEMA) {
173
+ storeError(credentialsPath, `does not declare ${CREDENTIALS_SCHEMA}`);
174
+ }
175
+ let entries;
176
+ try {
177
+ exactRecord(document, ['schema', 'credentials']);
178
+ entries = exactRecord(document.credentials, [], Object.keys(document.credentials ?? {}));
179
+ }
180
+ catch {
181
+ return storeError(credentialsPath, 'does not match the closed credentials schema');
182
+ }
183
+ for (const [name, value] of Object.entries(entries)) {
184
+ let key;
185
+ try {
186
+ key = exactRecord(value, ['home_key']).home_key;
187
+ }
188
+ catch {
189
+ key = undefined;
190
+ }
191
+ if (typeof key !== 'string' || !HOME_KEY.test(key)) {
192
+ storeError(credentialsPath, `holds an invalid credential for ${JSON.stringify(name)}`);
193
+ }
194
+ keys.set(name, key);
195
+ }
196
+ }
197
+ return { current, contexts, keys };
198
+ }
199
+ function credentialStatus(snapshot, context) {
200
+ const key = snapshot.keys.get(context.name);
201
+ if (key === undefined)
202
+ return 'missing';
203
+ return HOME_KEY.exec(key)?.[1] === context.keyId ? 'stored' : 'mismatched';
204
+ }
205
+ /**
206
+ * Reads the safe half of the store, plus whether each key is present. A
207
+ * missing directory is an empty store. No Home Key leaves this function.
208
+ */
209
+ export async function readContexts(directory) {
210
+ const snapshot = await readSnapshot(directory);
211
+ const credentials = new Map();
212
+ for (const context of snapshot.contexts.values()) {
213
+ credentials.set(context.name, credentialStatus(snapshot, context));
214
+ }
215
+ return { current: snapshot.current, contexts: snapshot.contexts, credentials };
216
+ }
217
+ /**
218
+ * Returns one context and its Home Key, or fails with a remedy.
219
+ *
220
+ * The key ID recorded at pairing time is compared with the stored key, so a
221
+ * credentials file edited by hand cannot silently attach another home's key to
222
+ * this context.
223
+ */
224
+ export async function readCredential(directory, name) {
225
+ const snapshot = await readSnapshot(directory);
226
+ const context = snapshot.contexts.get(name);
227
+ if (context === undefined) {
228
+ const known = [...snapshot.contexts.keys()];
229
+ throw usageError(`No context named ${name}`, known.length === 0
230
+ ? 'No context is configured yet. Run miakapp pair to add one.'
231
+ : `Known contexts: ${known.join(', ')}. Run miakapp context list for details.`);
232
+ }
233
+ const homeKey = snapshot.keys.get(name);
234
+ const status = credentialStatus(snapshot, context);
235
+ if (homeKey === undefined || status === 'missing') {
236
+ throw authorizationError(`Context ${name} has no stored credential`, `Remove it with miakapp context remove ${name} and pair the home again.`);
237
+ }
238
+ if (status === 'mismatched') {
239
+ throw authorizationError(`The credential stored for ${name} is not the key ${context.keyId} it was paired with`, `Remove the context with miakapp context remove ${name} and pair the home again.`);
240
+ }
241
+ return { context, homeKey };
242
+ }
243
+ async function syncDirectory(directory) {
244
+ const fs = await import('node:fs/promises');
245
+ let handle;
246
+ try {
247
+ handle = await fs.open(directory, 'r');
248
+ await handle.sync();
249
+ }
250
+ catch {
251
+ // Not every platform can fsync a directory; the rename is still atomic.
252
+ }
253
+ finally {
254
+ await handle?.close();
255
+ }
256
+ }
257
+ /**
258
+ * Replaces one file atomically with a private one. The temporary name is
259
+ * random and opened exclusively, so a stale temporary from a crashed run can
260
+ * neither be reused nor followed.
261
+ */
262
+ async function writeAtomic(directory, name, document) {
263
+ const fs = await import('node:fs/promises');
264
+ const target = join(directory, name);
265
+ const temporary = join(directory, `.${name}.${randomBytes(8).toString('hex')}.tmp`);
266
+ const handle = await fs.open(temporary, 'wx', 0o600);
267
+ try {
268
+ await handle.writeFile(`${JSON.stringify(document, null, 2)}\n`);
269
+ if (enforcesModes())
270
+ await handle.chmod(0o600);
271
+ await handle.sync();
272
+ }
273
+ catch (error) {
274
+ await handle.close();
275
+ await fs.rm(temporary, { force: true });
276
+ throw error;
277
+ }
278
+ await handle.close();
279
+ try {
280
+ await fs.rename(temporary, target);
281
+ }
282
+ catch (error) {
283
+ await fs.rm(temporary, { force: true });
284
+ throw error;
285
+ }
286
+ await syncDirectory(directory);
287
+ }
288
+ async function ensureDirectory(directory) {
289
+ const fs = await import('node:fs/promises');
290
+ await fs.mkdir(directory, { recursive: true, mode: 0o700 });
291
+ const status = await fs.lstat(directory);
292
+ if (!status.isDirectory()) {
293
+ throw authorizationError(`${directory} is not a directory (symbolic links are refused)`, `Move it aside, or point ${CONFIG_DIRECTORY_VARIABLE} at the real directory.`);
294
+ }
295
+ if (enforcesModes()) {
296
+ const uid = process.getuid?.();
297
+ if (uid !== undefined && status.uid !== uid) {
298
+ throw authorizationError(`${directory} is owned by another account`, 'Use a directory you own.');
299
+ }
300
+ if ((status.mode & 0o077) !== 0)
301
+ await fs.chmod(directory, 0o700);
302
+ }
303
+ }
304
+ async function acquireLock(directory) {
305
+ const fs = await import('node:fs/promises');
306
+ const path = join(directory, LOCK_FILE);
307
+ const deadline = Date.now() + LOCK_WAIT_MS;
308
+ while (true) {
309
+ try {
310
+ const handle = await fs.open(path, 'wx', 0o600);
311
+ await handle.writeFile(`${process.pid}\n`);
312
+ await handle.close();
313
+ return async () => {
314
+ await fs.rm(path, { force: true });
315
+ };
316
+ }
317
+ catch (error) {
318
+ if (errorCode(error) !== 'EEXIST')
319
+ throw error;
320
+ }
321
+ try {
322
+ const status = await fs.stat(path);
323
+ if (Date.now() - status.mtimeMs > LOCK_STALE_MS) {
324
+ await fs.rm(path, { force: true });
325
+ continue;
326
+ }
327
+ }
328
+ catch (error) {
329
+ if (errorCode(error) === 'ENOENT')
330
+ continue;
331
+ throw error;
332
+ }
333
+ if (Date.now() > deadline) {
334
+ throw authorizationError(`Another miakapp process holds ${path}`, 'Wait for it to finish. If none is running, delete the lock file.');
335
+ }
336
+ await new Promise((resolve) => setTimeout(resolve, 25));
337
+ }
338
+ }
339
+ /**
340
+ * Applies one change under the lock and writes both files.
341
+ *
342
+ * The credentials are written before the configuration, so a crash between the
343
+ * two leaves an unreferenced key rather than a context with no key. The next
344
+ * write drops any credential no context references.
345
+ */
346
+ export async function mutateContexts(directory, change) {
347
+ await ensureDirectory(directory);
348
+ const release = await acquireLock(directory);
349
+ try {
350
+ const snapshot = await readSnapshot(directory);
351
+ const state = {
352
+ current: snapshot.current,
353
+ contexts: new Map(snapshot.contexts),
354
+ keys: new Map(snapshot.keys),
355
+ };
356
+ const result = change(state);
357
+ if (state.contexts.size > MAXIMUM_CONTEXTS) {
358
+ throw usageError(`At most ${MAXIMUM_CONTEXTS} contexts can be stored`);
359
+ }
360
+ if (state.current !== null && !state.contexts.has(state.current))
361
+ state.current = null;
362
+ const credentials = {};
363
+ const contexts = {};
364
+ for (const [name, context] of [...state.contexts].sort(([a], [b]) => (a < b ? -1 : 1))) {
365
+ const key = state.keys.get(name);
366
+ if (key !== undefined)
367
+ credentials[name] = { home_key: key };
368
+ contexts[name] = {
369
+ issuer: context.issuer,
370
+ home_id: context.homeId,
371
+ key_id: context.keyId,
372
+ label: context.label,
373
+ created_at: context.createdAt,
374
+ };
375
+ }
376
+ await writeAtomic(directory, CREDENTIALS_FILE, { schema: CREDENTIALS_SCHEMA, credentials });
377
+ await writeAtomic(directory, CONFIG_FILE, {
378
+ schema: CONFIG_SCHEMA,
379
+ current_context: state.current,
380
+ contexts,
381
+ });
382
+ return result;
383
+ }
384
+ finally {
385
+ await release();
386
+ }
387
+ }
388
+ //# sourceMappingURL=contexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.js","sourceRoot":"","sources":["../src/contexts.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,21 @@ export interface Discovery {
6
6
  readonly userRelayExchangeEndpoint: string;
7
7
  readonly pushAudience: string;
8
8
  readonly componentsAudience: string;
9
+ /**
10
+ * `https://<trusted web origin>/app?home={home_id}` when the deployment
11
+ * declares where residents open homes. The only source of a `home_url`; the
12
+ * artifact `url` is never a resident link.
13
+ */
14
+ readonly homeUrlTemplate?: string;
9
15
  }
16
+ /**
17
+ * Accepts exactly `<canonical https origin>/app?home={home_id}`: no path, no
18
+ * credentials, no port games, nothing a server could use to point residents
19
+ * somewhere else under a plausible-looking link.
20
+ */
21
+ export declare function parseHomeUrlTemplate(value: unknown): string;
22
+ /** The trusted resident link for a home, or null when discovery names none. */
23
+ export declare function homeUrl(discovery: Pick<Discovery, 'homeUrlTemplate'>, homeId: string): string | null;
10
24
  export interface PublisherToken {
11
25
  readonly accessToken: string;
12
26
  readonly expiresAtMs: number;
@@ -1 +1 @@
1
- {"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../src/control-plane.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAY5B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAwCrF;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAO,GAC3C,OAAO,CAAC,cAAc,CAAC,CA4DzB"}
1
+ {"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../src/control-plane.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,oBAAoB,CAAC;AAY5B,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU3D;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIpG;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAiDrF;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAO,GAC3C,OAAO,CAAC,cAAc,CAAC,CA4DzB"}
@@ -7,6 +7,29 @@ const MAXIMUM_DISCOVERY_BYTES = 4_096;
7
7
  const MAXIMUM_TOKEN_LIFETIME_MS = 330_000;
8
8
  const HOME_KEY = /^mhk1_([A-Za-z0-9_-]{22})_([A-Za-z0-9_-]{43})$/;
9
9
  const DISCOVERY_PATH = '/.well-known/miakapp-control-plane';
10
+ const HOME_URL_SUFFIX = '/app?home={home_id}';
11
+ /**
12
+ * Accepts exactly `<canonical https origin>/app?home={home_id}`: no path, no
13
+ * credentials, no port games, nothing a server could use to point residents
14
+ * somewhere else under a plausible-looking link.
15
+ */
16
+ export function parseHomeUrlTemplate(value) {
17
+ if (typeof value !== 'string' || !value.endsWith(HOME_URL_SUFFIX)) {
18
+ throw contractError('home_url_template is not <origin>/app?home={home_id}');
19
+ }
20
+ const origin = value.slice(0, -HOME_URL_SUFFIX.length);
21
+ canonicalHttpsUrl(origin, 'home_url_template origin');
22
+ if (new URL(origin).origin !== origin) {
23
+ throw contractError('home_url_template must be rooted at a bare origin');
24
+ }
25
+ return value;
26
+ }
27
+ /** The trusted resident link for a home, or null when discovery names none. */
28
+ export function homeUrl(discovery, homeId) {
29
+ return discovery.homeUrlTemplate === undefined
30
+ ? null
31
+ : discovery.homeUrlTemplate.replace('{home_id}', encodeURIComponent(homeId));
32
+ }
10
33
  export function homeKeyId(homeKey) {
11
34
  const match = HOME_KEY.exec(homeKey);
12
35
  const keyId = match?.[1];
@@ -43,13 +66,19 @@ export async function fetchDiscovery(options) {
43
66
  'user_relay_exchange_endpoint',
44
67
  'push_audience',
45
68
  'components_audience',
46
- ]);
69
+ ], ['runtime_diagnostics_endpoint', 'home_url_template']);
47
70
  if (document.schema !== 'miakapp.control-plane-discovery/1') {
48
71
  throw contractError('Discovery document has an unsupported schema');
49
72
  }
50
73
  if (document.issuer !== issuer) {
51
74
  throw contractError('Discovery document advertises a different issuer');
52
75
  }
76
+ // Optional, but never unchecked: it is still a location under this issuer.
77
+ if (document.runtime_diagnostics_endpoint !== undefined
78
+ && canonicalHttpsUrl(document.runtime_diagnostics_endpoint, 'runtime_diagnostics_endpoint')
79
+ !== `${issuer}/v1/runtime-diagnostics`) {
80
+ throw contractError('runtime_diagnostics_endpoint is not under this issuer');
81
+ }
53
82
  return Object.freeze({
54
83
  issuer,
55
84
  jwksUri: canonicalHttpsUrl(document.jwks_uri, 'jwks_uri'),
@@ -57,6 +86,9 @@ export async function fetchDiscovery(options) {
57
86
  userRelayExchangeEndpoint: canonicalHttpsUrl(document.user_relay_exchange_endpoint, 'user_relay_exchange_endpoint'),
58
87
  pushAudience: canonicalHttpsUrl(document.push_audience, 'push_audience'),
59
88
  componentsAudience: canonicalHttpsUrl(document.components_audience, 'components_audience'),
89
+ ...(document.home_url_template === undefined
90
+ ? {}
91
+ : { homeUrlTemplate: parseHomeUrlTemplate(document.home_url_template) }),
60
92
  });
61
93
  }
62
94
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"control-plane.js","sourceRoot":"","sources":["../src/control-plane.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control-plane.js","sourceRoot":"","sources":["../src/control-plane.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,10 @@
1
1
  /** RFC 0002 §7.1 caps the artifact at 2 MiB decoded. */
2
2
  export declare const MAXIMUM_ARTIFACT_BYTES = 2097152;
3
+ /** RFC 0002 semantic component and whole-house application (house-app ABI spec). */
4
+ export declare const COMPONENT_ABI = "miakapp.component/1";
5
+ export declare const APP_ABI = "miakapp.app/1";
6
+ export type ReleaseAbi = typeof COMPONENT_ABI | typeof APP_ABI;
7
+ export declare function isReleaseAbi(value: unknown): value is ReleaseAbi;
3
8
  /** RFC 0002 §10 aborts tokenization beyond this program ceiling. */
4
9
  export declare const MAXIMUM_PROGRAM_TOKENS = 100000;
5
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/internal/names.ts"],"names":[],"mappings":"AAYA,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD,oEAAoE;AACpE,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,eAAO,MAAM,iBAAiB,YAC5B,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,cAAc,CACN,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,IAAI,IAAI,eAAe,GAAG,SAAS,MAAM,EAAE;CACtD,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE7D;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIxE;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAIzD;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO5D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAKpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjF"}
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/internal/names.ts"],"names":[],"mappings":"AAYA,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,UAAY,CAAC;AAEhD,oFAAoF;AACpF,eAAO,MAAM,aAAa,wBAAwB,CAAC;AACnD,eAAO,MAAM,OAAO,kBAAkB,CAAC;AACvC,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,GAAG,OAAO,OAAO,CAAC;AAE/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,oEAAoE;AACpE,eAAO,MAAM,sBAAsB,SAAU,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD,eAAO,MAAM,iBAAiB,YAC5B,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,cAAc,CACN,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,IAAI,IAAI,eAAe,GAAG,SAAS,MAAM,EAAE;CACtD,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE1D;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE7D;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAIxE;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAIzD;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAO5D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAKpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEpE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjF"}
@@ -10,6 +10,12 @@ const BASE64URL = /^[A-Za-z0-9_-]+$/;
10
10
  const PRESENTATION_HANDLE = /^media\.[^.]/;
11
11
  /** RFC 0002 §7.1 caps the artifact at 2 MiB decoded. */
12
12
  export const MAXIMUM_ARTIFACT_BYTES = 2_097_152;
13
+ /** RFC 0002 semantic component and whole-house application (house-app ABI spec). */
14
+ export const COMPONENT_ABI = 'miakapp.component/1';
15
+ export const APP_ABI = 'miakapp.app/1';
16
+ export function isReleaseAbi(value) {
17
+ return value === COMPONENT_ABI || value === APP_ABI;
18
+ }
13
19
  /** RFC 0002 §10 aborts tokenization beyond this program ceiling. */
14
20
  export const MAXIMUM_PROGRAM_TOKENS = 100_000;
15
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/internal/names.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/internal/names.ts"],"names":[],"mappings":"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"}
package/dist/main.d.ts CHANGED
@@ -1,11 +1,15 @@
1
+ import { CLI_VERSION } from './version.js';
1
2
  import type { FetchLike } from './internal/http.js';
2
- export declare const CLI_VERSION = "4.0.0-alpha.0";
3
+ export { CLI_VERSION };
3
4
  /**
4
- * The Home Key is read from the environment only. A secret passed as an
5
- * argument would land in shell history, in a process listing and in most CI
6
- * logs, so no command accepts one.
5
+ * A Home Key comes from a paired context in `~/.miakapp` or, for CI and
6
+ * compatibility, from this variable. A secret passed as an argument would land
7
+ * in shell history, in a process listing and in most CI logs, so no command
8
+ * accepts one.
7
9
  */
8
10
  export declare const HOME_KEY_VARIABLE = "MIAKAPP_HOME_KEY";
11
+ /** Selects a stored context for one invocation, like `--context`. */
12
+ export declare const CONTEXT_VARIABLE = "MIAKAPP_CONTEXT";
9
13
  export interface FileSystem {
10
14
  read(path: string): Promise<Uint8Array>;
11
15
  /** Creates. Fails if the path exists: no command may clobber by accident. */
@@ -33,12 +37,24 @@ export interface CliHost {
33
37
  fetch?: FetchLike;
34
38
  /** Read only by `mcp`, which serves a request stream instead of one command. */
35
39
  input?: AsyncIterable<Uint8Array>;
40
+ /** Parent of `.miakapp`. Injected by tests; defaults to the account's home. */
41
+ homeDirectory?(): string;
42
+ /** Names the machine in a default key label. Defaults to the OS host name. */
43
+ hostname?(): string;
44
+ /**
45
+ * Reads one secret line without echoing it: a hidden prompt on a terminal,
46
+ * the first line of a pipe otherwise. Absent under MCP, whose stdin is the
47
+ * protocol stream.
48
+ */
49
+ readSecret?(prompt: string): Promise<string>;
36
50
  }
37
51
  type Field = readonly [key: string, value: string | number | readonly string[]];
38
52
  export interface CommandResult {
39
53
  readonly summary: string;
40
54
  readonly fields: readonly Field[];
41
55
  readonly json: Record<string, unknown>;
56
+ /** Complete human-facing document for commands such as `docs start`. */
57
+ readonly text?: string;
42
58
  }
43
59
  export interface Invocation {
44
60
  readonly command: string;
@@ -67,6 +83,8 @@ export declare function parseArguments(argv: readonly string[]): Invocation;
67
83
  * fixture at a path the command never opens would prove nothing.
68
84
  */
69
85
  export declare function guideAssetPath(): Promise<string>;
86
+ /** Directory of the design files (`tokens.css`, `gallery.html`…), resolved like the guide. */
87
+ export declare function designAssetDirectory(): Promise<string>;
70
88
  /**
71
89
  * Runs one parsed invocation.
72
90
  *
@@ -82,5 +100,4 @@ export declare function dispatch(host: CliHost, invocation: Invocation): Promise
82
100
  * the control plane was left untouched.
83
101
  */
84
102
  export declare function run(argv: readonly string[], host: CliHost): Promise<number>;
85
- export {};
86
103
  //# sourceMappingURL=main.d.ts.map