@patze/code-cli 0.10.5 → 0.11.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 (80) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/VERSION +1 -1
  3. package/bin/patze.mjs +0 -0
  4. package/dist/backend/agent-trace.d.ts +14 -0
  5. package/dist/backend/agent-trace.d.ts.map +1 -0
  6. package/dist/backend/agent-trace.js +52 -0
  7. package/dist/backend/agent-trace.js.map +1 -0
  8. package/dist/backend/execute-client.d.ts +51 -0
  9. package/dist/backend/execute-client.d.ts.map +1 -0
  10. package/dist/backend/execute-client.js +140 -0
  11. package/dist/backend/execute-client.js.map +1 -0
  12. package/dist/backend/run-record.d.ts +16 -0
  13. package/dist/backend/run-record.d.ts.map +1 -0
  14. package/dist/backend/run-record.js +43 -0
  15. package/dist/backend/run-record.js.map +1 -0
  16. package/dist/backend/run-stream-client.d.ts +36 -0
  17. package/dist/backend/run-stream-client.d.ts.map +1 -0
  18. package/dist/backend/run-stream-client.js +109 -0
  19. package/dist/backend/run-stream-client.js.map +1 -0
  20. package/dist/backend/session-client.d.ts +17 -0
  21. package/dist/backend/session-client.d.ts.map +1 -0
  22. package/dist/backend/session-client.js +54 -0
  23. package/dist/backend/session-client.js.map +1 -0
  24. package/dist/backend/sse-parse.d.ts +14 -0
  25. package/dist/backend/sse-parse.d.ts.map +1 -0
  26. package/dist/backend/sse-parse.js +63 -0
  27. package/dist/backend/sse-parse.js.map +1 -0
  28. package/dist/cli/commands/status-format.d.ts.map +1 -1
  29. package/dist/cli/commands/status-format.js +11 -0
  30. package/dist/cli/commands/status-format.js.map +1 -1
  31. package/dist/cli/interactive/agent-execute-turn.d.ts +22 -0
  32. package/dist/cli/interactive/agent-execute-turn.d.ts.map +1 -0
  33. package/dist/cli/interactive/agent-execute-turn.js +114 -0
  34. package/dist/cli/interactive/agent-execute-turn.js.map +1 -0
  35. package/dist/cli/interactive/agent-stream-format.d.ts +16 -0
  36. package/dist/cli/interactive/agent-stream-format.d.ts.map +1 -0
  37. package/dist/cli/interactive/agent-stream-format.js +87 -0
  38. package/dist/cli/interactive/agent-stream-format.js.map +1 -0
  39. package/dist/cli/interactive/agent-turn-classify.d.ts +8 -0
  40. package/dist/cli/interactive/agent-turn-classify.d.ts.map +1 -0
  41. package/dist/cli/interactive/agent-turn-classify.js +32 -0
  42. package/dist/cli/interactive/agent-turn-classify.js.map +1 -0
  43. package/dist/cli/interactive/agent-turn-context.d.ts +11 -0
  44. package/dist/cli/interactive/agent-turn-context.d.ts.map +1 -0
  45. package/dist/cli/interactive/agent-turn-context.js +57 -0
  46. package/dist/cli/interactive/agent-turn-context.js.map +1 -0
  47. package/dist/cli/interactive/agent-turn-format.d.ts +11 -0
  48. package/dist/cli/interactive/agent-turn-format.d.ts.map +1 -1
  49. package/dist/cli/interactive/agent-turn-format.js +78 -56
  50. package/dist/cli/interactive/agent-turn-format.js.map +1 -1
  51. package/dist/cli/interactive/agent-turn.d.ts +4 -1
  52. package/dist/cli/interactive/agent-turn.d.ts.map +1 -1
  53. package/dist/cli/interactive/agent-turn.js +76 -5
  54. package/dist/cli/interactive/agent-turn.js.map +1 -1
  55. package/dist/cli/interactive/header.d.ts.map +1 -1
  56. package/dist/cli/interactive/header.js +4 -7
  57. package/dist/cli/interactive/header.js.map +1 -1
  58. package/dist/cli/interactive/line-editor.d.ts.map +1 -1
  59. package/dist/cli/interactive/line-editor.js +18 -9
  60. package/dist/cli/interactive/line-editor.js.map +1 -1
  61. package/dist/cli/interactive/session.d.ts +3 -0
  62. package/dist/cli/interactive/session.d.ts.map +1 -1
  63. package/dist/cli/interactive/session.js +8 -0
  64. package/dist/cli/interactive/session.js.map +1 -1
  65. package/dist/cli/interactive/shell.d.ts.map +1 -1
  66. package/dist/cli/interactive/shell.js +13 -5
  67. package/dist/cli/interactive/shell.js.map +1 -1
  68. package/dist/cli/interactive/slash-dispatch.d.ts +4 -1
  69. package/dist/cli/interactive/slash-dispatch.d.ts.map +1 -1
  70. package/dist/cli/interactive/slash-dispatch.js +22 -7
  71. package/dist/cli/interactive/slash-dispatch.js.map +1 -1
  72. package/dist/cli/interactive/transcript-format.d.ts +3 -0
  73. package/dist/cli/interactive/transcript-format.d.ts.map +1 -0
  74. package/dist/cli/interactive/transcript-format.js +29 -0
  75. package/dist/cli/interactive/transcript-format.js.map +1 -0
  76. package/dist/config/config.d.ts.map +1 -1
  77. package/dist/config/config.js +18 -4
  78. package/dist/config/config.js.map +1 -1
  79. package/docs/known-limitations.md +4 -3
  80. package/package.json +1 -1
