@usine/agents 0.3.0 → 0.5.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 (114) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +100 -30
  3. package/dist/child-host/child-host.d.ts +90 -0
  4. package/dist/child-host/child-host.d.ts.map +1 -0
  5. package/dist/child-host/child-host.js +119 -0
  6. package/dist/child-host/child-host.js.map +1 -0
  7. package/dist/child-host/command.d.ts +22 -0
  8. package/dist/child-host/command.d.ts.map +1 -0
  9. package/dist/child-host/command.js +43 -0
  10. package/dist/child-host/command.js.map +1 -0
  11. package/dist/openai-prices.d.ts +8 -0
  12. package/dist/openai-prices.d.ts.map +1 -0
  13. package/dist/openai-prices.js +28 -0
  14. package/dist/openai-prices.js.map +1 -0
  15. package/dist/pi/authentication.d.ts +11 -2
  16. package/dist/pi/authentication.d.ts.map +1 -1
  17. package/dist/pi/authentication.js +15 -2
  18. package/dist/pi/authentication.js.map +1 -1
  19. package/dist/pi/children.d.ts +1 -4
  20. package/dist/pi/children.d.ts.map +1 -1
  21. package/dist/pi/children.js +1 -4
  22. package/dist/pi/children.js.map +1 -1
  23. package/dist/pi/claude/claude.d.ts +10 -0
  24. package/dist/pi/claude/claude.d.ts.map +1 -0
  25. package/dist/pi/claude/claude.js +610 -0
  26. package/dist/pi/claude/claude.js.map +1 -0
  27. package/dist/pi/claude/codec.d.ts +67 -0
  28. package/dist/pi/claude/codec.d.ts.map +1 -0
  29. package/dist/pi/claude/codec.js +140 -0
  30. package/dist/pi/claude/codec.js.map +1 -0
  31. package/dist/pi/{claude.d.ts → claude/sdk.d.ts} +11 -10
  32. package/dist/pi/claude/sdk.d.ts.map +1 -0
  33. package/dist/pi/claude/sdk.js +63 -0
  34. package/dist/pi/claude/sdk.js.map +1 -0
  35. package/dist/pi/codex/account.d.ts +11 -5
  36. package/dist/pi/codex/account.d.ts.map +1 -1
  37. package/dist/pi/codex/account.js +23 -6
  38. package/dist/pi/codex/account.js.map +1 -1
  39. package/dist/pi/codex/app-server.d.ts +19 -7
  40. package/dist/pi/codex/app-server.d.ts.map +1 -1
  41. package/dist/pi/codex/app-server.js +41 -36
  42. package/dist/pi/codex/app-server.js.map +1 -1
  43. package/dist/pi/codex/codec.d.ts +10 -84
  44. package/dist/pi/codex/codec.d.ts.map +1 -1
  45. package/dist/pi/codex/codec.js +18 -80
  46. package/dist/pi/codex/codec.js.map +1 -1
  47. package/dist/pi/codex/codex.d.ts +0 -1
  48. package/dist/pi/codex/codex.d.ts.map +1 -1
  49. package/dist/pi/codex/codex.js +89 -18
  50. package/dist/pi/codex/codex.js.map +1 -1
  51. package/dist/pi/conversation.d.ts +33 -12
  52. package/dist/pi/conversation.d.ts.map +1 -1
  53. package/dist/pi/conversation.js +58 -18
  54. package/dist/pi/conversation.js.map +1 -1
  55. package/dist/pi/pi.d.ts +1 -4
  56. package/dist/pi/pi.d.ts.map +1 -1
  57. package/dist/pi/pi.js +29 -175
  58. package/dist/pi/pi.js.map +1 -1
  59. package/dist/pi/sdk.d.ts +18 -15
  60. package/dist/pi/sdk.d.ts.map +1 -1
  61. package/dist/pi/sdk.js +45 -55
  62. package/dist/pi/sdk.js.map +1 -1
  63. package/dist/pi/session.d.ts +13 -14
  64. package/dist/pi/session.d.ts.map +1 -1
  65. package/dist/pi/session.js +63 -24
  66. package/dist/pi/session.js.map +1 -1
  67. package/dist/pi/turns.d.ts +7 -7
  68. package/dist/pi/turns.d.ts.map +1 -1
  69. package/dist/pi/turns.js +22 -9
  70. package/dist/pi/turns.js.map +1 -1
  71. package/dist/pi/usage.d.ts +36 -22
  72. package/dist/pi/usage.d.ts.map +1 -1
  73. package/dist/pi/usage.js +79 -33
  74. package/dist/pi/usage.js.map +1 -1
  75. package/dist/preflight/command.d.ts +16 -4
  76. package/dist/preflight/command.d.ts.map +1 -1
  77. package/dist/preflight/command.js +29 -27
  78. package/dist/preflight/command.js.map +1 -1
  79. package/dist/preflight/preflight.d.ts +19 -7
  80. package/dist/preflight/preflight.d.ts.map +1 -1
  81. package/dist/preflight/preflight.js +73 -32
  82. package/dist/preflight/preflight.js.map +1 -1
  83. package/dist/prompt.d.ts +12 -9
  84. package/dist/prompt.d.ts.map +1 -1
  85. package/dist/prompt.js +33 -4
  86. package/dist/prompt.js.map +1 -1
  87. package/dist/protocol/codex.d.ts +122 -7
  88. package/dist/protocol/codex.d.ts.map +1 -1
  89. package/dist/protocol/codex.js +109 -1
  90. package/dist/protocol/codex.js.map +1 -1
  91. package/dist/protocol/count.d.ts +4 -0
  92. package/dist/protocol/count.d.ts.map +1 -0
  93. package/dist/protocol/count.js +4 -0
  94. package/dist/protocol/count.js.map +1 -0
  95. package/dist/runtime.d.ts +110 -55
  96. package/dist/runtime.d.ts.map +1 -1
  97. package/dist/runtime.js +114 -27
  98. package/dist/runtime.js.map +1 -1
  99. package/package.json +35 -19
  100. package/dist/pi/claude.d.ts.map +0 -1
  101. package/dist/pi/claude.js +0 -302
  102. package/dist/pi/claude.js.map +0 -1
  103. package/dist/pi/live.d.ts +0 -4
  104. package/dist/pi/live.d.ts.map +0 -1
  105. package/dist/pi/live.js +0 -11
  106. package/dist/pi/live.js.map +0 -1
  107. package/dist/pi/subagents.d.ts +0 -29
  108. package/dist/pi/subagents.d.ts.map +0 -1
  109. package/dist/pi/subagents.js +0 -120
  110. package/dist/pi/subagents.js.map +0 -1
  111. package/dist/pi/thinking.d.ts +0 -8
  112. package/dist/pi/thinking.d.ts.map +0 -1
  113. package/dist/pi/thinking.js +0 -15
  114. package/dist/pi/thinking.js.map +0 -1
