humanish 0.0.1 → 0.15.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 (196) hide show
  1. package/AGENTS.md +77 -0
  2. package/CONTRIBUTING.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +435 -8
  5. package/SECURITY.md +34 -0
  6. package/dist/actor-contract.d.ts +107 -0
  7. package/dist/actor-contract.js +286 -0
  8. package/dist/actor-contract.js.map +1 -0
  9. package/dist/actor-registry.d.ts +73 -0
  10. package/dist/actor-registry.js +93 -0
  11. package/dist/actor-registry.js.map +1 -0
  12. package/dist/adapter-extension.d.ts +54 -0
  13. package/dist/adapter-extension.js +214 -0
  14. package/dist/adapter-extension.js.map +1 -0
  15. package/dist/argv.d.ts +1 -0
  16. package/dist/argv.js +8 -0
  17. package/dist/argv.js.map +1 -0
  18. package/dist/artifact-reference.d.ts +22 -0
  19. package/dist/artifact-reference.js +47 -0
  20. package/dist/artifact-reference.js.map +1 -0
  21. package/dist/browser-evidence-hygiene.d.ts +7 -0
  22. package/dist/browser-evidence-hygiene.js +40 -0
  23. package/dist/browser-evidence-hygiene.js.map +1 -0
  24. package/dist/claude-agent-sdk.d.ts +94 -0
  25. package/dist/claude-agent-sdk.js +356 -0
  26. package/dist/claude-agent-sdk.js.map +1 -0
  27. package/dist/cli.d.ts +2 -0
  28. package/dist/cli.js +5 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/codex-app-server-ui.d.ts +39 -0
  31. package/dist/codex-app-server-ui.js +327 -0
  32. package/dist/codex-app-server-ui.js.map +1 -0
  33. package/dist/codex-app-server.d.ts +141 -0
  34. package/dist/codex-app-server.js +747 -0
  35. package/dist/codex-app-server.js.map +1 -0
  36. package/dist/command-failure.d.ts +29 -0
  37. package/dist/command-failure.js +54 -0
  38. package/dist/command-failure.js.map +1 -0
  39. package/dist/computer-use-actor.d.ts +52 -0
  40. package/dist/computer-use-actor.js +48 -0
  41. package/dist/computer-use-actor.js.map +1 -0
  42. package/dist/computer-use.d.ts +232 -0
  43. package/dist/computer-use.js +615 -0
  44. package/dist/computer-use.js.map +1 -0
  45. package/dist/concurrency.d.ts +1 -0
  46. package/dist/concurrency.js +27 -0
  47. package/dist/concurrency.js.map +1 -0
  48. package/dist/concurrent-shared-world-lab.d.ts +115 -0
  49. package/dist/concurrent-shared-world-lab.js +1092 -0
  50. package/dist/concurrent-shared-world-lab.js.map +1 -0
  51. package/dist/core/git-state.d.ts +31 -0
  52. package/dist/core/git-state.js +142 -0
  53. package/dist/core/git-state.js.map +1 -0
  54. package/dist/core/index.d.ts +4 -0
  55. package/dist/core/index.js +3 -0
  56. package/dist/core/index.js.map +1 -0
  57. package/dist/core/run-primitives.d.ts +66 -0
  58. package/dist/core/run-primitives.js +120 -0
  59. package/dist/core/run-primitives.js.map +1 -0
  60. package/dist/cua-actor-lab.d.ts +620 -0
  61. package/dist/cua-actor-lab.js +2834 -0
  62. package/dist/cua-actor-lab.js.map +1 -0
  63. package/dist/device-presets.d.ts +67 -0
  64. package/dist/device-presets.js +50 -0
  65. package/dist/device-presets.js.map +1 -0
  66. package/dist/e2b-desktop-executor.d.ts +101 -0
  67. package/dist/e2b-desktop-executor.js +309 -0
  68. package/dist/e2b-desktop-executor.js.map +1 -0
  69. package/dist/e2b-desktop-launch.d.ts +144 -0
  70. package/dist/e2b-desktop-launch.js +59 -0
  71. package/dist/e2b-desktop-launch.js.map +1 -0
  72. package/dist/e2b-detached.d.ts +53 -0
  73. package/dist/e2b-detached.js +130 -0
  74. package/dist/e2b-detached.js.map +1 -0
  75. package/dist/e2b-terminal-lab.d.ts +345 -0
  76. package/dist/e2b-terminal-lab.js +1467 -0
  77. package/dist/e2b-terminal-lab.js.map +1 -0
  78. package/dist/env-file.d.ts +14 -0
  79. package/dist/env-file.js +108 -0
  80. package/dist/env-file.js.map +1 -0
  81. package/dist/feedback.d.ts +51 -0
  82. package/dist/feedback.js +313 -0
  83. package/dist/feedback.js.map +1 -0
  84. package/dist/image-evidence.d.ts +2 -0
  85. package/dist/image-evidence.js +33 -0
  86. package/dist/image-evidence.js.map +1 -0
  87. package/dist/index.d.ts +63 -0
  88. package/dist/index.js +33 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/init-templates.d.ts +12 -0
  91. package/dist/init-templates.js +369 -0
  92. package/dist/init-templates.js.map +1 -0
  93. package/dist/init.d.ts +26 -0
  94. package/dist/init.js +343 -0
  95. package/dist/init.js.map +1 -0
  96. package/dist/lab-app-runner.d.ts +78 -0
  97. package/dist/lab-app-runner.js +403 -0
  98. package/dist/lab-app-runner.js.map +1 -0
  99. package/dist/lab-config.d.ts +578 -0
  100. package/dist/lab-config.js +1751 -0
  101. package/dist/lab-config.js.map +1 -0
  102. package/dist/lab-engine.d.ts +77 -0
  103. package/dist/lab-engine.js +216 -0
  104. package/dist/lab-engine.js.map +1 -0
  105. package/dist/lab-preflight.d.ts +67 -0
  106. package/dist/lab-preflight.js +385 -0
  107. package/dist/lab-preflight.js.map +1 -0
  108. package/dist/labs.d.ts +53 -0
  109. package/dist/labs.js +176 -0
  110. package/dist/labs.js.map +1 -0
  111. package/dist/observer-assets.d.ts +2 -0
  112. package/dist/observer-assets.js +2630 -0
  113. package/dist/observer-assets.js.map +1 -0
  114. package/dist/observer-data.d.ts +63 -0
  115. package/dist/observer-data.js +145 -0
  116. package/dist/observer-data.js.map +1 -0
  117. package/dist/observer-static.d.ts +39 -0
  118. package/dist/observer-static.js +192 -0
  119. package/dist/observer-static.js.map +1 -0
  120. package/dist/observer.d.ts +46 -0
  121. package/dist/observer.js +353 -0
  122. package/dist/observer.js.map +1 -0
  123. package/dist/openai-responses-cu.d.ts +113 -0
  124. package/dist/openai-responses-cu.js +531 -0
  125. package/dist/openai-responses-cu.js.map +1 -0
  126. package/dist/oss-lab.d.ts +52 -0
  127. package/dist/oss-lab.js +299 -0
  128. package/dist/oss-lab.js.map +1 -0
  129. package/dist/oss-meta-lab-scoring.d.ts +15 -0
  130. package/dist/oss-meta-lab-scoring.js +145 -0
  131. package/dist/oss-meta-lab-scoring.js.map +1 -0
  132. package/dist/oss-meta-lab.d.ts +279 -0
  133. package/dist/oss-meta-lab.js +4889 -0
  134. package/dist/oss-meta-lab.js.map +1 -0
  135. package/dist/oss-remote-telemetry.d.ts +77 -0
  136. package/dist/oss-remote-telemetry.js +403 -0
  137. package/dist/oss-remote-telemetry.js.map +1 -0
  138. package/dist/persona.d.ts +35 -0
  139. package/dist/persona.js +133 -0
  140. package/dist/persona.js.map +1 -0
  141. package/dist/pi-agent-core.d.ts +77 -0
  142. package/dist/pi-agent-core.js +203 -0
  143. package/dist/pi-agent-core.js.map +1 -0
  144. package/dist/program.d.ts +54 -0
  145. package/dist/program.js +2347 -0
  146. package/dist/program.js.map +1 -0
  147. package/dist/redaction.d.ts +90 -0
  148. package/dist/redaction.js +292 -0
  149. package/dist/redaction.js.map +1 -0
  150. package/dist/run.d.ts +784 -0
  151. package/dist/run.js +4555 -0
  152. package/dist/run.js.map +1 -0
  153. package/dist/scripted-browser-actor.d.ts +294 -0
  154. package/dist/scripted-browser-actor.js +1286 -0
  155. package/dist/scripted-browser-actor.js.map +1 -0
  156. package/dist/scripted-browser-lab.d.ts +107 -0
  157. package/dist/scripted-browser-lab.js +738 -0
  158. package/dist/scripted-browser-lab.js.map +1 -0
  159. package/dist/shared-world-lab.d.ts +208 -0
  160. package/dist/shared-world-lab.js +1048 -0
  161. package/dist/shared-world-lab.js.map +1 -0
  162. package/dist/source-archive.d.ts +82 -0
  163. package/dist/source-archive.js +365 -0
  164. package/dist/source-archive.js.map +1 -0
  165. package/dist/stop-conditions.d.ts +26 -0
  166. package/dist/stop-conditions.js +66 -0
  167. package/dist/stop-conditions.js.map +1 -0
  168. package/dist/terminal-agent-actor.d.ts +36 -0
  169. package/dist/terminal-agent-actor.js +23 -0
  170. package/dist/terminal-agent-actor.js.map +1 -0
  171. package/docs/architecture/actor-contract.md +431 -0
  172. package/docs/architecture/github-feedback-loop.md +189 -0
  173. package/docs/architecture/local-codex-tui-actor.md +213 -0
  174. package/docs/architecture/observer.md +118 -0
  175. package/docs/architecture/oss-lab-poc.md +242 -0
  176. package/docs/architecture/project-layout.md +166 -0
  177. package/docs/architecture/state-driven-executor.md +203 -0
  178. package/docs/architecture/terminal-product-lane.md +148 -0
  179. package/docs/contracts/adapter-fixtures.md +80 -0
  180. package/docs/contracts/core.md +71 -0
  181. package/docs/contracts/feedback.md +145 -0
  182. package/docs/contracts/policy.md +305 -0
  183. package/docs/contracts/run-bundle.md +358 -0
  184. package/docs/contracts/schemas.md +984 -0
  185. package/docs/goals/current.md +409 -0
  186. package/docs/principles/invariants-and-defaults.md +135 -0
  187. package/docs/principles/self-driving-harness.md +129 -0
  188. package/docs/product/open-source-install-experience.md +229 -0
  189. package/docs/ramp/README.md +200 -0
  190. package/docs/release/open-source-readiness.md +208 -0
  191. package/docs/release/public-readiness-standard.md +205 -0
  192. package/docs/roadmap/world-class-open-source-v0.md +311 -0
  193. package/package.json +102 -8
  194. package/skills/humanish/SKILL.md +244 -0
  195. package/skills/humanish/agents/openai.yaml +7 -0
  196. package/index.js +0 -1
