humanish 0.38.0 → 0.40.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.
Files changed (57) hide show
  1. package/README.md +5 -2
  2. package/dist/actor-contract.d.ts +24 -1
  3. package/dist/actor-contract.js +4 -0
  4. package/dist/actor-contract.js.map +1 -1
  5. package/dist/claude-agent-sdk.js +4 -0
  6. package/dist/claude-agent-sdk.js.map +1 -1
  7. package/dist/comms-catch-host.d.ts +31 -0
  8. package/dist/comms-catch-host.js +82 -4
  9. package/dist/comms-catch-host.js.map +1 -1
  10. package/dist/comms-sandbox-catch.d.ts +32 -1
  11. package/dist/comms-sandbox-catch.js +226 -19
  12. package/dist/comms-sandbox-catch.js.map +1 -1
  13. package/dist/computer-use-actor.d.ts +1 -1
  14. package/dist/computer-use.d.ts +13 -1
  15. package/dist/computer-use.js +100 -14
  16. package/dist/computer-use.js.map +1 -1
  17. package/dist/concurrent-shared-world-lab.js +7 -2
  18. package/dist/concurrent-shared-world-lab.js.map +1 -1
  19. package/dist/cua-actor-lab.d.ts +8 -0
  20. package/dist/cua-actor-lab.js +110 -9
  21. package/dist/cua-actor-lab.js.map +1 -1
  22. package/dist/e2b-desktop-executor.d.ts +21 -6
  23. package/dist/e2b-desktop-executor.js +65 -21
  24. package/dist/e2b-desktop-executor.js.map +1 -1
  25. package/dist/lab-config.d.ts +36 -0
  26. package/dist/lab-config.js +87 -2
  27. package/dist/lab-config.js.map +1 -1
  28. package/dist/observer-data.js +5 -0
  29. package/dist/observer-data.js.map +1 -1
  30. package/dist/openai-responses-cu.js +10 -1
  31. package/dist/openai-responses-cu.js.map +1 -1
  32. package/dist/orientation.d.ts +29 -0
  33. package/dist/orientation.js +95 -0
  34. package/dist/orientation.js.map +1 -0
  35. package/dist/persona-resolve.d.ts +44 -0
  36. package/dist/persona-resolve.js +109 -0
  37. package/dist/persona-resolve.js.map +1 -0
  38. package/dist/pi-agent-core.js +4 -0
  39. package/dist/pi-agent-core.js.map +1 -1
  40. package/dist/pricing.d.ts +8 -0
  41. package/dist/pricing.js +22 -6
  42. package/dist/pricing.js.map +1 -1
  43. package/dist/program.js +36 -1
  44. package/dist/program.js.map +1 -1
  45. package/dist/run.d.ts +1 -1
  46. package/dist/run.js +27 -1
  47. package/dist/run.js.map +1 -1
  48. package/dist/shared-world-lab.js +7 -2
  49. package/dist/shared-world-lab.js.map +1 -1
  50. package/dist/subject-runtime.d.ts +23 -0
  51. package/dist/subject-runtime.js +70 -0
  52. package/dist/subject-runtime.js.map +1 -0
  53. package/docs/contracts/schemas.md +1 -1
  54. package/docs/goals/current.md +2 -2
  55. package/docs/principles/three-roles.md +68 -0
  56. package/docs/ramp/README.md +1 -1
  57. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ // What `humanish` says when you run it with no arguments (#367).