package/dist/pi/usage.js CHANGED
@@ -1,29 +1,47 @@
1
- import { TokenCount } from "@usine/core/agent/session";
2
- import { Option, Schema } from "effect";
3
- const Count = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
1
+ import { TokenBreakdown, TokenCount, UsdAmount } from "@usine/core/agent/session";
2
+ import { flow, Option, Schema } from "effect";
3
+ import { UsageCount } from "../protocol/count.js";
4
+ const Dollars = Schema.Finite.check(Schema.isGreaterThanOrEqualTo(0));
4
5
  const PiUsage = Schema.Struct({
5
6
  role: Schema.Literal("assistant"),
6
- usage: Schema.Struct({ totalTokens: Count }),
7
+ usage: Schema.Struct({
8
+ input: UsageCount,
9
+ output: UsageCount,
10
+ cacheWrite: UsageCount,
11
+ cost: Schema.optionalKey(Schema.Struct({ total: Dollars })),
12
+ }),
13
+ });
14
+ /**
15
+ * Returns the usage of one completed Pi assistant message: output plus uncached input, where cache
16
+ * writes count and cache reads do not, and the dollar cost if Pi reports one.
17
+ */
18
+ export const piMessageUsage = flow(Schema.decodeUnknownOption(PiUsage), Option.map(({ usage }) => ({
19
+ totalTokens: TokenCount.make(usage.output + usage.input + usage.cacheWrite),
20
+ costUsd: Option.map(Option.fromNullishOr(usage.cost), ({ total }) => UsdAmount.make(total)),
21
+ })));
22
+ /** Adds a message's usage to a session total; the cost is `Some` once any message has a cost. */
23
+ export const addUsage = (total, message) => ({
24
+ totalTokens: TokenCount.make(total.totalTokens + message.totalTokens),
25
+ costUsd: Option.isNone(message.costUsd)
26
+ ? total.costUsd
27
+ : Option.some(UsdAmount.make(Option.getOrElse(total.costUsd, () => 0) + message.costUsd.value)),
7
28
  });
8
- /** Pi assistant usage is per completed message, including cache tokens. */
9
- export const piMessageTokens = Schema.decodeUnknownOption(PiUsage);
10
29
  const ClaudeAssistantUsage = Schema.Struct({
11
30
  type: Schema.Literal("assistant"),
12
31
  message: Schema.Struct({
13
32
  id: Schema.NonEmptyString,
14
33
  usage: Schema.Struct({
15
- input_tokens: Count,
16
- output_tokens: Count,
17
- cache_read_input_tokens: Schema.optionalKey(Schema.NullOr(Count)),
18
- cache_creation_input_tokens: Schema.optionalKey(Schema.NullOr(Count)),
34
+ input_tokens: UsageCount,
35
+ output_tokens: UsageCount,
36
+ cache_creation_input_tokens: Schema.optionalKey(Schema.NullOr(UsageCount)),
19
37
  }),
20
38
  }),
21
39
  });
22
40
  const ClaudeModelUsage = Schema.Struct({
23
- inputTokens: Count,
24
- outputTokens: Count,
25
- cacheReadInputTokens: Count,
26
- cacheCreationInputTokens: Count,
41
+ inputTokens: UsageCount,
42
+ outputTokens: UsageCount,
43
+ cacheCreationInputTokens: UsageCount,
44
+ costUSD: Schema.optionalKey(Dollars),
27
45
  });
