predictable-ai 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,cAAc,EAAW,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,GAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAiB,MAAM,aAAa,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE7D,OAAO,EAAE,aAAa,EAAoB,MAAM,eAAe,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAS5D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,EAAS;IACjC,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAA;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAEtC,uEAAuE;IACvE,2EAA2E;IAC3E,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAA;QACjC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACrG,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,QAAQ;QAAE,EAAE,CAAC,MAAM,CAAC,YAAY,OAAO,IAAI,CAAC,CAAA;IAE7E,MAAM,GAAG,GAAmB;QAC1B,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC;QAC/B,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,YAAY,EAAE,mBAAmB,CAAC,EAAE,CAAC,GAAG,CAAC;QACzC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,OAAO,IAAI,CAAC;KACtD,CAAA;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;QACvC,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;YAAE,EAAE,CAAC,MAAM,CAAC,YAAY,OAAO,IAAI,CAAC,CAAA;QACzE,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,CAAA;QACjF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;YACtB,OAAO,IAAI,CAAC,EAAE,CAAA;QAChB,CAAC;QACD,yEAAyE;QACzE,sDAAsD;QACtD,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC/C,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;QACtB,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAE,CAAA;IAE3D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QACrD,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACjC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9D,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACjC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,CAAC;QACH,4EAA4E;QAC5E,yEAAyE;QACzE,8DAA8D;QAC9D,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,EAAE,CAAA;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;YAC/B,IAAI,KAAK,CAAC,MAAM;gBAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAA;YAChD,OAAO,KAAK,CAAC,IAAI,CAAA;QACnB,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACxE,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AAEzD,SAAS,YAAY,CAAC,IAAiB,EAAE,IAA2D;IAClG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrF,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5D,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACtF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { readFileSync } from 'node:fs';
2
+ const ARTIFACT_URL = new URL('./generated/commands.json', import.meta.url);
3
+ let cached;
4
+ /** The artifact compiled into this build of the CLI. */
5
+ export function bundledSurface() {
6
+ if (!cached)
7
+ cached = JSON.parse(readFileSync(ARTIFACT_URL, 'utf8'));
8
+ return cached;
9
+ }
10
+ /**
11
+ * The artifact's guide topics, normalized to a list.
12
+ *
13
+ * Deliberately NOT shared with `parity.ts`, which derives the expected set with
14
+ * its own copy of this rule: the parity guard is a comparison of two
15
+ * independent derivations, and a helper shared by both sides would make a
16
+ * dropped derivation invisible (mutant M2).
17
+ */
18
+ export function surfaceGuideTopics(artifact) {
19
+ const topics = artifact.guideTopics;
20
+ if (!Array.isArray(topics))
21
+ return [];
22
+ return topics.filter((t) => typeof t === 'string' && t.length > 0);
23
+ }
24
+ //# sourceMappingURL=surface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface.js","sourceRoot":"","sources":["../src/surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAiEtC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,2BAA2B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE1E,IAAI,MAAmC,CAAA;AAEvC,wDAAwD;AACxD,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAoB,CAAA;IACvF,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAA;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAA;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AACjF,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { classify, send } from './http.js';
5
+ import { bundledSurface } from './surface.js';
6
+ import { TOKEN_ENV_VAR } from './config.js';
7
+ /**
8
+ * `predictable --version` (ticket AC1, dispatch resolution R5).
9
+ *
10
+ * It prints three facts: this package's version, the surface hash COMPILED INTO
11
+ * this client, and — when a token is configured — the hash the deployment
12
+ * serves. A mismatch is the answer to "why does the server not know my verb":
13
+ * the client is older or newer than the deployment.
14
+ *
15
+ * IT ALWAYS EXITS 0 ONCE IT RUNS. A version read that fails because the network
16
+ * is down, or because no token is configured, has still answered the question
17
+ * it was asked about the client. The mismatch and the unavailability both go to
18
+ * stderr, so a script that captures stdout gets clean version lines either way.
19
+ *
20
+ * `run()` can refuse before reaching here: a credential passed as a flag is
21
+ * refused by name ahead of every exiting branch (owner ruling, round 2), so
22
+ * `--version` with one exits 1 having printed nothing. Without one, this is the
23
+ * only branch, and it exits 0.
24
+ */
25
+ export function packageVersion() {
26
+ let dir = dirname(fileURLToPath(import.meta.url));
27
+ // Walk up: the same file sits at src/version.ts in the tree and dist/version.js
28
+ // in a build, and only one of those is a fixed distance from package.json.
29
+ for (let depth = 0; depth < 5; depth += 1) {
30
+ try {
31
+ const parsed = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
32
+ if (typeof parsed.version === 'string')
33
+ return parsed.version;
34
+ }
35
+ catch {
36
+ /* keep walking */
37
+ }
38
+ dir = dirname(dir);
39
+ }
40
+ return '0.0.0';
41
+ }
42
+ /** The version a manifest body carries, or nothing if it carries none. */
43
+ function bodyVersion(text) {
44
+ try {
45
+ const body = JSON.parse(text);
46
+ return typeof body.version === 'string' ? body.version : undefined;
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ }
52
+ export async function versionReport(ctx) {
53
+ const bundled = bundledSurface().version;
54
+ const lines = [`predictable ${packageVersion()}`, `agent surface (bundled) ${bundled}`];
55
+ const warnings = [];
56
+ if (!ctx.token) {
57
+ warnings.push(`The deployment's surface version needs a credential; set ${TOKEN_ENV_VAR} to compare it against ${bundled}.`);
58
+ return { lines, warnings };
59
+ }
60
+ const call = { method: 'GET', path: '/api/agent/manifest' };
61
+ let served;
62
+ try {
63
+ const response = await send(ctx, call);
64
+ const failure = classify(response, call);
65
+ if (failure) {
66
+ warnings.push(`Could not read the deployment's surface version: ${failure.message}`);
67
+ return { lines, warnings };
68
+ }
69
+ // THE HEADER FIRST, AND THE BODY ONLY IF IT IS ABSENT. The route promises
70
+ // the header; parsing the body unconditionally meant a deployment that
71
+ // answered the header with a body this client does not model threw, and a
72
+ // question the server HAD answered was reported as "could not read".
73
+ const header = response.headers.get('x-agent-surface-version');
74
+ served = header ?? bodyVersion(response.text);
75
+ }
76
+ catch (cause) {
77
+ warnings.push(`Could not read the deployment's surface version: ${cause instanceof Error ? cause.message : String(cause)}`);
78
+ return { lines, warnings };
79
+ }
80
+ if (!served) {
81
+ warnings.push("The deployment served no surface version; it may predate the manifest route.");
82
+ return { lines, warnings };
83
+ }
84
+ lines.push(`agent surface (server) ${served}`);
85
+ if (served !== bundled) {
86
+ warnings.push(`Surface mismatch: this client bundles ${bundled}, ${ctx.baseUrl} serves ${served}. ` +
87
+ 'Commands the deployment does not know will fail; update the client.');
88
+ }
89
+ return { lines, warnings };
90
+ }
91
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "predictable-ai",
3
+ "version": "0.1.0",
4
+ "description": "Command-line client for the Predictable agent surface.",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "bin": {
8
+ "predictable": "dist/bin.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "engines": {
14
+ "node": ">=20"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.build.json && node scripts/copy-generated.mjs",
18
+ "prepack": "npm run build",
19
+ "typecheck": "tsc -p tsconfig.json --noEmit",
20
+ "test": "vitest run"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20.19.9",
24
+ "typescript": "^5.6.3",
25
+ "vitest": "^2.1.9"
26
+ }
27
+ }