2
+ //
3
+ // It used to print commander's help: sixteen subcommands before any value, identical whether you
4
+ // had never run the tool or had a finished study sitting on disk. That is a poor first contact for
5
+ // a human, and it is worse for a coding agent, which needs to know WHERE IT IS before it can choose
6
+ // a command — help is a menu, not an orientation.
7
+ //
8
+ // So bare invocation answers three questions instead: what is this, what state is this project in,
9
+ // and what should I run next. The answer is derived from the project rather than fixed, so it is
10
+ // useful on first contact and still useful on the hundredth run.
11
+ //
12
+ // Both audiences are served by the same data (docs/principles/three-roles.md). A human on a
13
+ // terminal gets prose and an offer to set things up; an agent gets the same facts as stable text,
14
+ // or as JSON with `--json`. Neither is a special case of the other bolted on afterwards.
15
+ import { listLabManifests } from "./labs.js";
16
+ import { listRuns } from "./run.js";
17
+ export const ORIENTATION_SCHEMA = "humanish.orientation.v1";
18
+ /**
19
+ * Read the project's state. Pure-ish: it only reads, never writes, and never touches the network or
20
+ * a provider — bare invocation must not be able to spend money or mutate a repo.
21
+ */
22
+ export async function readOrientation(cwd) {
23
+ const [labs, runs] = await Promise.all([
24
+ listLabManifests(cwd).catch(() => undefined),
25
+ listRuns(cwd).catch(() => undefined)
26
+ ]);
27
+ const labIds = (labs?.labs ?? []).map((lab) => lab.id).filter((id) => typeof id === "string");
28
+ const runIds = (runs?.runs ?? []).map((run) => run.runId).filter((id) => typeof id === "string");
29
+ const latest = typeof runs?.latest === "string" ? runs.latest : runIds[0];
30
+ const initialized = (labs?.labs ?? []).some((lab) => lab.origin === "committed") || labIds.length > 0;
31
+ return {
32
+ schema: ORIENTATION_SCHEMA,
33
+ initialized,
34
+ labCount: labIds.length,
35
+ labIds: labIds.slice(0, 3),
36
+ runCount: runIds.length,
37
+ ...(latest === undefined ? {} : { latestRunId: latest }),
38
+ nextCommands: nextCommandsFor({ initialized, labIds, hasRun: runIds.length > 0 })
39
+ };
40
+ }
41
+ /**
42
+ * The two or three commands worth running from this state. Deliberately short: a list of everything
43
+ * is what bare invocation used to print, and it is why nobody read it.
44
+ */
45
+ function nextCommandsFor(args) {
46
+ if (!args.initialized) {
47
+ return [
48
+ { command: "humanish init", why: "create humanish/ with a starter lab and persona" },
49
+ { command: "humanish run first-run", why: "a synthetic run with no keys and no spend, to see the shape of the evidence" }
50
+ ];
51
+ }
52
+ const suggestedLab = args.labIds[0];
53
+ const commands = [
54
+ {
55
+ command: suggestedLab ? `humanish watch ${suggestedLab}` : "humanish watch",
56
+ why: "run a lab and open the Observer while it goes"
57
+ }
58
+ ];
59
+ if (args.hasRun) {
60
+ commands.push({ command: "humanish verify --run latest", why: "check the last run's evidence and public-safety gates" });
61
+ commands.push({ command: "humanish observe --run latest", why: "reopen the last run's Observer" });
62
+ }
63
+ else {
64
+ commands.push({ command: "humanish lab list", why: "see the labs this project declares" });
65
+ commands.push({ command: "humanish doctor", why: "check what this project still needs before a live run" });
66
+ }
67
+ return commands;
68
+ }
69
+ /**
70
+ * The human rendering. Says where you are before it says what to do, because "what should I run"
71
+ * has no answer that is true in every project.
72
+ */
73
+ export function formatOrientationHuman(state) {
74
+ const lines = [
75
+ "humanish — run realistic synthetic personas against your app and keep the evidence.",
76
+ ""
77
+ ];
78
+ if (!state.initialized) {
79
+ lines.push("This project is not set up yet.");
80
+ }
81
+ else {
82
+ const labs = state.labCount === 1 ? "1 lab" : `${state.labCount} labs`;
83
+ const runs = state.runCount === 0 ? "no runs yet" : state.runCount === 1 ? "1 run" : `${state.runCount} runs`;
84
+ lines.push(`This project has ${labs} and ${runs}${state.latestRunId ? ` (latest: ${state.latestRunId})` : ""}.`);
85
+ }
86
+ lines.push("");
87
+ for (const next of state.nextCommands) {
88
+ lines.push(` ${next.command}`);
89
+ lines.push(` ${next.why}`);
90
+ }
91
+ lines.push("");
92
+ lines.push("`humanish --help` lists every command.");
93
+ return `${lines.join("\n")}\n`;
94
+ }
95
+ //# sourceMappingURL=orientation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orientation.js","sourceRoot":"","sources":["../src/orientation.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,EAAE;AACF,iGAAiG;AACjG,mGAAmG;AACnG,oGAAoG;AACpG,kDAAkD;AAClD,EAAE;AACF,mGAAmG;AACnG,iGAAiG;AACjG,iEAAiE;AACjE,EAAE;AACF,4FAA4F;AAC5F,kGAAkG;AAClG,yFAAyF;AAEzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAkC,CAAC;AAsBrE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;QAC5C,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC5G,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC/G,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAEtG,OAAO;QACL,MAAM,EAAE,kBAAkB;QAC1B,WAAW;QACX,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QACxD,YAAY,EAAE,eAAe,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;KAClF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,IAAiE;IACxF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,iDAAiD,EAAE;YACpF,EAAE,OAAO,EAAE,wBAAwB,EAAE,GAAG,EAAE,6EAA6E,EAAE;SAC1H,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAyB;QACrC;YACE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,kBAAkB,YAAY,EAAE,CAAC,CAAC,CAAC,gBAAgB;YAC3E,GAAG,EAAE,+CAA+C;SACrD;KACF,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,8BAA8B,EAAE,GAAG,EAAE,uDAAuD,EAAE,CAAC,CAAC;QACzH,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,+BAA+B,EAAE,GAAG,EAAE,gCAAgC,EAAE,CAAC,CAAC;IACrG,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE,oCAAoC,EAAE,CAAC,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,uDAAuD,EAAE,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAuB;IAC5D,MAAM,KAAK,GAAa;QACtB,qFAAqF;QACrF,EAAE;KACH,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,OAAO,CAAC;QACvE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,OAAO,CAAC;QAC9G,KAAK,CAAC,IAAI,CAAC,oBAAoB,IAAI,QAAQ,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { type ResolvedPersona } from "./persona.js";
2
+ import { type PreparedSelectedOutputDirectory } from "./selected-output-paths.js";
3
+ /** Persona ids are file-name segments, never paths: the same grammar the terminal lane enforces. */
4
+ export declare const PERSONA_ID_PATTERN: RegExp;
5
+ /** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
6
+ export declare function personaTitleFromId(personaId: string): string;
7
+ /**
8
+ * Resolve ONE committed persona. Returns `null` (never a throw, never a guess) when the id is
9
+ * unsafe or no file exists, so a lane always runs.
10
+ */
11
+ export declare function resolveCommittedPersona(projectRoot: PreparedSelectedOutputDirectory, personaId: string): Promise<{
12
+ persona: ResolvedPersona | null;
13
+ warnings: string[];
14
+ }>;
15
+ /**
16
+ * Resolve every distinct persona id a run will use, once, before lane specs are built. Returning a
17
+ * map keeps the plan builder PURE (it is exported npm surface and asserted pure by tests): the
18
+ * async file reads happen here, and the composer only does a lookup.
19
+ */
20
+ export declare function resolveCommittedPersonas(projectRoot: PreparedSelectedOutputDirectory, personaIds: readonly (string | undefined)[]): Promise<{
21
+ personas: Map<string, ResolvedPersona>;
22
+ warnings: string[];
23
+ }>;
24
+ /**
25
+ * Every persona id a lab config could put on a browser lane: the per-lane roster when one is
26
+ * declared, otherwise the actor-level persona that every fan-out lane inherits.
27
+ */
28
+ export declare function labPersonaIds(config: {
29
+ actors?: readonly {
30
+ persona?: string;
31
+ lanes?: readonly {
32
+ persona?: string;
33
+ }[];
34
+ }[];
35
+ }): string[];
36
+ /**
37
+ * Same resolution from a plain cwd, for the labs that carry a directory string rather than an
38
+ * already-prepared root. Realpath-then-prepare mirrors the cua lab so a symlinked cwd still reads
39
+ * personas from the physical project.
40
+ */
41
+ export declare function resolveCommittedPersonasForCwd(cwd: string, personaIds: readonly (string | undefined)[]): Promise<{
42
+ personas: Map<string, ResolvedPersona>;
43
+ warnings: string[];
44
+ }>;
@@ -0,0 +1,109 @@
1
+ // Resolve committed persona files into compiled personas, for EVERY lane (#381).
2
+ //
3
+ // #308 gave the terminal lane this: read `humanish/personas/<id>.yaml`, compile the traits into
4
+ // behavioral directives, and record truthfully which traits were applied. The computer-use lanes
5
+ // never got it — they composed a bare `Persona: <id>.` line and hardcoded `traitsApplied: []`, so
6
+ // on browser routes the persona axis was a label rather than a behavior. A live two-lane contrast
7
+ // (an impatient expert vs a patient newcomer, same app, same mission) came back with near-identical
8
+ // action profiles, which read like evidence that personas do not matter and was actually evidence
9
+ // that personas were never applied.
10
+ //
11
+ // This module is the shared implementation so the two routes cannot drift again: one containment
12
+ // rule, one compiler, one fallback polarity.
13
+ //
14
+ // FAIL-SAFE, not fail-closed — deliberately the opposite polarity to the scorer loader. A persona
15
+ // that declared nothing must never be given fabricated traits, so an unsafe id, a missing file, or
16
+ // unparseable YAML falls back to the bare id line with a truthful EMPTY traitsApplied (warning only
17
+ // when the file existed but could not be read). Silence here is honest; invention would not be.
18
+ import { parse as parseYaml } from "yaml";
19
+ import path from "node:path";
20
+ import { parseResolvedPersona } from "./persona.js";
21
+ import { prepareSelectedOutputDirectory, readContainedRegularFile } from "./selected-output-paths.js";
22
+ import { realpath } from "node:fs/promises";
23
+ /** Persona ids are file-name segments, never paths: the same grammar the terminal lane enforces. */
24
+ export const PERSONA_ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
25
+ /** Title-case an id for the fallback display name (`skeptical-power-user` -> `Skeptical Power User`). */
26
+ export function personaTitleFromId(personaId) {
27
+ return personaId
28
+ .split(/[-_]/)
29
+ .filter(Boolean)
30
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
31
+ .join(" ");
32
+ }
33
+ /**
34
+ * Resolve ONE committed persona. Returns `null` (never a throw, never a guess) when the id is
35
+ * unsafe or no file exists, so a lane always runs.
36
+ */
37
+ export async function resolveCommittedPersona(projectRoot, personaId) {
38
+ if (!PERSONA_ID_PATTERN.test(personaId)) {
39
+ return { persona: null, warnings: [] };
40
+ }
41
+ for (const candidate of [
42
+ path.posix.join("humanish", "personas", `${personaId}.yaml`),
43
+ path.posix.join("humanish", "personas", `${personaId}.yml`)
44
+ ]) {
45
+ const bytes = await readContainedRegularFile(projectRoot, candidate);
46
+ if (!bytes)
47
+ continue;
48
+ let raw;
49
+ try {
50
+ raw = parseYaml(bytes.toString("utf8"));
51
+ }
52
+ catch {
53
+ return {
54
+ persona: null,
55
+ warnings: [`${candidate} could not be parsed as YAML; the lane ran with the persona id only (no traits applied).`]
56
+ };
57
+ }
58
+ return { persona: parseResolvedPersona(raw, { id: personaId, name: personaTitleFromId(personaId) }), warnings: [] };
59
+ }
60
+ return { persona: null, warnings: [] };
61
+ }
62
+ /**
63
+ * Resolve every distinct persona id a run will use, once, before lane specs are built. Returning a
64
+ * map keeps the plan builder PURE (it is exported npm surface and asserted pure by tests): the
65
+ * async file reads happen here, and the composer only does a lookup.
66
+ */
67
+ export async function resolveCommittedPersonas(projectRoot, personaIds) {
68
+ const personas = new Map();
69
+ const warnings = [];
70
+ for (const personaId of new Set(personaIds.filter((id) => typeof id === "string" && id.length > 0))) {
71
+ const resolved = await resolveCommittedPersona(projectRoot, personaId);
72
+ if (resolved.persona)
73
+ personas.set(personaId, resolved.persona);
74
+ warnings.push(...resolved.warnings);
75
+ }
76
+ return { personas, warnings };
77
+ }
78
+ /**
79
+ * Every persona id a lab config could put on a browser lane: the per-lane roster when one is
80
+ * declared, otherwise the actor-level persona that every fan-out lane inherits.
81
+ */
82
+ export function labPersonaIds(config) {
83
+ const ids = [];
84
+ for (const actor of config.actors ?? []) {
85
+ if (actor.persona)
86
+ ids.push(actor.persona);
87
+ for (const lane of actor.lanes ?? []) {
88
+ if (lane.persona)
89
+ ids.push(lane.persona);
90
+ }
91
+ }
92
+ return [...new Set(ids)];
93
+ }
94
+ /**
95
+ * Same resolution from a plain cwd, for the labs that carry a directory string rather than an
96
+ * already-prepared root. Realpath-then-prepare mirrors the cua lab so a symlinked cwd still reads
97
+ * personas from the physical project.
98
+ */
99
+ export async function resolveCommittedPersonasForCwd(cwd, personaIds) {
100
+ try {
101
+ const physical = await realpath(path.resolve(cwd));
102
+ const projectRoot = await prepareSelectedOutputDirectory(path.dirname(physical), physical);
103
+ return await resolveCommittedPersonas(projectRoot, personaIds);
104
+ }
105
+ catch {
106
+ return { personas: new Map(), warnings: [] };
107
+ }
108
+ }
109
+ //# sourceMappingURL=persona-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona-resolve.js","sourceRoot":"","sources":["../src/persona-resolve.ts"],"names":[],"mappings":"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"}
@@ -21,6 +21,10 @@ export function piStatusToCompletionReason(status) {
21
21
  return "timed_out";
22
22
  case "blocked":
23
23
  return "blocked_approval";
24
+ case "abandoned":
25
+ return "gave_up";
26
+ case "incomplete":
27
+ return "budget_reached";
24
28
  case "failed":
25
29
  return "actor_error";
26
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pi-agent-core.js","sourceRoot":"","sources":["../src/pi-agent-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pi-agent-core.js","sourceRoot":"","sources":["../src/pi-agent-core.ts"],"names":[],"mappings":"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"}
package/dist/pricing.d.ts CHANGED
@@ -6,6 +6,11 @@ export interface ModelRate {
6
6
  inputUsdPerToken: number;
7
7
  /** USD per output token. */
8
8
  outputUsdPerToken: number;
9
+ /** USD per input token served from the provider's prompt cache, when the provider bills those at
10
+ * a reduced rate. Optional: absent means we do not model a discount and every input token is
11
+ * billed at `inputUsdPerToken` — the previous behavior, kept as the fallback so a rate sheet
12
+ * without this field prices exactly as it did before (#391). */
13
+ cachedInputUsdPerToken?: number;
9
14
  /** "YYYY-MM-DD" the entry was last checked against `source`. */
10
15
  asOf: string;
11
16
  /** Public pricing page the number came from (a comment/URL, never a secret). */
@@ -45,6 +50,9 @@ export interface ActorEstimatedCost {
45
50
  outputUsd: number;
46
51
  inputTokens: number;
47
52
  outputTokens: number;
53
+ /** Of `inputTokens`, how many were billed at the reduced cached rate. Present only when the
54
+ * provider reported cache hits AND the rate sheet models a cached rate. */
55
+ cachedInputTokens?: number;
48
56
  };
49
57
  }
50
58
  /** The desktop-minute cost ESTIMATE (host-side create->teardown span * a per-minute rate). Same
package/dist/pricing.js CHANGED
@@ -23,13 +23,14 @@ export const MODEL_RATES = {
23
23
  asOf: "2026-08-01",
24
24
  source: "openai.com/api/pricing (computer-use-preview)"
25
25
  },
26
- // gpt-5.5 = the shipped CUA default (DEFAULT_OPENAI_CU_MODEL). $5 / 1M input, $30 / 1M output
27
- // ($0.50 / 1M cached input, not modeled here). NOTE: OpenAI's live pricing page no longer lists
28
- // gpt-5.5 (superseded by the gpt-5.6 family) — rate confirmed against public third-party sheets
29
- // instead; refreshing the default model is tracked in issue #334.
26
+ // gpt-5.5 = the shipped CUA default (DEFAULT_OPENAI_CU_MODEL). $5 / 1M input, $30 / 1M output,
27
+ // $0.50 / 1M cached input. NOTE: OpenAI's live pricing page no longer lists gpt-5.5 (superseded
28
+ // by the gpt-5.6 family) — rate confirmed against public third-party sheets instead; refreshing
29
+ // the default model is tracked in issue #334.
30
30
  "gpt-5.5": {
31
31
  inputUsdPerToken: 5e-6,
32
32
  outputUsdPerToken: 30e-6,
33
+ cachedInputUsdPerToken: 0.5e-6,
33
34
  asOf: "2026-08-05",
34
35
  source: "openrouter.ai/openai/gpt-5.5 (gpt-5.5 no longer on openai.com/api/pricing; see #334)"
35
36
  }
@@ -73,7 +74,16 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
73
74
  }
74
75
  const inTok = tokenUsage.input ?? 0;
75
76
  const outTok = tokenUsage.output ?? 0;
76
- const inputUsd = round6(inTok * rate.inputUsdPerToken);
77
+ // Cached input is billed at a fraction of the full rate, and on a session that threads state
78
+ // through the provider it is the MAJORITY of input — a warm prefix is re-sent every turn. Pricing
79
+ // it at the full rate overstated real spend by up to ~10x on long sessions, which is enough to
80
+ // abort a run against its own cap for money it never spent (#391).
81
+ //
82
+ // Both halves are honestly absent: no reported cachedInput, or a rate sheet without a cached
83
+ // rate, prices exactly as before. We never assume a discount we cannot evidence.
84
+ const cachedTok = rate.cachedInputUsdPerToken === undefined ? 0 : Math.min(inTok, Math.max(0, tokenUsage.cachedInput ?? 0));
85
+ const fullTok = inTok - cachedTok;
86
+ const inputUsd = round6(fullTok * rate.inputUsdPerToken + cachedTok * (rate.cachedInputUsdPerToken ?? 0));
77
87
  const outputUsd = round6(outTok * rate.outputUsdPerToken);
78
88
  return {
79
89
  schema: ACTOR_ESTIMATED_COST_SCHEMA,
@@ -82,7 +92,13 @@ export function estimateActorCost(tokenUsage, modelId, rates = MODEL_RATES) {
82
92
  source: rate.source,
83
93
  ...(modelId ? { modelId } : {}),
84
94
  ...(rate.placeholder ? { placeholder: true } : {}),
85
- breakdown: { inputUsd, outputUsd, inputTokens: inTok, outputTokens: outTok }
95
+ breakdown: {
96
+ inputUsd,
97
+ outputUsd,
98
+ inputTokens: inTok,
99
+ outputTokens: outTok,
100
+ ...(cachedTok > 0 ? { cachedInputTokens: cachedTok } : {})
101
+ }
86
102
  };
87
103
  }
88
104
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../src/pricing.ts"],"names":[],"mappings":"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"}
package/dist/program.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { readFileSync } from "node:fs";
2
+ import { formatOrientationHuman, readOrientation } from "./orientation.js";
2
3
  import { readFile } from "node:fs/promises";
3
4
  import { dirname, join, resolve } from "node:path";
4
5
  import { fileURLToPath } from "node:url";
@@ -136,6 +137,18 @@ function reportUnexpectedActionError(command, io, error) {
136
137
  export function createProgram(io = {}) {
137
138
  const cliIo = { ...defaultIo, ...io };
138
139
  const program = new HumanishCommand(undefined, cliIo);
140
+ // Bare `humanish` orients instead of printing sixteen subcommands (#367). --help is untouched;
141
+ // this is only what happens when no command was chosen at all.
142
+ program.action(async (options) => {
143
+ const state = await readOrientation(".");
144
+ if (options.json === true) {
145
+ cliIo.writeOut(`${JSON.stringify(state, null, 2)}\n`);
146
+ }
147
+ else {
148
+ cliIo.writeOut(formatOrientationHuman(state));
149
+ }
150
+ cliIo.setExitCode(0);
151
+ });
139
152
  program
140
153
  .name("humanish")
141
154
  .description("Open-source-safe persona simulation CLI and proof harness.")
@@ -387,6 +400,8 @@ function registerCommsCommands(parent, io) {
387
400
  .option("--port <port>", "Port for capture + inbox (default 8025).", String(DEFAULT_SANDBOX_CATCH_PORT))
388
401
  .option("--dir <path>", "Directory for the deliveries log and rendered inbox.", ".humanish/comms-catch")
389
402
  .option("--token <value>", "Require this bearer token on GET /deliveries (recommended when reachable off-host).")
403
+ .option("--inbox-port <port>", "Also serve a READ-ONLY inbox listener on 0.0.0.0:<port>, so a persona on another machine can open /inbox. Without it the catch stays loopback-only.")
404
+ .option("--recipient <address>", "Only render mail sent to this address (repeatable). Default: render whatever the app actually mailed.", (value, previous = []) => [...previous, value])
390
405
  .action(async (options) => {
391
406
  const port = Number.parseInt(options.port, 10);
392
407
  if (!Number.isInteger(port) || port <= 0 || port > 65_534) {
@@ -394,7 +409,27 @@ function registerCommsCommands(parent, io) {
394
409
  io.setExitCode(2);
395
410
  return;
396
411
  }
397
- await runCommsCatchHost({ port, dir: options.dir, ...(options.token ? { token: options.token } : {}) }, io);
412
+ let inboxPort;
413
+ if (options.inboxPort !== undefined) {
414
+ inboxPort = Number.parseInt(options.inboxPort, 10);
415
+ if (!Number.isInteger(inboxPort) || inboxPort <= 0 || inboxPort > 65_534) {
416
+ io.writeErr("--inbox-port must be an integer between 1 and 65534.\n");
417
+ io.setExitCode(2);
418
+ return;
419
+ }
420
+ if (inboxPort === port) {
421
+ io.writeErr("--inbox-port must differ from --port (the capture listener is loopback-only; the inbox listener is not).\n");
422
+ io.setExitCode(2);
423
+ return;
424
+ }
425
+ }
426
+ await runCommsCatchHost({
427
+ port,
428
+ dir: options.dir,
429
+ ...(options.token ? { token: options.token } : {}),
430
+ ...(inboxPort === undefined ? {} : { inboxPort }),
431
+ ...(options.recipient && options.recipient.length > 0 ? { recipients: options.recipient } : {})
432
+ }, io);
398
433
  });
399
434
  }
400
435
  function registerReclaimCommand(parent, io) {