28
46
  const ClaudeResultUsage = Schema.Struct({
29
47
  type: Schema.Literal("result"),
@@ -31,42 +49,70 @@ const ClaudeResultUsage = Schema.Struct({
31
49
  });
32
50
  const decodeAssistant = Schema.decodeUnknownOption(ClaudeAssistantUsage);
33
51
  const decodeResult = Schema.decodeUnknownOption(ClaudeResultUsage);
34
- /** Tracks Claude's live message usage and reconciles its cumulative query meter at each result.
35
- * Repeated blocks with the same message id count only their additional tokens.
36
- * The SDK's result.usage is per-turn and excludes auxiliary work; modelUsage
37
- * includes that work and stays cumulative across streaming-input turns.
52
+ /**
53
+ * Returns a Claude token meter: live message usage between results, reconciled with the cumulative
54
+ * `modelUsage` at each result. Consumption is output plus input plus cache creation, because the
55
+ * SDK's input counts exclude cache reads and writes; repeated blocks with one message ID count only
56
+ * their added tokens. The cost is the SDK's `costUSD` estimate and changes only at a result.
38
57
  */
39
58
  export const claudeTokenMeter = () => {
40
59
  let total = 0;
60
+ let cost = Option.none();
41
61
  const messages = new Map();
42
62
  return (message) => {
43
63
  const assistant = decodeAssistant(message);
44
64
  if (Option.isSome(assistant)) {
45
65
  const { id, usage } = assistant.value.message;
46
- const consumed = usage.input_tokens +
47
- usage.output_tokens +
48
- (usage.cache_read_input_tokens ?? 0) +
49
- (usage.cache_creation_input_tokens ?? 0);
66
+ const consumed = usage.output_tokens + usage.input_tokens + (usage.cache_creation_input_tokens ?? 0);
50
67
  const previous = messages.get(id) ?? 0;
51
68
  total += Math.max(0, consumed - previous);
52
69
  messages.set(id, Math.max(previous, consumed));
53
- return Option.some(TokenCount.make(total));
70
+ return Option.some({ totalTokens: TokenCount.make(total), costUsd: cost });
54
71
  }
55
72
  const result = decodeResult(message);
56
73
  if (Option.isNone(result))
57
74
  return Option.none();
58
- const consumed = Object.values(result.value.modelUsage).reduce((sum, usage) => sum +
59
- usage.inputTokens +
60
- usage.outputTokens +
61
- usage.cacheReadInputTokens +
62
- usage.cacheCreationInputTokens, 0);
75
+ const models = Object.values(result.value.modelUsage);
76
+ const consumed = models.reduce((sum, usage) => sum + usage.outputTokens + usage.inputTokens + usage.cacheCreationInputTokens, 0);
63
77
  total = Math.max(total, consumed);
64
- return Option.some(TokenCount.make(total));
78
+ const priced = models.flatMap(({ costUSD }) => (costUSD === undefined ? [] : [costUSD]));
79
+ if (priced.length > 0)
80
+ cost = Option.some(UsdAmount.make(priced.reduce((sum, value) => sum + value, 0)));
81
+ return Option.some({ totalTokens: TokenCount.make(total), costUsd: cost });
82
+ };
83
+ };
84
+ const NO_USAGE = { totalTokens: TokenCount.make(0), costUsd: Option.none() };
85
+ /**
86
+ * Returns a Claude token meter for a session that another process can resume. `read` returns the
87
+ * session's usage: the current process's, as `claudeTokenMeter` reads it, plus the earlier
88
+ * processes'. `restart` starts on a new process, which Claude counts from zero.
89
+ */
90
+ export const claudeSessionMeter = () => {
91
+ let earlier = NO_USAGE;
92
+ let current = NO_USAGE;
93
+ let meter = claudeTokenMeter();
94
+ return {
95
+ read: (message) => Option.map(meter(message), (usage) => {
96
+ current = usage;
97
+ return addUsage(earlier, usage);
98
+ }),
99
+ restart: () => {
100
+ earlier = addUsage(earlier, current);
101
+ current = NO_USAGE;
102
+ meter = claudeTokenMeter();
103
+ },
65
104
  };
66
105
  };
67
- /** Codex's thread meter is cumulative across turns on the same thread. */
68
- export const CodexTokenUsage = Schema.Struct({
69
- threadId: Schema.NonEmptyString,
70
- tokenUsage: Schema.Struct({ total: Schema.Struct({ totalTokens: TokenCount }) }),
106
+ /**
107
+ * Returns a Codex thread's consumption: output plus uncached input. The thread's `totalTokens` counts
108
+ * the whole context on every turn, so it is not used.
109
+ */
110
+ export const codexThreadTokens = (total) => TokenCount.make(total.outputTokens + Math.max(0, total.inputTokens - total.cachedInputTokens));
111
+ /** Returns a Codex thread's tokens per billing rate. */
112
+ export const codexTokenBreakdown = (total) => new TokenBreakdown({
113
+ input: Math.max(0, total.inputTokens - total.cachedInputTokens - total.cacheWriteInputTokens),
114
+ cachedInput: total.cachedInputTokens,
115
+ cacheWrite: total.cacheWriteInputTokens,
116
+ output: total.outputTokens,
71
117
  });
72
118
  //# sourceMappingURL=usage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/pi/usage.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,19 @@
1
- import { HarnessUnavailableError } from "@usine/core/agent/capability";
1
+ import type { Harness } from "@usine/core/agent/brain";
2
+ import { HarnessUnavailableError, type HarnessCapability } from "@usine/core/agent/capability";
2
3
  import { Effect } from "effect";
3
- import { ChildProcessSpawner } from "effect/unstable/process";
4
+ import { type ChildHost } from "../child-host/child-host.ts";
4
5
  import { SessionOperationError } from "../runtime.ts";
5
- /** Runs a bounded readiness command without retaining its potentially sensitive diagnostics. */
6
- export declare const probeCommand: (harness: "claude" | "codex" | "pi", capability: "binary" | "login" | "version", command: string, args: readonly string[]) => Effect.Effect<string, HarnessUnavailableError | SessionOperationError, ChildProcessSpawner.ChildProcessSpawner>;
6
+ /** Returns the error for a readiness command that exited non-zero; the message includes the command but not its output. */
7
+ export declare const probeFailed: (harness: Harness, capability: HarnessCapability, command: string, args: ReadonlyArray<string>) => HarnessUnavailableError;
8
+ /**
9
+ * Runs a readiness command on `host` with a 30-second timeout and returns its trimmed stdout and
10
+ * exit code; stderr is discarded. If the remote host is unreachable or the command times out, fails
11
+ * with `SessionOperationError`.
12
+ */
13
+ export declare const probeOutput: (host: import("../child-host/child-host.ts").LocalProcess | import("../child-host/child-host.ts").RemoteShell, environment: Readonly<Record<string, string>>, harness: "claude" | "codex" | "pi", capability: "binary" | "login" | "version", command: string, args: readonly string[]) => Effect.Effect<{
14
+ stdout: string;
15
+ exitCode: import("effect/process/ChildProcessSpawner").ExitCode;
16
+ }, HarnessUnavailableError | SessionOperationError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
17
+ /** Runs a readiness command and returns its trimmed stdout. Fails with `HarnessUnavailableError` if the command exits non-zero. */
18
+ export declare const probeCommand: (host: ChildHost, environment: Readonly<Record<string, string>>, harness: Harness, capability: HarnessCapability, command: string, args: ReadonlyArray<string>) => Effect.Effect<string, HarnessUnavailableError | SessionOperationError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
7
19
  //# sourceMappingURL=command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/preflight/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,gGAAgG;AAChG,eAAO,MAAM,YAAY,+OAmDvB,CAAC"}
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/preflight/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,KAAK,SAAS,EAAe,MAAM,6BAA6B,CAAC;AAE1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,2HAA2H;AAC3H,eAAO,MAAM,WAAW,YACb,OAAO,cACJ,iBAAiB,WACpB,MAAM,QACT,aAAa,CAAC,MAAM,CAAC,4BAMzB,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;qHAuCtB,CAAC;AAEH,mIAAmI;AACnI,eAAO,MAAM,YAAY,SACjB,SAAS,eACF,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,WACpC,OAAO,cACJ,iBAAiB,WACpB,MAAM,QACT,aAAa,CAAC,MAAM,CAAC,6IAQ1B,CAAC"}
@@ -1,35 +1,33 @@
1
1
  import { HarnessUnavailableError } from "@usine/core/agent/capability";
2
- import { Effect, Option, Stream } from "effect";
3
- import { ChildProcess, ChildProcessSpawner } from "effect/unstable/process";
4
- import { homedir } from "node:os";
2
+ import { Effect, Option } from "effect";
3
+ import { SSH_FAILURE } from "../child-host/child-host.js";
4
+ import { hostOutput } from "../child-host/command.js";
5
5
  import { SessionOperationError } from "../runtime.js";
6
- /** Runs a bounded readiness command without retaining its potentially sensitive diagnostics. */
7
- export const probeCommand = Effect.fn("HarnessPreflight.command")(function* (harness, capability, command, args) {
8
- yield* Effect.annotateCurrentSpan({ harness, capability });
9
- const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
10
- return yield* Effect.scoped(Effect.gen(function* () {
11
- const handle = yield* spawner.spawn(ChildProcess.make(command, args, {
12
- cwd: homedir(),
13
- detached: false,
14
- forceKillAfter: "2 seconds",
15
- }));
16
- const [stdout, , exitCode] = yield* Effect.all([
17
- handle.stdout.pipe(Stream.decodeText(), Stream.mkString),
18
- handle.stderr.pipe(Stream.runDrain),
19
- handle.exitCode,
20
- ], { concurrency: "unbounded" });
21
- if (exitCode !== 0)
22
- return yield* new HarnessUnavailableError({
23
- harness,
24
- capability,
25
- message: `${command} ${args.join(" ")} failed; check the Worker's ${harness} installation and login`,
26
- });
27
- return stdout.trim();
28
- })).pipe(Effect.timeout("30 seconds"), Effect.catchTags({
6
+ /** Returns the error for a readiness command that exited non-zero; the message includes the command but not its output. */
7
+ export const probeFailed = (harness, capability, command, args) => new HarnessUnavailableError({
8
+ harness,
9
+ capability,
10
+ message: `${command} ${args.join(" ")} failed. Check the ${harness} installation and login on the worker.`,
11
+ });
12
+ /**
13
+ * Runs a readiness command on `host` with a 30-second timeout and returns its trimmed stdout and
14
+ * exit code; stderr is discarded. If the remote host is unreachable or the command times out, fails
15
+ * with `SessionOperationError`.
16
+ */
17
+ export const probeOutput = Effect.fn("HarnessPreflight.command")(function* (host, environment, harness, capability, command, args) {
18
+ yield* Effect.annotateCurrentSpan({ harness, capability, host: host._tag });
19
+ return yield* hostOutput(host, { environment, command, args }).pipe(Effect.flatMap((output) => host._tag === "RemoteShell" && output.exitCode === SSH_FAILURE
20
+ ? Effect.fail(new SessionOperationError({
21
+ operation: "launch",
22
+ sessionId: Option.none(),
23
+ message: `Can't reach ${host.destination} to run ${command}`,
24
+ cause: new Error(`${host.ssh.command} exited with code ${SSH_FAILURE}`),
25
+ }))
26
+ : Effect.succeed(output)), Effect.timeout("30 seconds"), Effect.catchTags({
29
27
  PlatformError: () => new HarnessUnavailableError({
30
28
  harness,
31
29
  capability,
32
- message: `Worker cannot execute ${command}`,
30
+ message: `The worker can't run ${command}`,
33
31
  }),
34
32
  TimeoutError: (cause) => new SessionOperationError({
35
33
  operation: "launch",
@@ -39,4 +37,8 @@ export const probeCommand = Effect.fn("HarnessPreflight.command")(function* (har
39
37
  }),
40
38
  }));
41
39
  });
40
+ /** Runs a readiness command and returns its trimmed stdout. Fails with `HarnessUnavailableError` if the command exits non-zero. */
41
+ export const probeCommand = (host, environment, harness, capability, command, args) => probeOutput(host, environment, harness, capability, command, args).pipe(Effect.flatMap(({ stdout, exitCode }) => exitCode === 0
42
+ ? Effect.succeed(stdout)
43
+ : Effect.fail(probeFailed(harness, capability, command, args))));
42
44
  //# sourceMappingURL=command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/preflight/command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAA0B,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,gGAAgG;AAChG,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC,QAAQ,CAAC,EACzE,OAAgB,EAChB,UAA6B,EAC7B,OAAe,EACf,IAA2B;IAE3B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;IAC/D,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CACjC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;YAC/B,GAAG,EAAE,OAAO,EAAE;YACd,QAAQ,EAAE,KAAK;YACf,cAAc,EAAE,WAAW;SAC5B,CAAC,CACH,CAAC;QACF,MAAM,CAAC,MAAM,EAAE,AAAD,EAAG,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAC5C;YACE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YACnC,MAAM,CAAC,QAAQ;SAChB,EACD,EAAE,WAAW,EAAE,WAAW,EAAE,CAC7B,CAAC;QACF,IAAI,QAAQ,KAAK,CAAC;YAChB,OAAO,KAAK,CAAC,CAAC,IAAI,uBAAuB,CAAC;gBACxC,OAAO;gBACP,UAAU;gBACV,OAAO,EAAE,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,OAAO,yBAAyB;aACrG,CAAC,CAAC;QACL,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC,CAAC,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5B,MAAM,CAAC,SAAS,CAAC;QACf,aAAa,EAAE,GAAG,EAAE,CAClB,IAAI,uBAAuB,CAAC;YAC1B,OAAO;YACP,UAAU;YACV,OAAO,EAAE,yBAAyB,OAAO,EAAE;SAC5C,CAAC;QACJ,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACtB,IAAI,qBAAqB,CAAC;YACxB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,MAAM,CAAC,IAAI,EAAE;YACxB,OAAO,EAAE,GAAG,OAAO,4BAA4B;YAC/C,KAAK;SACN,CAAC;KACL,CAAC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/preflight/command.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,25 @@
1
1
  import type { BrainSpec } from "@usine/core/agent/brain";
2
2
  import { HarnessReady, HarnessUnavailableError } from "@usine/core/agent/capability";
3
- import { Effect } from "effect";
3
+ import { Effect, Option } from "effect";
4
+ import type { ChildHost } from "../child-host/child-host.ts";
4
5
  import { SessionOperationError } from "../runtime.ts";
5
6
  import { CodexAppServer } from "../pi/codex/app-server.ts";
6
7
  import { PiSdk } from "../pi/sdk.ts";
7
- /** Baseline Codex CLI version used by the pinned app-server protocol conformance gate. */
8
- export declare const CODEX_CLI_VERSION = "0.144.0";
9
- /** Verifies a rostered brain through supplied process and SDK services; starts no prompt. */
10
- export declare const verifyHarness: (brain: BrainSpec) => Effect.Effect<HarnessReady, HarnessUnavailableError | SessionOperationError, import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner | CodexAppServer | PiSdk>;
11
- /** Checks only the requested brain using the worker user's configuration, without running a prompt or logging in. */
12
- export declare const preflight: (brain: BrainSpec) => Effect.Effect<HarnessReady, HarnessUnavailableError | SessionOperationError, import("effect/unstable/process/ChildProcessSpawner").ChildProcessSpawner>;
8
+ /** The Codex CLI version of the pinned app-server protocol package used by the conformance check. */
9
+ export declare const CODEX_CLI_VERSION = "0.159.2";
10
+ /**
11
+ * The Codex CLI versions that preflight accepts, the conformance baseline first. Adding a version
12
+ * needs a review of its generated protocol types and a run of the live contracts.
13
+ */
14
+ export declare const supportedCodexVersions: ReadonlyArray<string>;
15
+ /** Returns the error for `codex --version` output that names no supported Codex CLI version. */
16
+ export declare const unsupportedCodexVersion: (version: string) => Option.Option<HarnessUnavailableError>;
17
+ /**
18
+ * Checks `brain` on `host` without starting a prompt; each check process gets `environment` as its
19
+ * complete local environment, or on top of the remote host's environment (ADR 0011). Fails with
20
+ * `HarnessUnavailableError` for Pi on a remote host.
21
+ */
22
+ export declare const verifyHarness: (brain: BrainSpec, host: import("../child-host/child-host.ts").LocalProcess | import("../child-host/child-host.ts").RemoteShell, environment: Readonly<Record<string, string>>) => Effect.Effect<HarnessReady, HarnessUnavailableError | SessionOperationError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | CodexAppServer | PiSdk>;
23
+ /** Checks only `brain` on `host`, with `environment` and the Worker user's configuration; does not run a prompt or log in. */
24
+ export declare const preflight: (brain: BrainSpec, host: ChildHost, environment: Readonly<Record<string, string>>) => Effect.Effect<HarnessReady, HarnessUnavailableError | SessionOperationError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
13
25
  //# sourceMappingURL=preflight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/preflight/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACrF,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAoB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,cAAc,EAAsB,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAAE,KAAK,EAAyB,MAAM,cAAc,CAAC;AAG5D,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAW3C,6FAA6F;AAC7F,eAAO,MAAM,aAAa,wMA4GzB,CAAC;AAEF,qHAAqH;AACrH,eAAO,MAAM,SAAS,UAAW,SAAS,4JACgD,CAAC"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/preflight/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAEL,YAAY,EACZ,uBAAuB,EACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAoB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,cAAc,EAAsB,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAAE,KAAK,EAAyB,MAAM,cAAc,CAAC;AAG5D,qGAAqG;AACrG,eAAO,MAAM,iBAAiB,YAAY,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,MAAM,CAMxD,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,uBAAuB,YAAa,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,uBAAuB,CASxF,CAAC;AAYR;;;;GAIG;AACH,eAAO,MAAM,aAAa,4VAsIzB,CAAC;AAEF,8HAA8H;AAC9H,eAAO,MAAM,SAAS,UACb,SAAS,QACV,SAAS,eACF,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,mJAK5C,CAAC"}
@@ -1,42 +1,69 @@
1
- import { HarnessReady, HarnessUnavailableError } from "@usine/core/agent/capability";
1
+ import { HarnessReady, HarnessUnavailableError, } from "@usine/core/agent/capability";
2
2
  import { Effect, Option, Schema } from "effect";
3
3
  import { homedir } from "node:os";
4
4
  import { SessionOperationError, WorkingDirectory } from "../runtime.js";
5
5
  import { CodexAppServer, codexAppServerLive } from "../pi/codex/app-server.js";
6
6
  import { initializeCodex, verifyCodexAccount } from "../pi/codex/account.js";
7
7
  import { PiSdk, piSdkLive, usePiStart } from "../pi/sdk.js";
8
- import { probeCommand } from "./command.js";
9
- /** Baseline Codex CLI version used by the pinned app-server protocol conformance gate. */
10
- export const CODEX_CLI_VERSION = "0.144.0";
11
- // Additional exact builds require generated-type review and the live contracts.
12
- const supportedCodexVersions = [CODEX_CLI_VERSION, "0.153.4"];
8
+ import { probeCommand, probeFailed, probeOutput } from "./command.js";
9
+ /** The Codex CLI version of the pinned app-server protocol package used by the conformance check. */
10
+ export const CODEX_CLI_VERSION = "0.159.2";
11
+ /**
12
+ * The Codex CLI versions that preflight accepts, the conformance baseline first. Adding a version
13
+ * needs a review of its generated protocol types and a run of the live contracts.
14
+ */
15
+ export const supportedCodexVersions = [
16
+ CODEX_CLI_VERSION,
17
+ "0.159.0",
18
+ "0.159.1",
19
+ "0.159.3",
20
+ "0.153.4",
21
+ ];
22
+ /** Returns the error for `codex --version` output that names no supported Codex CLI version. */
23
+ export const unsupportedCodexVersion = (version) => supportedCodexVersions.some((supported) => version === `codex-cli ${supported}`)
24
+ ? Option.none()
25
+ : Option.some(new HarnessUnavailableError({
26
+ harness: "codex",
27
+ capability: "version",
28
+ message: `The worker has ${/^codex-cli [0-9]+\.[0-9]+\.[0-9]+$/u.test(version) ? version : "an unrecognized Codex version"}. Install a supported Codex CLI version: ${supportedCodexVersions.join(", ")}.`,
29
+ }));
13
30
  const ClaudeAuthentication = Schema.Struct({
14
31
  loggedIn: Schema.Boolean,
15
32
  authMethod: Schema.String,
16
33
  apiProvider: Schema.String,
17
34
  });
18
- /** Verifies a rostered brain through supplied process and SDK services; starts no prompt. */
19
- export const verifyHarness = Effect.fn("HarnessPreflight.verify")(function* (brain) {
20
- yield* Effect.annotateCurrentSpan({ harness: brain.harness, model: brain.model });
35
+ const decodeClaudeAuthentication = Schema.decodeUnknownOption(Schema.fromJsonString(ClaudeAuthentication));
36
+ const CLAUDE_AUTH_STATUS = ["auth", "status", "--json"];
37
+ /**
38
+ * Checks `brain` on `host` without starting a prompt; each check process gets `environment` as its
39
+ * complete local environment, or on top of the remote host's environment (ADR 0011). Fails with
40
+ * `HarnessUnavailableError` for Pi on a remote host.
41
+ */
42
+ export const verifyHarness = Effect.fn("HarnessPreflight.verify")(function* (brain, host, environment) {
43
+ yield* Effect.annotateCurrentSpan({
44
+ harness: brain.harness,
45
+ model: brain.model,
46
+ host: host._tag,
47
+ });
21
48
  const loginError = (message) => new HarnessUnavailableError({
22
49
  harness: brain.harness,
23
50
  capability: "login",
24
51
  message,
25
52
  });
53
+ const probe = (capability, command, args) => probeCommand(host, environment, brain.harness, capability, command, args);
26
54
  switch (brain.harness) {
27
55
  case "codex": {
28
- const version = yield* probeCommand("codex", "binary", "codex", ["--version"]);
29
- if (!supportedCodexVersions.some((supported) => version === `codex-cli ${supported}`))
30
- return yield* new HarnessUnavailableError({
31
- harness: "codex",
32
- capability: "version",
33
- message: `Worker has ${/^codex-cli [0-9]+\.[0-9]+\.[0-9]+$/u.test(version) ? version : "an unrecognized Codex version"}; supported Codex CLI versions: ${supportedCodexVersions.join(", ")}`,
34
- });
56
+ const version = yield* probe("binary", "codex", ["--version"]);
57
+ const unsupported = unsupportedCodexVersion(version);
58
+ if (Option.isSome(unsupported))
59
+ return yield* unsupported.value;
35
60
  yield* Effect.scoped(Effect.gen(function* () {
36
61
  const server = yield* CodexAppServer;
37
62
  const connection = yield* server.open({
38
63
  cwd: WorkingDirectory.make(homedir()),
39
64
  sessionId: Option.none(),
65
+ environment,
66
+ host,
40
67
  });
41
68
  yield* initializeCodex(connection);
42
69
  yield* verifyCodexAccount(connection, brain.model);
@@ -44,37 +71,50 @@ export const verifyHarness = Effect.fn("HarnessPreflight.verify")(function* (bra
44
71
  break;
45
72
  }
46
73
  case "claude": {
47
- yield* probeCommand("claude", "binary", "claude", ["--version"]);
48
- const response = yield* probeCommand("claude", "login", "claude", [
49
- "auth",
50
- "status",
51
- "--json",
52
- ]);
53
- const auth = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(ClaudeAuthentication))(response).pipe(Effect.mapError(() => loginError("Claude returned an unrecognized login status")));
54
- if (!auth.loggedIn || auth.authMethod !== "claude.ai" || auth.apiProvider !== "firstParty")
55
- return yield* loginError("Claude requires a subscription login; run claude auth login on the Worker");
74
+ yield* probe("binary", "claude", ["--version"]);
75
+ const status = yield* probeOutput(host, environment, "claude", "login", "claude", CLAUDE_AUTH_STATUS);
76
+ // Claude prints the same status and exits 1 when not logged in.
77
+ const auth = status.exitCode === 0 || status.exitCode === 1
78
+ ? decodeClaudeAuthentication(status.stdout)
79
+ : Option.none();
80
+ if (Option.isNone(auth))
81
+ return yield* status.exitCode === 0
82
+ ? loginError("Claude returned an unrecognized login status")
83
+ : probeFailed("claude", "login", "claude", CLAUDE_AUTH_STATUS);
84
+ const { loggedIn, authMethod, apiProvider } = auth.value;
85
+ if (status.exitCode !== 0 ||
86
+ !loggedIn ||
87
+ authMethod !== "claude.ai" ||
88
+ apiProvider !== "firstParty")
89
+ return yield* loginError("Claude Code needs a subscription login. Run claude auth login on the worker.");
56
90
  break;
57
91
  }
58
92
  case "pi": {
59
- // Pi is the SDK installed with this run host, not a separate CLI binary.
93
+ if (host._tag === "RemoteShell")
94
+ return yield* new HarnessUnavailableError({
95
+ harness: "pi",
96
+ capability: "binary",
97
+ message: "Pi children run only on local workers",
98
+ });
99
+ // Pi runs from the SDK installed with this process, not from a CLI binary.
60
100
  const sdk = yield* PiSdk;
61
101
  yield* usePiStart((signal) => sdk.start({
62
102
  cwd: homedir(),
103
+ environment: Option.some(environment),
63
104
  extensions: [],
64
- model: Option.some(brain.model),
105
+ model: brain.model,
65
106
  signal,
66
107
  thinkingLevel: brain.effort,
67
- toolMode: "repository",
68
108
  }), (cause) => new SessionOperationError({
69
109
  operation: "launch",
70
110
  sessionId: Option.none(),
71
- message: `Pi could not check authentication for ${brain.model}`,
111
+ message: `Can't check Pi authentication for "${brain.model}"`,
72
112
  cause,
73
113
  }), (acquired) => Effect.gen(function* () {
74
114
  const result = acquired.result;
75
115
  yield* Effect.sync(acquired.dispose);
76
116
  if (result._tag !== "Started" || result.pool !== "apiKeys")
77
- return yield* loginError(`Pi child model ${brain.model} requires an available model, supported effort, and API-key authentication`);
117
+ return yield* loginError(`Pi child model "${brain.model}" is unavailable, doesn't support effort ${brain.effort}, or doesn't use an API key`);
78
118
  }));
79
119
  break;
80
120
  }
@@ -82,6 +122,7 @@ export const verifyHarness = Effect.fn("HarnessPreflight.verify")(function* (bra
82
122
  yield* Effect.logInfo("Worker harness verified", {
83
123
  harness: brain.harness,
84
124
  model: brain.model,
125
+ host: host._tag,
85
126
  });
86
127
  return new HarnessReady({ harness: brain.harness });
87
128
  }, (effect, brain) => effect.pipe(Effect.timeout("60 seconds"), Effect.catchTag("TimeoutError", (cause) => new SessionOperationError({
@@ -95,6 +136,6 @@ export const verifyHarness = Effect.fn("HarnessPreflight.verify")(function* (bra
95
136
  errorTag: error._tag,
96
137
  message: error.message,
97
138
  }))));
98
- /** Checks only the requested brain using the worker user's configuration, without running a prompt or logging in. */
99
- export const preflight = (brain) => verifyHarness(brain).pipe(Effect.provide(codexAppServerLive), Effect.provide(piSdkLive));
139
+ /** Checks only `brain` on `host`, with `environment` and the Worker user's configuration; does not run a prompt or log in. */
140
+ export const preflight = (brain, host, environment) => verifyHarness(brain, host, environment).pipe(Effect.provide(codexAppServerLive), Effect.provide(piSdkLive));
100
141
  //# sourceMappingURL=preflight.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/preflight/preflight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/preflight/preflight.ts"],"names":[],"mappings":"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"}
package/dist/prompt.d.ts CHANGED
@@ -1,26 +1,29 @@
1
- import type { AgentPersona, AgentName } from "@usine/core/agent";
1
+ import { type AgentPersona, type AgentName } from "@usine/core/agent";
2
2
  import type { AttemptTask } from "@usine/core/attempt";
3
+ import type { SalvagePushed } from "@usine/core/attempt/salvage";
3
4
  import type { RepositoryName } from "@usine/core/repository";
4
- import type { Schema } from "effect";
5
- /** The recorded trigger context, Agent instructions, and effective task presented to the parent. */
5
+ import { Option, type Schema } from "effect";
6
+ /** The trigger context, Agent instructions, and task for the parent prompt. */
6
7
  export interface PromptParts {
7
8
  readonly repository: RepositoryName;
8
9
  readonly payload: Schema.Json;
9
10
  readonly agent: AgentName;
10
11
  readonly persona: AgentPersona;
11
12
  readonly task: AttemptTask;
13
+ /** The previous Attempt's salvage checked out in the workspace, if the Run is retrying. */
14
+ readonly resume: Option.Option<SalvagePushed>;
15
+ /** The previous Attempt's salvage that conflicts with the current revision and is not in the workspace. */
16
+ readonly conflictingSalvage: Option.Option<SalvagePushed>;
12
17
  }
13
- /** The Agent's standing instructions and the focused task the parent delegates to a child. */
18
+ /** The Agent instructions and delegated task for a child prompt. */
14
19
  export interface ChildPromptParts {
15
20
  readonly agent: AgentName;
16
21
  readonly persona: AgentPersona;
17
- /** Free text authored by the parent model, not the rendered loop task. */
22
+ /** Free text written by the parent model, not the rendered Loop task. */
18
23
  readonly task: string;
19
24
  }
20
- /** The attribution line every GitHub comment or review written by an Agent ends with. */
21
- export declare const githubSignature: (agent: AgentName) => string;
22
- /** Builds the parent's instructions from the saved payload, effective task, and Agent persona, including GitHub attribution. */
25
+ /** Returns the parent's instructions, including GitHub attribution. */
23
26
  export declare const assemblePrompt: (parts: PromptParts) => string;
24
- /** Builds a child's instructions from the delegated task and Agent persona, including GitHub attribution. */
27
+ /** Returns a child's instructions, including GitHub attribution. */
25
28
  export declare const assembleChildPrompt: (parts: ChildPromptParts) => string;
26
29
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;CAC5B;AAED,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,yFAAyF;AACzF,eAAO,MAAM,eAAe,UAAW,SAAS,KAAG,MAAmC,CAAC;AAYvF,gIAAgI;AAChI,eAAO,MAAM,cAAc,UAAW,WAAW,KAAG,MAoBtC,CAAC;AAEf,6GAA6G;AAC7G,eAAO,MAAM,mBAAmB,UAAW,gBAAgB,KAAG,MAWhD,CAAC"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAG7C,+EAA+E;AAC/E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC9C,2GAA2G;IAC3G,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;CAC3D;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAqCD,uEAAuE;AACvE,eAAO,MAAM,cAAc,UAAW,WAAW,KAAG,MAuBtC,CAAC;AAEf,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,UAAW,gBAAgB,KAAG,MAahD,CAAC"}