humanish 0.96.0 → 0.97.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 (81) hide show
  1. package/README.md +4 -1
  2. package/dist/automatic-analysis-config.d.ts +15 -5
  3. package/dist/automatic-analysis-config.js +25 -4
  4. package/dist/automatic-analysis-config.js.map +1 -1
  5. package/dist/automatic-study-analysis.js +4 -2
  6. package/dist/automatic-study-analysis.js.map +1 -1
  7. package/dist/cua-actor-lab.d.ts +18 -286
  8. package/dist/cua-actor-lab.js +151 -1955
  9. package/dist/cua-actor-lab.js.map +1 -1
  10. package/dist/cua-desktop-lane.d.ts +35 -0
  11. package/dist/cua-desktop-lane.js +13 -0
  12. package/dist/cua-desktop-lane.js.map +1 -0
  13. package/dist/desktop-session.d.ts +41 -0
  14. package/dist/desktop-session.js +44 -0
  15. package/dist/desktop-session.js.map +1 -0
  16. package/dist/doctor-lab.d.ts +6 -1
  17. package/dist/doctor-lab.js +17 -3
  18. package/dist/doctor-lab.js.map +1 -1
  19. package/dist/e2b-cua-desktop.d.ts +3 -0
  20. package/dist/e2b-cua-desktop.js +675 -0
  21. package/dist/e2b-cua-desktop.js.map +1 -0
  22. package/dist/e2b-cua-provisioning.d.ts +311 -0
  23. package/dist/e2b-cua-provisioning.js +1213 -0
  24. package/dist/e2b-cua-provisioning.js.map +1 -0
  25. package/dist/e2b-desktop-session.d.ts +7 -0
  26. package/dist/e2b-desktop-session.js +29 -0
  27. package/dist/e2b-desktop-session.js.map +1 -0
  28. package/dist/index.d.ts +1 -1
  29. package/dist/lab-summary.d.ts +3 -1
  30. package/dist/local-agent-cli.js +1 -1
  31. package/dist/local-agent-cli.js.map +1 -1
  32. package/dist/observer-app.html +2 -2
  33. package/dist/program.js +24 -9
  34. package/dist/program.js.map +1 -1
  35. package/dist/restricted-codex-analysis.d.ts +15 -0
  36. package/dist/restricted-codex-analysis.js +13 -0
  37. package/dist/restricted-codex-analysis.js.map +1 -0
  38. package/dist/restricted-codex-policy.d.ts +56 -0
  39. package/dist/restricted-codex-policy.js +151 -0
  40. package/dist/restricted-codex-policy.js.map +1 -0
  41. package/dist/restricted-codex-session.d.ts +19 -0
  42. package/dist/restricted-codex-session.js +419 -0
  43. package/dist/restricted-codex-session.js.map +1 -0
  44. package/dist/restricted-codex-transport.d.ts +58 -0
  45. package/dist/restricted-codex-transport.js +233 -0
  46. package/dist/restricted-codex-transport.js.map +1 -0
  47. package/dist/run.d.ts +1 -1
  48. package/dist/run.js +1 -1
  49. package/dist/run.js.map +1 -1
  50. package/dist/study-analysis-codex-config.d.ts +11 -0
  51. package/dist/study-analysis-codex-config.js +34 -0
  52. package/dist/study-analysis-codex-config.js.map +1 -0
  53. package/dist/study-analysis-engine.d.ts +6 -3
  54. package/dist/study-analysis-engine.js +19 -10
  55. package/dist/study-analysis-engine.js.map +1 -1
  56. package/dist/study-analysis-job.d.ts +1 -0
  57. package/dist/study-analysis-job.js +1 -1
  58. package/dist/study-analysis-job.js.map +1 -1
  59. package/dist/study-analysis-provider.d.ts +4 -2
  60. package/dist/study-analysis-provider.js +1 -1
  61. package/dist/study-analysis-provider.js.map +1 -1
  62. package/dist/study-analysis-service.d.ts +3 -0
  63. package/dist/study-analysis-service.js +24 -6
  64. package/dist/study-analysis-service.js.map +1 -1
  65. package/dist/study-analysis-validation.d.ts +29 -5
  66. package/dist/study-analysis-validation.js +23 -10
  67. package/dist/study-analysis-validation.js.map +1 -1
  68. package/dist/study-analysis.d.ts +27 -2
  69. package/dist/tui-app.js +102 -102
  70. package/docs/architecture/desktop-sessions.md +80 -0
  71. package/docs/architecture/restricted-codex-analysis.md +89 -0
  72. package/docs/contracts/run-bundle.md +7 -4
  73. package/docs/contracts/schemas.md +1 -1
  74. package/docs/contracts/study-analysis.md +44 -2
  75. package/docs/goals/current.md +4 -4
  76. package/docs/product/automatic-analysis.md +24 -3
  77. package/docs/ramp/README.md +11 -1
  78. package/docs/release/0.96.1-browser-navigation.md +22 -0
  79. package/docs/release/0.97.0-codex-account-analysis.md +45 -0
  80. package/package.json +1 -1
  81. package/skills/humanish/SKILL.md +19 -0