@@ -0,0 +1,54 @@
1
+ export async function resolvePatzeCodeSessionUser(input) {
2
+ if (!input.config.api || !input.config.token) {
3
+ return { ok: false, message: "api or token missing", httpStatus: null };
4
+ }
5
+ const fetchImpl = input.fetchImpl ?? fetch;
6
+ const url = new URL("/internal/patze-code/session", input.config.api);
7
+ const controller = new AbortController();
8
+ const timer = setTimeout(() => controller.abort(), input.timeoutMs ?? 8_000);
9
+ try {
10
+ const response = await fetchImpl(url, {
11
+ method: "GET",
12
+ headers: {
13
+ Accept: "application/json",
14
+ "X-Internal-API-Key": input.config.token,
15
+ },
16
+ signal: controller.signal,
17
+ });
18
+ let body;
19
+ try {
20
+ body = await response.json();
21
+ }
22
+ catch {
23
+ return {
24
+ ok: false,
25
+ message: `session returned non-JSON (${response.status})`,
26
+ httpStatus: response.status,
27
+ };
28
+ }
29
+ if (!response.ok) {
30
+ const detail = body && typeof body === "object" && typeof body.detail === "string"
31
+ ? String(body.detail)
32
+ : `session failed (${response.status})`;
33
+ return { ok: false, message: detail, httpStatus: response.status };
34
+ }
35
+ const userId = body && typeof body === "object" && typeof body.user_id === "string"
36
+ ? body.user_id.trim()
37
+ : "";
38
+ if (!userId) {
39
+ return { ok: false, message: "session response missing user_id", httpStatus: response.status };
40
+ }
41
+ const keyLabel = body && typeof body === "object" && typeof body.key_label === "string"
42
+ ? body.key_label
43
+ : undefined;
44
+ return { ok: true, userId, keyLabel };
45
+ }
46
+ catch (error) {
47
+ const message = error instanceof Error ? error.message : "session request failed";
48
+ return { ok: false, message, httpStatus: null };
49
+ }
50
+ finally {
51
+ clearTimeout(timer);
52
+ }
53
+ }
54
+ //# sourceMappingURL=session-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-client.js","sourceRoot":"","sources":["../../src/backend/session-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type SseEvent = {
2
+ event: string;
3
+ data: string;
4
+ };
5
+ export type SseHandlers = {
6
+ onEvent: (event: SseEvent) => void;
7
+ };
8
+ /**
9
+ * Incrementally parse text/event-stream frames from a fetch Response body.
10
+ */
11
+ export declare function consumeSseResponse(response: Response, handlers: SseHandlers, options?: {
12
+ signal?: AbortSignal;
13
+ }): Promise<void>;
14
+ //# sourceMappingURL=sse-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-parse.d.ts","sourceRoot":"","sources":["../../src/backend/sse-parse.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CACnC,CAAA;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GACrC,OAAO,CAAC,IAAI,CAAC,CA4Df"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Incrementally parse text/event-stream frames from a fetch Response body.
3
+ */
4
+ export async function consumeSseResponse(response, handlers, options = {}) {
5
+ if (!response.body) {
6
+ throw new Error("SSE response has no body");
7
+ }
8
+ const reader = response.body.getReader();
9
+ const decoder = new TextDecoder();
10
+ let buffer = "";
11
+ let eventName = "message";
12
+ let dataLines = [];
13
+ const flush = () => {
14
+ if (dataLines.length === 0) {
15
+ eventName = "message";
16
+ return;
17
+ }
18
+ handlers.onEvent({
19
+ event: eventName,
20
+ data: dataLines.join("\n"),
21
+ });
22
+ eventName = "message";
23
+ dataLines = [];
24
+ };
25
+ try {
26
+ while (true) {
27
+ if (options.signal?.aborted) {
28
+ throw new DOMException("Aborted", "AbortError");
29
+ }
30
+ const { done, value } = await reader.read();
31
+ if (done) {
32
+ break;
33
+ }
34
+ buffer += decoder.decode(value, { stream: true });
35
+ let newlineIndex = buffer.indexOf("\n");
36
+ while (newlineIndex >= 0) {
37
+ let line = buffer.slice(0, newlineIndex);
38
+ buffer = buffer.slice(newlineIndex + 1);
39
+ if (line.endsWith("\r")) {
40
+ line = line.slice(0, -1);
41
+ }
42
+ if (line === "") {
43
+ flush();
44
+ }
45
+ else if (line.startsWith(":")) {
46
+ // comment
47
+ }
48
+ else if (line.startsWith("event:")) {
49
+ eventName = line.slice(6).trim() || "message";
50
+ }
51
+ else if (line.startsWith("data:")) {
52
+ dataLines.push(line.slice(5).trimStart());
53
+ }
54
+ newlineIndex = buffer.indexOf("\n");
55
+ }
56
+ }
57
+ flush();
58
+ }
59
+ finally {
60
+ reader.releaseLock();
61
+ }
62
+ }
63
+ //# sourceMappingURL=sse-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-parse.js","sourceRoot":"","sources":["../../src/backend/sse-parse.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAkB,EAClB,QAAqB,EACrB,UAAoC,EAAE;IAEtC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,IAAI,SAAS,GAAG,SAAS,CAAA;IACzB,IAAI,SAAS,GAAa,EAAE,CAAA;IAE5B,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS,GAAG,SAAS,CAAA;YACrB,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC;YACf,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QACF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,EAAE,CAAA;IAChB,CAAC,CAAA;IAED,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC5B,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;YACjD,CAAC;YACD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,IAAI,EAAE,CAAC;gBACT,MAAK;YACP,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YAEjD,IAAI,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACvC,OAAO,YAAY,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;gBACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;gBACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC1B,CAAC;gBAED,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;oBAChB,KAAK,EAAE,CAAA;gBACT,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,UAAU;gBACZ,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACrC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAA;gBAC/C,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;gBAC3C,CAAC;gBAED,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAA;IACT,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAA;IACtB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"status-format.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status-format.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAMpF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,cAAgC,GAAG,cAAc,CAiC9G;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,cAAc,CAAC,CAqBzB"}
1
+ {"version":3,"file":"status-format.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status-format.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAMpF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,cAAgC,GAAG,cAAc,CAiC9G;AAED,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,cAAc,CAAC,CAgCzB"}
@@ -1,4 +1,5 @@
1
1
  import { PatzeBackendClient } from "../../backend/client.js";