@@ -0,0 +1,327 @@
1
+ import { createServer } from "node:http";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { runCodexAppServerSession } from "./codex-app-server.js";
5
+ export const CODEX_APP_SERVER_UI_SCHEMA = "humanish.codex-app-server-ui.v1";
6
+ export async function startCodexAppServerUi(options) {
7
+ const cwd = path.resolve(options.cwd);
8
+ const runRoot = path.resolve(cwd, options.runRoot);
9
+ const stateFile = path.resolve(cwd, options.stateFile ?? path.join(options.runRoot, "state.json"));
10
+ const publicRunRoot = path.relative(cwd, runRoot) || ".";
11
+ const publicStateFile = path.relative(cwd, stateFile) || path.basename(stateFile);
12
+ await mkdir(runRoot, { recursive: true });
13
+ await mkdir(path.dirname(stateFile), { recursive: true });
14
+ let state = {
15
+ schema: CODEX_APP_SERVER_UI_SCHEMA,
16
+ artifactRoot: publicRunRoot,
17
+ cwd: "[target-cwd]",
18
+ promptDigest: digestText(options.prompt),
19
+ reason: "Codex app-server UI is starting.",
20
+ runRoot: publicRunRoot,
21
+ startedAt: new Date().toISOString(),
22
+ status: "starting",
23
+ stateFile: publicStateFile,
24
+ updatedAt: new Date().toISOString()
25
+ };
26
+ const persistState = async () => {
27
+ await writeFile(stateFile, `${JSON.stringify(state, null, 2)}\n`, "utf8");
28
+ };
29
+ const server = createServer(async (request, response) => {
30
+ if (request.url === "/state") {
31
+ response.writeHead(200, {
32
+ "cache-control": "no-store",
33
+ "content-type": "application/json; charset=utf-8"
34
+ });
35
+ response.end(`${JSON.stringify(state)}\n`);
36
+ return;
37
+ }
38
+ if (request.url?.startsWith("/artifact/")) {
39
+ await serveArtifact({
40
+ cwd,
41
+ requestPath: decodeURIComponent(request.url.slice("/artifact/".length)),
42
+ response,
43
+ runRoot
44
+ });
45
+ return;
46
+ }
47
+ response.writeHead(200, {
48
+ "cache-control": "no-store",
49
+ "content-type": "text/html; charset=utf-8"
50
+ });
51
+ response.end(renderCodexAppServerUiHtml());
52
+ });
53
+ const url = await listen(server, options.port ?? 0);
54
+ state = {
55
+ ...state,
56
+ reason: "Codex app-server actor is running.",
57
+ status: "running",
58
+ updatedAt: new Date().toISOString(),
59
+ url
60
+ };
61
+ await persistState();
62
+ const completion = runCodexAppServerSession({
63
+ cwd,
64
+ prompt: options.prompt,
65
+ runRoot,
66
+ timeoutMs: options.timeoutMs,
67
+ ...(options.actorCommand ? { actorCommand: ["bash", "-lc", options.actorCommand] } : {}),
68
+ approvalPolicy: "never",
69
+ experimentalApi: true,
70
+ ...(options.model === undefined ? {} : { model: options.model }),
71
+ sandbox: options.sandbox ?? "read-only",
72
+ serviceName: options.serviceName ?? "humanish"
73
+ }).then(async (result) => {
74
+ state = {
75
+ ...state,
76
+ reason: result.reason,
77
+ result,
78
+ status: result.status,
79
+ updatedAt: new Date().toISOString()
80
+ };
81
+ await persistState();
82
+ if (options.keepOpen !== true) {
83
+ await closeServer(server);
84
+ }
85
+ return state;
86
+ }).catch(async (error) => {
87
+ state = {
88
+ ...state,
89
+ reason: error instanceof Error ? error.message : String(error),
90
+ status: "blocked",
91
+ updatedAt: new Date().toISOString()
92
+ };
93
+ await persistState();
94
+ if (options.keepOpen !== true) {
95
+ await closeServer(server);
96
+ }
97
+ return state;
98
+ });
99
+ return {
100
+ close: async () => closeServer(server),
101
+ completion,
102
+ initialState: state,
103
+ stateFile,
104
+ url
105
+ };
106
+ }
107
+ async function serveArtifact(args) {
108
+ const safePath = args.requestPath.replace(/^\/+/, "");
109
+ if (!safePath || safePath.includes("..") || safePath.includes("://")) {
110
+ args.response.writeHead(404);
111
+ args.response.end("not found");
112
+ return;
113
+ }
114
+ const absolute = path.resolve(args.runRoot, safePath);
115
+ if (!absolute.startsWith(args.runRoot)) {
116
+ args.response.writeHead(404);
117
+ args.response.end("not found");
118
+ return;
119
+ }
120
+ try {
121
+ const text = await readFile(absolute, "utf8");
122
+ args.response.writeHead(200, {
123
+ "cache-control": "no-store",
124
+ "content-type": contentTypeFor(absolute)
125
+ });
126
+ args.response.end(text);
127
+ }
128
+ catch {
129
+ args.response.writeHead(404);
130
+ args.response.end("not found");
131
+ }
132
+ }
133
+ function contentTypeFor(filePath) {
134
+ if (filePath.endsWith(".json"))
135
+ return "application/json; charset=utf-8";
136
+ if (filePath.endsWith(".ndjson"))
137
+ return "application/x-ndjson; charset=utf-8";
138
+ return "text/plain; charset=utf-8";
139
+ }
140
+ async function listen(server, port) {
141
+ return new Promise((resolve, reject) => {
142
+ server.once("error", reject);
143
+ server.listen(port, "127.0.0.1", () => {
144
+ server.off("error", reject);
145
+ const address = server.address();
146
+ if (!address || typeof address === "string") {
147
+ reject(new Error("Codex app-server UI address was unavailable."));
148
+ return;
149
+ }
150
+ resolve(`http://127.0.0.1:${address.port}/`);
151
+ });
152
+ });
153
+ }
154
+ async function closeServer(server) {
155
+ if (!server.listening) {
156
+ return;
157
+ }
158
+ await new Promise((resolve, reject) => {
159
+ server.close((error) => {
160
+ if (error)
161
+ reject(error);
162
+ else
163
+ resolve();
164
+ });
165
+ });
166
+ }
167
+ function digestText(text) {
168
+ let hash = 0x811c9dc5;
169
+ for (const char of text) {
170
+ hash ^= char.charCodeAt(0);
171
+ hash = Math.imul(hash, 0x01000193);
172
+ }
173
+ return (hash >>> 0).toString(16).padStart(8, "0");
174
+ }
175
+ function renderCodexAppServerUiHtml() {
176
+ return `<!doctype html>
177
+ <html>
178
+ <head>
179
+ <meta charset="utf-8">
180
+ <meta name="viewport" content="width=device-width, initial-scale=1">
181
+ <title>Humanish Codex App-Server</title>
182
+ <style>
183
+ :root {
184
+ --bg: #080a0d;
185
+ --surface: #11151b;
186
+ --surface-2: #171d25;
187
+ --line: rgba(255,255,255,.1);
188
+ --line-2: rgba(255,255,255,.16);
189
+ --text: #eef2f7;
190
+ --muted: #9aa4b2;
191
+ --dim: #687281;
192
+ --accent: #5f82ff;
193
+ --green: #38d890;
194
+ --red: #ff6258;
195
+ --amber: #f2b84a;
196
+ color-scheme: dark;
197
+ font-family: "Geist", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
198
+ }
199
+ * { box-sizing: border-box; }
200
+ body { margin: 0; background: var(--bg); color: var(--text); min-height: 100vh; }
201
+ .shell { min-height: 100vh; display: grid; grid-template-rows: auto 1fr; }
202
+ header { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border-bottom: 1px solid var(--line); background: rgba(17,21,27,.95); position: sticky; top: 0; }
203
+ .mark { width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; border: 1px solid var(--line-2); background: radial-gradient(circle at 25% 20%, rgba(95,130,255,.4), transparent 65%), var(--surface-2); color: #c9d6ff; font-weight: 700; }
204
+ .title { min-width: 0; }
205
+ .title h1 { margin: 0; font-size: 15px; line-height: 1.2; letter-spacing: 0; }
206
+ .title p { margin: 2px 0 0; color: var(--muted); font-size: 12px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 74vw; }
207
+ .pill { margin-left: auto; border: 1px solid var(--line-2); border-radius: 999px; padding: 7px 11px; color: var(--muted); background: var(--surface-2); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; text-transform: uppercase; letter-spacing: .12em; }
208
+ .pill[data-status="passed"] { color: var(--green); border-color: rgba(56,216,144,.35); background: rgba(56,216,144,.12); }
209
+ .pill[data-status="failed"], .pill[data-status="blocked"], .pill[data-status="timed_out"] { color: var(--red); border-color: rgba(255,98,88,.35); background: rgba(255,98,88,.12); }
210
+ main { display: grid; grid-template-columns: 300px 1fr; min-height: 0; }
211
+ aside { border-right: 1px solid var(--line); padding: 14px; background: #0c1015; min-width: 0; }
212
+ section { padding: 14px; min-width: 0; overflow: auto; }
213
+ .label { color: var(--dim); text-transform: uppercase; letter-spacing: .16em; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10px; margin: 16px 0 7px; }
214
+ .kv { display: grid; grid-template-columns: 76px 1fr; gap: 7px; padding: 7px 0; border-bottom: 1px solid var(--line); color: var(--muted); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; }
215
+ .kv b { color: var(--text); font-weight: 500; overflow-wrap: anywhere; }
216
+ .grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin-bottom: 14px; }
217
+ .metric { border: 1px solid var(--line); background: var(--surface); border-radius: 10px; padding: 12px; min-height: 72px; }
218
+ .metric span { color: var(--dim); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; text-transform: uppercase; letter-spacing: .12em; font-size: 10px; }
219
+ .metric strong { display: block; margin-top: 5px; font-size: 22px; }
220
+ .panel { border: 1px solid var(--line); background: var(--surface); border-radius: 12px; margin-bottom: 12px; overflow: hidden; }
221
+ .panel h2 { margin: 0; padding: 11px 12px; font-size: 13px; border-bottom: 1px solid var(--line); }
222
+ .panel pre, .panel .empty { margin: 0; padding: 12px; color: var(--muted); white-space: pre-wrap; overflow-wrap: anywhere; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; line-height: 1.55; max-height: 280px; overflow: auto; }
223
+ .item { padding: 10px 12px; border-bottom: 1px solid var(--line); }
224
+ .item:last-child { border-bottom: none; }
225
+ .item b { display: block; font-size: 12px; margin-bottom: 3px; }
226
+ .item code { color: var(--muted); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; overflow-wrap: anywhere; }
227
+ a { color: #b9c9ff; text-decoration: none; }
228
+ @media (max-width: 860px) {
229
+ main { grid-template-columns: 1fr; }
230
+ aside { border-right: 0; border-bottom: 1px solid var(--line); }
231
+ .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
232
+ }
233
+ </style>
234
+ </head>
235
+ <body>
236
+ <div class="shell">
237
+ <header>
238
+ <div class="mark">CT</div>
239
+ <div class="title">
240
+ <h1>Codex App-Server Actor</h1>
241
+ <p id="subtitle">Connecting to Humanish state...</p>
242
+ </div>
243
+ <div class="pill" id="status" data-status="starting">STARTING</div>
244
+ </header>
245
+ <main>
246
+ <aside>
247
+ <div class="label">Session</div>
248
+ <div class="kv"><span>Status</span><b id="side-status">starting</b></div>
249
+ <div class="kv"><span>Thread</span><b id="thread">pending</b></div>
250
+ <div class="kv"><span>Turn</span><b id="turn">pending</b></div>
251
+ <div class="kv"><span>Model</span><b id="model">pending</b></div>
252
+ <div class="kv"><span>Digest</span><b id="digest">pending</b></div>
253
+ <div class="label">Artifacts</div>
254
+ <div id="artifacts"></div>
255
+ </aside>
256
+ <section>
257
+ <div class="grid" id="metrics"></div>
258
+ <div class="panel"><h2>Latest Agent Message</h2><pre id="message">(waiting)</pre></div>
259
+ <div class="panel"><h2>Reasoning Summary</h2><pre id="reasoning">(waiting)</pre></div>
260
+ <div class="panel"><h2>Commands</h2><div id="commands" class="empty">(waiting)</div></div>
261
+ <div class="panel"><h2>Approvals</h2><div id="approvals" class="empty">(none)</div></div>
262
+ </section>
263
+ </main>
264
+ </div>
265
+ <script>
266
+ function esc(value) {
267
+ return String(value == null ? "" : value).replace(/[&<>"']/g, function(ch) {
268
+ return ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", "\\"": "&quot;", "'": "&#39;" })[ch];
269
+ });
270
+ }
271
+ function latestText(items) {
272
+ if (!Array.isArray(items) || !items.length) return "(waiting)";
273
+ return items[items.length - 1].text || "(empty)";
274
+ }
275
+ function renderItems(items, empty, map) {
276
+ if (!Array.isArray(items) || !items.length) return '<div class="empty">' + esc(empty) + '</div>';
277
+ return items.map(map).join("");
278
+ }
279
+ async function tick() {
280
+ try {
281
+ var response = await fetch("/state", { cache: "no-store" });
282
+ var state = await response.json();
283
+ var trace = state.result && state.result.trace ? state.result.trace : {};
284
+ var counts = trace.counts || {};
285
+ document.getElementById("status").textContent = String(state.status || "unknown").toUpperCase();
286
+ document.getElementById("status").dataset.status = state.status || "unknown";
287
+ document.getElementById("side-status").textContent = state.status || "unknown";
288
+ document.getElementById("subtitle").textContent = state.reason || state.url || "";
289
+ document.getElementById("thread").textContent = trace.threadId || state.result?.threadId || "pending";
290
+ document.getElementById("turn").textContent = trace.turnId || state.result?.turnId || "pending";
291
+ document.getElementById("model").textContent = trace.model || state.result?.model || "pending";
292
+ document.getElementById("digest").textContent = state.promptDigest || "pending";
293
+ var metricDefs = [
294
+ ["Messages", counts.messages || 0],
295
+ ["Reasoning", counts.reasoning || 0],
296
+ ["Commands", counts.commandOutputs || 0],
297
+ ["Envelopes", counts.envelopes || 0]
298
+ ];
299
+ document.getElementById("metrics").innerHTML = metricDefs.map(function(entry) {
300
+ return '<div class="metric"><span>' + esc(entry[0]) + '</span><strong>' + esc(entry[1]) + '</strong></div>';
301
+ }).join("");
302
+ document.getElementById("message").textContent = latestText(trace.messages);
303
+ document.getElementById("reasoning").textContent = latestText(trace.reasoning);
304
+ document.getElementById("commands").innerHTML = renderItems(trace.commands, "(waiting)", function(command) {
305
+ return '<div class="item"><b>' + esc(command.command || "command") + '</b><code>' + esc(command.status || "") + " " + esc(command.outputTail || "") + '</code></div>';
306
+ });
307
+ document.getElementById("approvals").innerHTML = renderItems(trace.approvals, "(none)", function(approval) {
308
+ return '<div class="item"><b>' + esc(approval.method || "approval") + '</b><code>' + esc(approval.decision || "") + " " + esc(approval.reason || "") + '</code></div>';
309
+ });
310
+ var artifacts = [];
311
+ if (state.result?.tracePath) artifacts.push(["Trace", state.result.tracePath]);
312
+ if (state.result?.eventsPath) artifacts.push(["Events", state.result.eventsPath]);
313
+ if (state.result?.transcriptPath) artifacts.push(["Transcript", state.result.transcriptPath]);
314
+ document.getElementById("artifacts").innerHTML = artifacts.length
315
+ ? artifacts.map(function(entry) { return '<div class="item"><b>' + esc(entry[0]) + '</b><code><a href="/artifact/' + encodeURIComponent(entry[1]) + '">' + esc(entry[1]) + '</a></code></div>'; }).join("")
316
+ : '<div class="empty">Artifacts will appear after completion.</div>';
317
+ } catch (error) {
318
+ document.getElementById("subtitle").textContent = "State polling failed: " + error.message;
319
+ }
320
+ }
321
+ tick();
322
+ setInterval(tick, 1000);
323
+ </script>
324
+ </body>
325
+ </html>`;
326
+ }
327
+ //# sourceMappingURL=codex-app-server-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-app-server-ui.js","sourceRoot":"","sources":["../src/codex-app-server-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ export declare const CODEX_APP_SERVER_TRACE_SCHEMA = "humanish.codex-app-server-trace.v1";
2
+ type JsonObject = Record<string, unknown>;
3
+ type JsonRpcId = number | string;
4
+ export type CodexAppServerStatus = "passed" | "failed" | "blocked" | "timed_out";
5
+ export interface CodexAppServerRunOptions {
6
+ cwd: string;
7
+ prompt: string;
8
+ runRoot: string;
9
+ timeoutMs: number;
10
+ actorCommand?: string[];
11
+ approvalPolicy?: "never" | "on-failure" | "on-request" | "untrusted";
12
+ experimentalApi?: boolean;
13
+ model?: string;
14
+ sandbox?: "read-only" | "workspace-write" | "danger-full-access";
15
+ serviceName?: string;
16
+ }
17
+ export interface CodexAppServerRunResult {
18
+ status: CodexAppServerStatus;
19
+ reason: string;
20
+ durationMs: number;
21
+ exitCode?: number;
22
+ signal?: NodeJS.Signals;
23
+ threadId?: string;
24
+ turnId?: string;
25
+ sessionId?: string;
26
+ model?: string;
27
+ codexCliVersion?: string;
28
+ experimentalApi: boolean;
29
+ counts: CodexAppServerTrace["counts"];
30
+ tail: string;
31
+ trace: CodexAppServerTrace;
32
+ transcriptPath: string;
33
+ tracePath: string;
34
+ eventsPath: string;
35
+ }
36
+ export interface CodexAppServerTrace {
37
+ schema: typeof CODEX_APP_SERVER_TRACE_SCHEMA;
38
+ provider: "codex-app-server";
39
+ protocolVersion: "v2";
40
+ redaction: {
41
+ status: "passed";
42
+ notes: string;
43
+ };
44
+ client: {
45
+ name: "humanish_cli";
46
+ title: "Humanish CLI";
47
+ experimentalApi: boolean;
48
+ };
49
+ server: {
50
+ commandName: string;
51
+ codexCliVersion?: string;
52
+ transport: "stdio";
53
+ };
54
+ cwd: string;
55
+ promptDigest: string;
56
+ startedAt: string;
57
+ completedAt: string;
58
+ durationMs: number;
59
+ status: CodexAppServerStatus;
60
+ reason: string;
61
+ threadId?: string;
62
+ turnId?: string;
63
+ sessionId?: string;
64
+ model?: string;
65
+ counts: {
66
+ approvals: number;
67
+ commandOutputs: number;
68
+ envelopes: number;
69
+ errors: number;
70
+ fileChanges: number;
71
+ itemCompletions: number;
72
+ itemStarts: number;
73
+ messages: number;
74
+ reasoning: number;
75
+ requests: number;
76
+ responses: number;
77
+ tools: number;
78
+ warnings: number;
79
+ };
80
+ methods: Record<string, number>;
81
+ items: CodexTraceItem[];
82
+ messages: CodexTraceText[];
83
+ reasoning: CodexTraceText[];
84
+ plans: CodexTracePlan[];
85
+ commands: CodexTraceCommand[];
86
+ fileChanges: CodexTraceFileChange[];
87
+ tools: CodexTraceToolCall[];
88
+ approvals: CodexTraceApproval[];
89
+ warnings: CodexTraceNotice[];
90
+ errors: CodexTraceNotice[];
91
+ tokenUsage?: JsonObject;
92
+ }
93
+ export interface CodexTraceItem {
94
+ id: string;
95
+ type: string;
96
+ status?: string;
97
+ lifecycle: "started" | "completed";
98
+ title: string;
99
+ }
100
+ export interface CodexTraceText {
101
+ itemId: string;
102
+ text: string;
103
+ }
104
+ export interface CodexTracePlan {
105
+ explanation?: string;
106
+ steps: string[];
107
+ }
108
+ export interface CodexTraceCommand {
109
+ itemId: string;
110
+ command?: string;
111
+ cwd?: string;
112
+ status?: string;
113
+ exitCode?: number;
114
+ outputTail?: string;
115
+ }
116
+ export interface CodexTraceFileChange {
117
+ itemId: string;
118
+ status?: string;
119
+ changeCount?: number;
120
+ outputTail?: string;
121
+ }
122
+ export interface CodexTraceToolCall {
123
+ itemId: string;
124
+ kind: "mcp" | "dynamic" | "unknown";
125
+ server?: string;
126
+ tool?: string;
127
+ status?: string;
128
+ }
129
+ export interface CodexTraceApproval {
130
+ id: JsonRpcId;
131
+ method: string;
132
+ itemId?: string;
133
+ decision: "decline" | "denied" | "empty";
134
+ reason: string;
135
+ }
136
+ export interface CodexTraceNotice {
137
+ method: string;
138
+ message: string;
139
+ }
140
+ export declare function runCodexAppServerSession(options: CodexAppServerRunOptions): Promise<CodexAppServerRunResult>;
141
+ export {};