package/dist/program.js CHANGED
@@ -1,4 +1,4 @@
1
- import { automaticAnalysisBudget, formatAutomaticAnalysisBudget, DEFAULT_ANALYSIS_TIMEOUT_MS, DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS } from "./automatic-analysis-config.js";
1
+ import { resolveAutomaticAnalysis, automaticAnalysisBudget, formatAutomaticAnalysisBudget, DEFAULT_ANALYSIS_TIMEOUT_MS } from "./automatic-analysis-config.js";
2
2
  import { automaticAnalysisSucceeded } from "./automatic-analysis-completion.js";
3
3
  import { formatCuaDiagnostics, formatCuaStopCause } from "./cua-diagnostics.js";
4
4
  import { existsSync, readFileSync } from "node:fs";
@@ -1018,31 +1018,46 @@ function analysisSelection(options, command) {
1018
1018
  function registerAnalyzeCommand(parent, io) {
1019
1019
  const analyze = parent.command("analyze")
1020
1020
  .enablePositionalOptions()
1021
- .description("Analyze retained participant evidence into versioned findings. This request sends selected text and captures to OpenAI. Opening Observer never starts analysis.")
1021
+ .description("Analyze retained participant evidence into versioned findings. Selected text and captures go to the chosen remote analyst. Opening Observer never starts analysis.")
1022
1022
  .summary("Generate evidence-linked study findings.")
1023
1023
  .option("--run <id>", "Completed run id or latest pointer.", "latest")
1024
1024
  .option("--cwd <path>", "Target project directory.", ".")
1025
- .option("--max-cost <usd>", "Required, including with --dry-run: admission estimate ceiling in USD; not an exact billing cap.")
1026
- .option("--model <id>", "Supported vision analysis model; analysis uses high reasoning effort.", "gpt-6-astra")
1025
+ .option("--provider <name>", "Analyst: openai (default) or restricted codex account. No provider fallback.")
1026
+ .option("--max-cost <usd>", "Required for OpenAI, including dry-run: USD admission estimate ceiling, not a billing cap. Unsupported for Codex.")
1027
+ .option("--model <id>", "Supported vision model. OpenAI uses high effort; qualified Codex account analysis uses low effort.", "gpt-6-astra")
1027
1028
  .option("--question <text>", "Additional reviewer question; does not change participant instructions.")
1028
1029
  .option("--timeout-ms <ms>", "Request timeout, at most 600000 ms.", String(DEFAULT_ANALYSIS_TIMEOUT_MS))
1029
- .option("--max-output-tokens <n>", "Exact response-token limit including reasoning, 256–32768. Omit to use 32768 when admission permits, otherwise 16384.")
1030
+ .option("--max-output-tokens <n>", "OpenAI response-token limit including reasoning, 256–32768. Omit for admission-based sizing. Unsupported for Codex.")
1030
1031
  .option("--dry-run", "Capture and validate local input and estimate admission; no request or analysis artifact.")
1031
1032
  .option("--rerun", "Create a new immutable version even when the same input and configuration were analyzed.")
1032
1033
  .option("--json", JSON_OPTION_DESCRIPTION)
1033
1034
  .action(async (options, command) => {
1035
+ const selected = resolveAutomaticAnalysis({
1036
+ ...(options.provider === undefined ? {} : { provider: options.provider }), model: options.model,
1037
+ ...(options.question === undefined ? {} : { question: options.question }), timeoutMs: Number(options.timeoutMs),
1038
+ ...(options.provider === "codex" && options.maxCost === undefined ? {} : { maxCostUsd: Number(options.maxCost) }),
1039
+ ...(options.maxOutputTokens === undefined ? {} : { maxOutputTokens: Number(options.maxOutputTokens) })
1040
+ });
1041
+ if (!selected.ok || !selected.config) {
1042
+ const result = { schema: "humanish.analyze-result.v1", ok: false, run: options.run, dryRun: options.dryRun === true,
1043
+ reused: false, warnings: [], error: { code: "ANALYSIS_CONFIG_INVALID", message: selected.ok ? "Analysis is disabled." : selected.message } };
1044
+ writeResult(command, io, result, value => `${value.error.message}\n`);
1045
+ io.setExitCode(2);
1046
+ return;
1047
+ }
1034
1048
  const controller = new AbortController();
1035
1049
  const cancel = () => controller.abort();
1036
1050
  process.once("SIGINT", cancel);
1037
1051
  try {
1038
1052
  const result = await analyzeStudy(options.cwd, options.run, {
1039
- config: { model: options.model, maxCostUsd: Number(options.maxCost), question: options.question ?? null,
1040
- timeoutMs: Number(options.timeoutMs), maxOutputTokens: options.maxOutputTokens === undefined ? DEFAULT_ANALYSIS_MAX_OUTPUT_TOKENS : Number(options.maxOutputTokens) },
1041
- preferLargerOutput: options.maxOutputTokens === undefined,
1053
+ config: selected.config,
1054
+ preferLargerOutput: selected.preferLargerOutput === true,
1042
1055
  ...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),
1043
1056
  ...(options.rerun === undefined ? {} : { rerun: options.rerun })
1044
1057
  }, { signal: controller.signal, onProgress: (progress) => io.writeErr(`Analysis ${progress.phase}: ${progress.evidenceCount} evidence items, ${progress.captureCount} captures.\n`) });
1045
1058
  writeResult(command, io, result, (value) => {
1059
+ if (value.ok && value.dryRun && selected.config?.provider === "codex")
1060
+ return "Local evidence and configuration passed admission. Codex CLI, login and model access were not checked. Dollar cost and output-token ceiling are unknown. No provider request sent.\n";
1046
1061
  if (value.ok && value.dryRun)
1047
1062
  return `Admission estimate: $${value.admission?.estimatedCostUsd ?? "unknown"}; output allowance: ${value.admission?.outputTokenAllowance ?? "unknown"} tokens including reasoning. No request sent.\n`;
1048
1063
  const lines = [];
@@ -1053,7 +1068,7 @@ function registerAnalyzeCommand(parent, io) {
1053
1068
  if (value.executionReceiptPath)
1054
1069
  lines.push(`Execution receipt: ${value.executionReceiptPath}`);
1055
1070
  if (value.usage) {
1056
- lines.push(`Recorded attempt usage: ${value.usage.inputTokens ?? "unknown"} input tokens, ${value.usage.outputTokens ?? "unknown"} output tokens.`);
1071
+ lines.push(`Recorded attempt usage${value.usage.usageComplete ? "" : " (incomplete)"}: ${value.usage.inputTokens ?? "unknown"} input tokens, ${value.usage.outputTokens ?? "unknown"} output tokens.`);
1057
1072
  lines.push(`Estimated attempt cost: ${value.usage.estimatedCostUsd === null ? "unknown" : `$${value.usage.estimatedCostUsd}`}.`);
1058
1073
  }
1059
1074
  if (value.reused)