2
+ import { resolvePatzeCodeSessionUser } from "../../backend/session-client.js";
2
3
  import { isAuthConfigured } from "../../backend/auth.js";
3
4
  import { loadConfig, maskSecret } from "../../config/config.js";
4
5
  import { resolveApproval } from "../../runtime/approvals.js";
@@ -51,6 +52,16 @@ export async function buildStatusSnapshot(cwd, options = {}) {
51
52
  snapshot.lines.push(`${"check".padEnd(14)} ${probe.ok ? "api reachable" : `failed (${probe.message})`}`);
52
53
  if (!probe.ok) {
53
54
  snapshot.exitCode = 1;
55
+ return snapshot;
56
+ }
57
+ if (!config.userId) {
58
+ const session = await resolvePatzeCodeSessionUser({ config });
59
+ if (session.ok) {
60
+ snapshot.lines.push(`${"user".padEnd(14)} ${session.userId} (from session)`);
61
+ }
62
+ else {
63
+ snapshot.lines.push(`${"session".padEnd(14)} ${session.message}`);
64
+ }
54
65
  }
55
66
  return snapshot;
56
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status-format.js","sourceRoot":"","sources":["../../../src/cli/commands/status-format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status-format.js","sourceRoot":"","sources":["../../../src/cli/commands/status-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { FetchLike } from "../../backend/preview-client.js";
2
+ import type { PatzeCodeRunRecord } from "../../backend/run-record.js";
3
+ import type { ResolvedConfig } from "../../config/config.js";
4
+ export type ExecuteTurnOptions = {
5
+ cwd: string;
6
+ config: ResolvedConfig;
7
+ objective: string;
8
+ previewArtifactDigest: string;
9
+ fetchImpl?: FetchLike;
10
+ onTranscriptLine?: (line: string) => void;
11
+ };
12
+ export type ExecuteTurnResult = {
13
+ ok: boolean;
14
+ streamed: boolean;
15
+ run: PatzeCodeRunRecord | null;
16
+ exitCode: number;
17
+ lines: string[];
18
+ };
19
+ export declare function isCliExecuteEnabled(): boolean;
20
+ export declare function isExecuteAuthReady(config: ResolvedConfig): boolean;
21
+ export declare function runExecuteTurn(options: ExecuteTurnOptions): Promise<ExecuteTurnResult>;
22
+ //# sourceMappingURL=agent-execute-turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-execute-turn.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/agent-execute-turn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAGhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAI5D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,cAAc,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,kBAAkB,GAAG,IAAI,CAAA;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB,CAAA;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAElE;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA0G5F"}
@@ -0,0 +1,114 @@
1
+ import { PatzeBackendClient } from "../../backend/client.js";
2
+ import { postUserTaskExecute } from "../../backend/execute-client.js";
3
+ import { buildPreviewPayload } from "../../backend/preview-payload.js";
4
+ import { streamPatzeCodeRun } from "../../backend/run-stream-client.js";
5
+ import { AgentStreamTranscript } from "./agent-stream-format.js";
6
+ import { formatAgentReply } from "./transcript-format.js";
7
+ export function isCliExecuteEnabled() {
8
+ const raw = process.env.PATZE_CODE_CLI_EXECUTE;
9
+ if (raw === "0" || raw === "false" || raw === "off") {
10
+ return false;
11
+ }
12
+ return true;
13
+ }
14
+ export function isExecuteAuthReady(config) {
15
+ return Boolean(config.api && config.token && config.userId);
16
+ }
17
+ export async function runExecuteTurn(options) {
18
+ const sink = {
19
+ lines: [],
20
+ emit(lines) {
21
+ for (const line of lines) {
22
+ this.lines.push(line);
23
+ options.onTranscriptLine?.(line);
24
+ }
25
+ },
26
+ };
27
+ const client = new PatzeBackendClient(options.config);
28
+ const payload = buildPreviewPayload({
29
+ objective: options.objective,
30
+ cwd: options.cwd,
31
+ config: options.config,
32
+ });
33
+ const transcript = new AgentStreamTranscript(sink);
34
+ transcript.emitRunPhase("queued");
35
+ const execute = await postUserTaskExecute({
36
+ apiBase: client.baseUrl,
37
+ headers: client.buildHeaders(),
38
+ payload,
39
+ previewArtifactDigest: options.previewArtifactDigest,
40
+ fetchImpl: options.fetchImpl,
41
+ });
42
+ if (!execute.ok) {
43
+ const message = execute.kind === "auth"
44
+ ? `${execute.message} — ensure user id is set (/login or /status --check).`
45
+ : execute.message;
46
+ sink.emit(formatAgentReply(`Execute failed: ${message}`));
47
+ return { ok: false, streamed: sink.lines.length > 0, run: null, exitCode: 1, lines: sink.lines };
48
+ }
49
+ if (execute.kind === "completed") {
50
+ transcript.emitRunPhase(execute.response.phase ?? execute.response.status);
51
+ const run = {
52
+ run_id: execute.response.run_id,
53
+ status: execute.response.status,
54
+ phase: execute.response.phase ?? execute.response.status,
55
+ error_code: execute.response.error_code,
56
+ agent_output_preview: execute.response.agent_output_preview ?? "",
57
+ outcome_summary: execute.response.outcome_summary ?? "",
58
+ agent_model: execute.response.agent_model ?? "",
59
+ finding_codes: execute.response.finding_codes,
60
+ deliverable_paths: execute.response.deliverable_paths ?? [],
61
+ agent_trace: execute.response.agent_trace ?? [],
62
+ };
63
+ for (const item of run.agent_trace) {
64
+ transcript.emitTraceItem(item);
65
+ }
66
+ transcript.emitFinalRun(run);
67
+ const ok = run.phase === "completed" || run.status === "completed";
68
+ return {
69
+ ok,
70
+ streamed: sink.lines.length > 0,
71
+ run,
72
+ exitCode: ok ? 0 : 1,
73
+ lines: sink.lines,
74
+ };
75
+ }
76
+ const runId = execute.response.run_id;
77
+ transcript.emitRunPhase(execute.response.phase, execute.response.status);
78
+ const holder = { run: null };
79
+ await new Promise((resolvePromise) => {
80
+ void streamPatzeCodeRun({
81
+ apiBase: client.baseUrl,
82
+ headers: client.buildHeaders(),
83
+ runId,
84
+ fetchImpl: options.fetchImpl,
85
+ handlers: {
86
+ onStatus: (event) => {
87
+ transcript.emitRunPhase(event.phase, event.status);
88
+ },
89
+ onTrace: (event) => {
90
+ transcript.emitTraceItem(event.item);
91
+ },
92
+ onComplete: (run) => {
93
+ holder.run = run;
94
+ transcript.emitFinalRun(run);
95
+ resolvePromise();
96
+ },
97
+ onError: () => {
98
+ resolvePromise();
99
+ },
100
+ },
101
+ });
102
+ });
103
+ const finalRun = holder.run;
104
+ const ok = finalRun !== null &&
105
+ (finalRun.phase === "completed" || finalRun.status === "completed");
106
+ return {
107
+ ok,
108
+ streamed: sink.lines.length > 0,
109
+ run: finalRun,
110
+ exitCode: ok ? 0 : 1,
111
+ lines: sink.lines,
112
+ };
113
+ }
114
+ //# sourceMappingURL=agent-execute-turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-execute-turn.js","sourceRoot":"","sources":["../../../src/cli/interactive/agent-execute-turn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PatzeCodeRunRecord } from "../../backend/run-record.js";
2
+ import { formatTranscriptEntry } from "./transcript-format.js";
3
+ export type StreamTranscriptSink = {
4
+ emit: (lines: string[]) => void;
5
+ };
6
+ export declare class AgentStreamTranscript {
7
+ private readonly sink;
8
+ private readonly seenTraceIds;
9
+ private lastPhase;
10
+ constructor(sink: StreamTranscriptSink);
11
+ emitRunPhase(phase: string, status?: string): void;
12
+ emitTraceItem(item: unknown): void;
13
+ emitFinalRun(run: PatzeCodeRunRecord | null): void;
14
+ }
15
+ export { formatTranscriptEntry };
16
+ //# sourceMappingURL=agent-stream-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-stream-format.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/agent-stream-format.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAErE,OAAO,EAAoB,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEhF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAChC,CAAA;AAED,qBAAa,qBAAqB;IAIpB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,SAAS,CAAK;gBAEO,IAAI,EAAE,oBAAoB;IAEvD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IASlD,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAkClC,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI;CA2BnD;AAwBD,OAAO,EAAE,qBAAqB,EAAE,CAAA"}
@@ -0,0 +1,87 @@
1
+ import { excerptTraceText, isIgnorableStatusTrace, parseAgentTraceItem, } from "../../backend/agent-trace.js";
2
+ import { isTerminalRunPhase, pickRunReplyText } from "../../backend/run-record.js";
3
+ import { formatAgentReply, formatTranscriptEntry } from "./transcript-format.js";
4
+ export class AgentStreamTranscript {
5
+ sink;
6
+ seenTraceIds = new Set();
7
+ lastPhase = "";
8
+ constructor(sink) {
9
+ this.sink = sink;
10
+ }
11
+ emitRunPhase(phase, status) {
12
+ const label = phase || status || "running";
13
+ if (label === this.lastPhase) {
14
+ return;
15
+ }
16
+ this.lastPhase = label;
17
+ this.sink.emit(formatRoleLine("run", `${label}${status && status !== label ? ` · ${status}` : ""}`));
18
+ }
19
+ emitTraceItem(item) {
20
+ const event = parseAgentTraceItem(item);
21
+ if (!event) {
22
+ return;
23
+ }
24
+ if (event.kind === "status" && isIgnorableStatusTrace(event)) {
25
+ return;
26
+ }
27
+ const shouldEmit = event.kind === "tool" ||
28
+ event.kind === "task" ||
29
+ (event.kind === "thinking" && !this.seenTraceIds.has(event.id)) ||
30
+ (event.kind === "text" && event.status === "done") ||
31
+ (event.kind === "status" && !isIgnorableStatusTrace(event));
32
+ if (!shouldEmit) {
33
+ return;
34
+ }
35
+ this.seenTraceIds.add(event.id);
36
+ const role = event.kind === "tool" ? "tool" : event.kind === "status" || event.kind === "task" ? "run" : "agent";
37
+ const text = formatTraceLine(event);
38
+ if (!text) {
39
+ return;
40
+ }
41
+ if (role === "agent") {
42
+ this.sink.emit(formatAgentReply(text));
43
+ return;
44
+ }
45
+ this.sink.emit(formatRoleLine(role, text));
46
+ }
47
+ emitFinalRun(run) {
48
+ if (!run) {
49
+ this.sink.emit(formatAgentReply("Run finished but no record was returned."));
50
+ return;
51
+ }
52
+ if (isTerminalRunPhase(run.phase) && run.phase !== "completed") {
53
+ this.sink.emit(formatAgentReply(pickRunReplyText(run)));
54
+ return;
55
+ }
56
+ const reply = pickRunReplyText(run);
57
+ if (reply) {
58
+ this.sink.emit(formatAgentReply(reply));
59
+ }
60
+ if (run.deliverable_paths.length > 0) {
61
+ this.sink.emit(formatRoleLine("run", `deliverables · ${run.deliverable_paths.slice(0, 3).join(", ")}${run.deliverable_paths.length > 3 ? "…" : ""}`));
62
+ }
63
+ this.sink.emit(formatRoleLine("run", "no auto-apply · review with /diff when a patch is ready"));
64
+ }
65
+ }
66
+ function formatRoleLine(role, text) {
67
+ const label = role.padEnd(7);
68
+ return [`${label}${text}`];
69
+ }
70
+ function formatTraceLine(event) {
71
+ const detail = event.detail?.trim() ?? "";
72
+ if (event.kind === "tool") {
73
+ return detail ? `${event.title} · ${excerptTraceText(detail, 120)}` : event.title;
74
+ }
75
+ if (event.kind === "thinking") {
76
+ return detail ? excerptTraceText(detail, 160) : event.title;
77
+ }
78
+ if (event.kind === "text") {
79
+ return detail ? excerptTraceText(detail, 800) : event.title;
80
+ }
81
+ if (event.kind === "task") {
82
+ return detail ? `${event.title} · ${excerptTraceText(detail, 120)}` : event.title;
83
+ }
84
+ return detail ? `${event.title} · ${excerptTraceText(detail, 120)}` : event.title;
85
+ }
86
+ export { formatTranscriptEntry };
87
+ //# sourceMappingURL=agent-stream-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-stream-format.js","sourceRoot":"","sources":["../../../src/cli/interactive/agent-stream-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type TurnKind = "conversation" | "task";
2
+ /**
3
+ * Decide whether free-text input is a casual/meta message or a coding task.
4
+ * Conversational turns skip server preview and return a short reply instead.
5
+ */
6
+ export declare function classifyTurnInput(text: string): TurnKind;
7
+ export declare function inputLooksThai(text: string): boolean;
8
+ //# sourceMappingURL=agent-turn-classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn-classify.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/agent-turn-classify.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,MAAM,CAAA;AAE9C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAqCxD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Decide whether free-text input is a casual/meta message or a coding task.
3
+ * Conversational turns skip server preview and return a short reply instead.
4
+ */
5
+ export function classifyTurnInput(text) {
6
+ const trimmed = text.trim();
7
+ if (!trimmed) {
8
+ return "conversation";
9
+ }
10
+ const hasCodeIntent = /\b(file|files|code|function|class|module|bug|error|test|tests|api|refactor|implement|fix|add|create|build|write|remove|migrate|debug|patch|diff|lint|deploy|readme|config)\b/i.test(trimmed) || /[{}();=`]/.test(trimmed);
11
+ const taskLead = /^(fix|add|refactor|implement|update|create|build|write|remove|migrate|test|debug|improve|review|rename|extract|optimize)\b/i.test(trimmed);
12
+ if (taskLead || (hasCodeIntent && trimmed.length > 24)) {
13
+ return "task";
14
+ }
15
+ const conversational = /^(hi|hello|hey|thanks|thank you|ok|okay|yes|no|help)\b/i.test(trimmed) ||
16
+ /^(do you|can you|are you|what is|what's|how do)/i.test(trimmed) ||
17
+ /[\??]/.test(trimmed) ||
18
+ /(ไหม|มั้ย|หรือเปล่า|ได้ไหม)/.test(trimmed) ||
19
+ /(เห็น|ได้ยิน|ข้อความ|สวัสดี|ช่วย.*ไหม|พิมพ์)/.test(trimmed) ||
20
+ /(do you see|can you see|hear me)/i.test(trimmed);
21
+ if (conversational && !hasCodeIntent) {
22
+ return "conversation";
23
+ }
24
+ if (trimmed.length <= 48 && !hasCodeIntent && !taskLead) {
25
+ return "conversation";
26
+ }
27
+ return "task";
28
+ }
29
+ export function inputLooksThai(text) {
30
+ return /[\u0E00-\u0E7F]/.test(text);
31
+ }
32
+ //# sourceMappingURL=agent-turn-classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn-classify.js","sourceRoot":"","sources":["../../../src/cli/interactive/agent-turn-classify.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,MAAM,aAAa,GACjB,+KAA+K,CAAC,IAAI,CAClL,OAAO,CACR,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEhC,MAAM,QAAQ,GACZ,6HAA6H,CAAC,IAAI,CAChI,OAAO,CACR,CAAA;IAEH,IAAI,QAAQ,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAA;IACf,CAAC;IAED,MAAM,cAAc,GAClB,yDAAyD,CAAC,IAAI,CAAC,OAAO,CAAC;QACvE,kDAAkD,CAAC,IAAI,CAAC,OAAO,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACrB,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC;QAC3C,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC;QAC5D,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEnD,IAAI,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxD,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACrC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { WorkspaceInspectResult } from "../../runtime/inspect.js";
2
+ export type ContextTurnInput = {
3
+ text: string;
4
+ cwd: string;
5
+ workspaceRoot: string;
6
+ inspect: WorkspaceInspectResult;
7
+ authReady: boolean;
8
+ };
9
+ /** Local, read-only answers from workspace inspect — no canned deflection. */
10
+ export declare function buildContextualReply(input: ContextTurnInput): string | null;
11
+ //# sourceMappingURL=agent-turn-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn-context.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/agent-turn-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAGtE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,sBAAsB,CAAA;IAC/B,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAyBD,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CA0C3E"}
@@ -0,0 +1,57 @@
1
+ import { inputLooksThai } from "./agent-turn-classify.js";
2
+ function thai(text) {
3
+ return inputLooksThai(text);
4
+ }
5
+ function asksWorkspaceLocation(text) {
6
+ return (/(folder|directory|cwd|pwd|working dir|current dir|where am i|which folder|what folder|current workspace)/i.test(text) ||
7
+ /(โฟลเดอ|ไดเรก|อยู่ใน|ที่ไหน|working directory)/i.test(text));
8
+ }
9
+ function asksWorkspaceContents(text) {
10
+ const hasFileCue = /(ไฟล์|files?|empty|blank|ว่าง)/i.test(text);
11
+ const hasCountCue = /(have|any|count|scan|inspect|มี|กี่|ว่าง|อะไร|บ้าง)/i.test(text);
12
+ return hasFileCue && hasCountCue;
13
+ }
14
+ function asksAuthStatus(text) {
15
+ return /(auth|login|logged in|เชื่อม|ล็อกอิน|token)/i.test(text);
16
+ }
17
+ /** Local, read-only answers from workspace inspect — no canned deflection. */
18
+ export function buildContextualReply(input) {
19
+ const { text, cwd, workspaceRoot, inspect, authReady } = input;
20
+ const isThai = thai(text);
21
+ if (asksWorkspaceContents(text)) {
22
+ const summary = isThai
23
+ ? `workspace นี้มี ${inspect.fileCount} ไฟล์ · ${inspect.directoryCount} โฟลเดอร์`
24
+ : `This workspace has ${inspect.fileCount} files and ${inspect.directoryCount} directories.`;
25
+ if (inspect.fileCount === 0 && inspect.directoryCount === 0) {
26
+ return isThai
27
+ ? `${summary} — โฟลเดอร์ว่างครับ พิมพ์งาน coding หรือ /inspect ได้`
28
+ : `${summary} — folder is empty. Describe a coding task or run /inspect.`;
29
+ }
30
+ if (inspect.samplePaths.length > 0) {
31
+ const sample = inspect.samplePaths.slice(0, 3).join(", ");
32
+ return `${summary}\n${isThai ? "ตัวอย่าง" : "sample"}: ${sample}`;
33
+ }
34
+ return summary;
35
+ }
36
+ if (asksWorkspaceLocation(text)) {
37
+ if (cwd === workspaceRoot) {
38
+ return isThai
39
+ ? `ตอนนี้อยู่ที่ ${workspaceRoot} (workspace root · cwd เดียวกัน)`
40
+ : `You are in ${workspaceRoot} (workspace root and cwd).`;
41
+ }
42
+ return isThai
43
+ ? `cwd: ${cwd}\nworkspace root: ${workspaceRoot}`
44
+ : `cwd: ${cwd}\nworkspace root: ${workspaceRoot}`;
45
+ }
46
+ if (asksAuthStatus(text)) {
47
+ return isThai
48
+ ? authReady
49
+ ? "auth พร้อมแล้ว — preview จาก server ใช้ได้ (ยัง read-only · ไม่ auto-apply)"
50
+ : "auth ยังไม่ครบ — ใช้ /login หรือ PATZE_CODE_* แล้ว /status --check"
51
+ : authReady
52
+ ? "Auth is ready — server preview works (read-only · no auto-apply)."
53
+ : "Auth incomplete — run /login or set PATZE_CODE_* then /status --check.";
54
+ }
55
+ return null;
56
+ }
57
+ //# sourceMappingURL=agent-turn-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn-context.js","sourceRoot":"","sources":["../../../src/cli/interactive/agent-turn-context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAUzD,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,CACL,2GAA2G,CAAC,IAAI,CAC9G,IAAI,CACL;QACD,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7D,CAAA;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,MAAM,WAAW,GAAG,sDAAsD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrF,OAAO,UAAU,IAAI,WAAW,CAAA;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,8CAA8C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAClE,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,KAAuB;IAC1D,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IAEzB,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM;YACpB,CAAC,CAAC,mBAAmB,OAAO,CAAC,SAAS,WAAW,OAAO,CAAC,cAAc,WAAW;YAClF,CAAC,CAAC,sBAAsB,OAAO,CAAC,SAAS,cAAc,OAAO,CAAC,cAAc,eAAe,CAAA;QAC9F,IAAI,OAAO,CAAC,SAAS,KAAK,CAAC,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,MAAM;gBACX,CAAC,CAAC,GAAG,OAAO,uDAAuD;gBACnE,CAAC,CAAC,GAAG,OAAO,6DAA6D,CAAA;QAC7E,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,OAAO,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAA;QACnE,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YAC1B,OAAO,MAAM;gBACX,CAAC,CAAC,iBAAiB,aAAa,kCAAkC;gBAClE,CAAC,CAAC,cAAc,aAAa,4BAA4B,CAAA;QAC7D,CAAC;QACD,OAAO,MAAM;YACX,CAAC,CAAC,QAAQ,GAAG,qBAAqB,aAAa,EAAE;YACjD,CAAC,CAAC,QAAQ,GAAG,qBAAqB,aAAa,EAAE,CAAA;IACrD,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM;YACX,CAAC,CAAC,SAAS;gBACT,CAAC,CAAC,6EAA6E;gBAC/E,CAAC,CAAC,oEAAoE;YACxE,CAAC,CAAC,SAAS;gBACT,CAAC,CAAC,mEAAmE;gBACrE,CAAC,CAAC,wEAAwE,CAAA;IAChF,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -11,5 +11,16 @@ export type AgentTurnModel = {
11
11
  authReady: boolean;
12
12
  mutationsEnabled: false;
13
13
  };
14
+ export type ConversationTurnContext = {
15
+ authReady: boolean;
16
+ permissionMode: string;
17
+ permissionLabel: string;
18
+ };
19
+ /** Short reply for meta/chat prompts — uses local context when available. */
20
+ export declare function formatConversationTurnLines(objective: string, reply: string): string[];
21
+ export declare function resolveConversationReply(objective: string, context: ConversationTurnContext, contextualReply: string | null): string;
22
+ /** Compact task turn — agent voice, one screen. Details live in /context. */
14
23
  export declare function formatAgentTurnLines(model: AgentTurnModel): string[];
24
+ /** Verbose formatter kept for /context and tests that need full preview fields. */
25
+ export declare function formatAgentTurnVerboseLines(model: AgentTurnModel): string[];
15
26
  //# sourceMappingURL=agent-turn-format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-turn-format.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/agent-turn-format.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAE7D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC9B,aAAa,EAAE,mBAAmB,CAAA;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE,KAAK,CAAA;CACxB,CAAA;AAiBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CA2CpE"}
1
+ {"version":3,"file":"agent-turn-format.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/agent-turn-format.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAI7D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC9B,aAAa,EAAE,mBAAmB,CAAA;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE,KAAK,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,MAAM,EAAE,CAEV;AA6BD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,uBAAuB,EAChC,eAAe,EAAE,MAAM,GAAG,IAAI,GAC7B,MAAM,CAKR;AAED,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CA0CpE;AAED,mFAAmF;AACnF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAY3E"}