@codeworksh/cli 0.5.0-canary.70.1.g64a3527d → 0.5.0-canary.71.1.g8233e4eb
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.
- package/README.md +27 -2
- package/{acp-Bs_VE6GD.mjs → acp-BTtByOlX.mjs} +88 -43
- package/acp-BTtByOlX.mjs.map +1 -0
- package/{add-wuR2KdgZ.mjs → add-Dm3RaxB1.mjs} +4 -4
- package/{add-wuR2KdgZ.mjs.map → add-Dm3RaxB1.mjs.map} +1 -1
- package/{catalog-BJ98uuXG.mjs → catalog-Do2eDgti.mjs} +2 -2
- package/{catalog-BJ98uuXG.mjs.map → catalog-Do2eDgti.mjs.map} +1 -1
- package/{check-CU07TAJy.mjs → check-BdfxwBaL.mjs} +4 -4
- package/{check-CU07TAJy.mjs.map → check-BdfxwBaL.mjs.map} +1 -1
- package/{entries-DRVnHyqH.mjs → entries-C6AeEOS1.mjs} +3 -3
- package/{entries-DRVnHyqH.mjs.map → entries-C6AeEOS1.mjs.map} +1 -1
- package/{error-DlyE3s8i.mjs → error-CSeYCa9R.mjs} +29 -6
- package/error-CSeYCa9R.mjs.map +1 -0
- package/fork-CAu8PdA3.mjs +32 -0
- package/fork-CAu8PdA3.mjs.map +1 -0
- package/{identity-42o-yw28.mjs → identity-CpsvMaTx.mjs} +2 -2
- package/{identity-42o-yw28.mjs.map → identity-CpsvMaTx.mjs.map} +1 -1
- package/index.mjs +32 -25
- package/index.mjs.map +1 -1
- package/{install-QIZkUcxA.mjs → install-D5kkATcv.mjs} +4 -4
- package/{install-QIZkUcxA.mjs.map → install-D5kkATcv.mjs.map} +1 -1
- package/{link-DDnCnC1_.mjs → link-CsfmcRa8.mjs} +3 -3
- package/{link-DDnCnC1_.mjs.map → link-CsfmcRa8.mjs.map} +1 -1
- package/list-C60d6ifJ.mjs +36 -0
- package/list-C60d6ifJ.mjs.map +1 -0
- package/{list-Bv1WVafK.mjs → list-CHIzxyZx.mjs} +4 -4
- package/{list-Bv1WVafK.mjs.map → list-CHIzxyZx.mjs.map} +1 -1
- package/{list-CRrvg47Z.mjs → list-CakHFl9C.mjs} +4 -4
- package/{list-CRrvg47Z.mjs.map → list-CakHFl9C.mjs.map} +1 -1
- package/{login-DyS-CKhx.mjs → login-BaUYCO2G.mjs} +4 -4
- package/{login-DyS-CKhx.mjs.map → login-BaUYCO2G.mjs.map} +1 -1
- package/{logout-BQI2EceV.mjs → logout-BAks2xS7.mjs} +4 -4
- package/{logout-BQI2EceV.mjs.map → logout-BAks2xS7.mjs.map} +1 -1
- package/package-CmagAGZz.mjs +6 -0
- package/package-CmagAGZz.mjs.map +1 -0
- package/package.json +4 -4
- package/{providers-RLM4QuI2.mjs → providers-DVh6hhLU.mjs} +4 -4
- package/{providers-RLM4QuI2.mjs.map → providers-DVh6hhLU.mjs.map} +1 -1
- package/{refresh-BuwmMVmZ.mjs → refresh-CNQBX5NK.mjs} +4 -4
- package/{refresh-BuwmMVmZ.mjs.map → refresh-CNQBX5NK.mjs.map} +1 -1
- package/{refresh-BNejIOBl.mjs → refresh-tj3xbNRY.mjs} +4 -4
- package/{refresh-BNejIOBl.mjs.map → refresh-tj3xbNRY.mjs.map} +1 -1
- package/relink-BlRMYOra.mjs +23 -0
- package/relink-BlRMYOra.mjs.map +1 -0
- package/{reload-BDRixAC1.mjs → reload-h_2WARQN.mjs} +3 -3
- package/{reload-BDRixAC1.mjs.map → reload-h_2WARQN.mjs.map} +1 -1
- package/{remove-Be5D76iH.mjs → remove-CVbXLNTb.mjs} +4 -4
- package/{remove-Be5D76iH.mjs.map → remove-CVbXLNTb.mjs.map} +1 -1
- package/{restart-C-mKhGuq.mjs → restart-B0XSXYtj.mjs} +4 -4
- package/{restart-C-mKhGuq.mjs.map → restart-B0XSXYtj.mjs.map} +1 -1
- package/{run-Cce0IhCh.mjs → run-CRV3jJ2d.mjs} +5 -5
- package/run-CRV3jJ2d.mjs.map +1 -0
- package/{runtime-BqDFcmdq.mjs → runtime-Bg4mc9BB.mjs} +54 -3
- package/runtime-Bg4mc9BB.mjs.map +1 -0
- package/{serve-BlXg61ka.mjs → serve-XrW3PuIZ.mjs} +12 -11
- package/serve-XrW3PuIZ.mjs.map +1 -0
- package/{service-wZvg-u_O.mjs → service-D_vwPPPh.mjs} +3 -3
- package/{service-wZvg-u_O.mjs.map → service-D_vwPPPh.mjs.map} +1 -1
- package/{settings-BD0icUi_.mjs → settings-DcwstDUm.mjs} +2 -2
- package/{settings-BD0icUi_.mjs.map → settings-DcwstDUm.mjs.map} +1 -1
- package/{shared-CttX9T6U.mjs → shared-D_3E8bu_.mjs} +3 -3
- package/{shared-CttX9T6U.mjs.map → shared-D_3E8bu_.mjs.map} +1 -1
- package/{start-RbqZjFmF.mjs → start-CJ4XeLwV.mjs} +4 -4
- package/{start-RbqZjFmF.mjs.map → start-CJ4XeLwV.mjs.map} +1 -1
- package/{status-BOXQWESZ.mjs → status-6NyZu0f_.mjs} +4 -4
- package/{status-BOXQWESZ.mjs.map → status-6NyZu0f_.mjs.map} +1 -1
- package/{status-CKuiXBhh.mjs → status-DBzQVkL2.mjs} +4 -4
- package/{status-CKuiXBhh.mjs.map → status-DBzQVkL2.mjs.map} +1 -1
- package/{stop-CVXfuLii.mjs → stop-BY1c7cUX.mjs} +4 -4
- package/{stop-CVXfuLii.mjs.map → stop-BY1c7cUX.mjs.map} +1 -1
- package/thread-CEYjLavT.mjs +15 -0
- package/thread-CEYjLavT.mjs.map +1 -0
- package/{tui-BQ4P2MG1.mjs → tui-CBUtCHzR.mjs} +5 -5
- package/{tui-BQ4P2MG1.mjs.map → tui-CBUtCHzR.mjs.map} +1 -1
- package/{update-BpfVd-HV.mjs → update-CORsF38E.mjs} +4 -4
- package/{update-BpfVd-HV.mjs.map → update-CORsF38E.mjs.map} +1 -1
- package/acp-Bs_VE6GD.mjs.map +0 -1
- package/error-DlyE3s8i.mjs.map +0 -1
- package/package-yWaEKdYw.mjs +0 -6
- package/package-yWaEKdYw.mjs.map +0 -1
- package/run-Cce0IhCh.mjs.map +0 -1
- package/runtime-BqDFcmdq.mjs.map +0 -1
- package/serve-BlXg61ka.mjs.map +0 -1
|
@@ -22,6 +22,8 @@ const EventEnvelope = Schema.Struct({
|
|
|
22
22
|
metadata: optional(Schema.Record(Schema.String, Schema.String)),
|
|
23
23
|
data: Schema.Unknown
|
|
24
24
|
});
|
|
25
|
+
/** Whether an event belongs to a thread: every thread-scoped event names its `threadId`. */
|
|
26
|
+
const ofThread = (threadId) => (event) => Predicate.hasProperty(event.data, "threadId") && event.data.threadId === threadId;
|
|
25
27
|
var UnknownEventTypeError = class extends Schema.TaggedError()("UnknownEventTypeError", { type: Schema.String }) {};
|
|
26
28
|
/** The transport's own readiness frame; it has no meaning inside the harness. */
|
|
27
29
|
const Connected = EventSchema.define({
|
|
@@ -166,6 +168,15 @@ const ThreadOrigin = Schema.Union([
|
|
|
166
168
|
entryId: optional(Schema.String)
|
|
167
169
|
})
|
|
168
170
|
]);
|
|
171
|
+
/** Billed usage of a thread's own entries; what it inherits through a fork point counts for its source. */
|
|
172
|
+
const ThreadUsage = Schema.Struct({
|
|
173
|
+
/** Total cost in US dollars, from the catalog's prices. */
|
|
174
|
+
cost: Schema.Finite,
|
|
175
|
+
input: Schema.Int,
|
|
176
|
+
output: Schema.Int,
|
|
177
|
+
cacheRead: Schema.Int,
|
|
178
|
+
cacheWrite: Schema.Int
|
|
179
|
+
});
|
|
169
180
|
/** One linear transcript of a session, with the session embedded. */
|
|
170
181
|
const ThreadInfo = Schema.Struct({
|
|
171
182
|
id: ThreadSchema.ID,
|
|
@@ -188,6 +199,7 @@ const ThreadInfo = Schema.Struct({
|
|
|
188
199
|
})),
|
|
189
200
|
/** Its unfinished run was cut off by restarts too often to resume on its own; the next prompt runs it. */
|
|
190
201
|
parked: optional(Schema.Boolean),
|
|
202
|
+
usage: ThreadUsage,
|
|
191
203
|
session: SessionInfo
|
|
192
204
|
});
|
|
193
205
|
/** A thread of a session: `threadId`, or the session's `main` thread when absent. */
|
|
@@ -427,6 +439,8 @@ const Api = RpcGroup.make(
|
|
|
427
439
|
/**
|
|
428
440
|
* Moves where the work happens. Without `threadId`, the session's default space and directory,
|
|
429
441
|
* which every thread without its own placement follows; with it, that thread's placement only.
|
|
442
|
+
* Answers with the addressed thread (`main` when absent): its `placement` and embedded session
|
|
443
|
+
* show where it now runs.
|
|
430
444
|
*/
|
|
431
445
|
Rpc.make("session.relink", {
|
|
432
446
|
payload: {
|
|
@@ -435,7 +449,7 @@ const Api = RpcGroup.make(
|
|
|
435
449
|
sandbox: optional(SandboxRef),
|
|
436
450
|
directory: optional(Schema.String)
|
|
437
451
|
},
|
|
438
|
-
success:
|
|
452
|
+
success: ThreadInfo,
|
|
439
453
|
error: Schema.Union([
|
|
440
454
|
SessionErrors,
|
|
441
455
|
SandboxErrors,
|
|
@@ -460,10 +474,13 @@ const Api = RpcGroup.make(
|
|
|
460
474
|
* Ephemeral events (text and tool progress deltas) are never stored, so they are not here;
|
|
461
475
|
* `event.subscribe` carries them live. To resume, pass the higher of the last event's
|
|
462
476
|
* `durable.seq` and the last marker's `seq`: the marker can sit past the last event sent.
|
|
477
|
+
* With `threadId`, only that thread's events; the marker still names the session's head. A fork's
|
|
478
|
+
* own log starts at its `session.thread.forked`: what it inherits is in `thread.history`.
|
|
463
479
|
*/
|
|
464
480
|
Rpc.make("session.log", {
|
|
465
481
|
payload: {
|
|
466
482
|
sessionId: Session.SessionSchema.ID,
|
|
483
|
+
threadId: optional(ThreadSchema.ID),
|
|
467
484
|
after: optional(Schema.Int),
|
|
468
485
|
follow: optional(Schema.Boolean)
|
|
469
486
|
},
|
|
@@ -627,8 +644,12 @@ const Api = RpcGroup.make(
|
|
|
627
644
|
success: Schema.Void,
|
|
628
645
|
error: SandboxErrors
|
|
629
646
|
}),
|
|
647
|
+
/**
|
|
648
|
+
* Every event the server publishes, live, after a `server.connected` frame. With `threadId`,
|
|
649
|
+
* only the events naming that thread; the frame still comes first.
|
|
650
|
+
*/
|
|
630
651
|
Rpc.make("event.subscribe", {
|
|
631
|
-
payload: {},
|
|
652
|
+
payload: { threadId: optional(ThreadSchema.ID) },
|
|
632
653
|
success: EventEnvelope,
|
|
633
654
|
error: Schema.Union([Event.SubscriptionOverflowError, EncodingError]),
|
|
634
655
|
stream: true
|
|
@@ -673,7 +694,7 @@ const run = Effect.fn("Client.run")(function* (rpc, input, render) {
|
|
|
673
694
|
...event.data.error.status === void 0 ? {} : { status: event.data.error.status }
|
|
674
695
|
});
|
|
675
696
|
};
|
|
676
|
-
const consume = rpc["event.subscribe"]({}).pipe(Stream.mapEffect(Effect.fnUntraced(function* (envelope) {
|
|
697
|
+
const consume = rpc["event.subscribe"]({ threadId: input.threadId }).pipe(Stream.mapEffect(Effect.fnUntraced(function* (envelope) {
|
|
677
698
|
if (envelope.type === Connected.type) {
|
|
678
699
|
yield* rpc["thread.prompt"]({
|
|
679
700
|
...input,
|
|
@@ -683,7 +704,7 @@ const run = Effect.fn("Client.run")(function* (rpc, input, render) {
|
|
|
683
704
|
return;
|
|
684
705
|
}
|
|
685
706
|
const event = yield* decode$1(envelope).pipe(Effect.catchTag("UnknownEventTypeError", () => Effect.void));
|
|
686
|
-
if (event === void 0
|
|
707
|
+
if (event === void 0) return;
|
|
687
708
|
if (Schema.is(EventList.PromptAdmitted)(event) && event.data.messageId === id) admitted = true;
|
|
688
709
|
if (Schema.is(EventList.Prompted)(event) && event.data.messageId === id) {
|
|
689
710
|
promoted = true;
|
|
@@ -766,6 +787,8 @@ const usage = (summary, columns) => {
|
|
|
766
787
|
return `${divider("usage", columns)}${row("model", model)}${row("tokens", `${number.format(summary.input)} input · ${number.format(summary.output)} output${reasoning} · ${number.format(summary.totalTokens)} total`)}${row("cache", `${number.format(summary.cacheRead)} read · ${number.format(summary.cacheWrite)} write`)}${row("cost", `${formatCost(summary.cost)} · ${turns}`)}`;
|
|
767
788
|
};
|
|
768
789
|
const writeOut = (value) => Effect.sync(() => void process.stdout.write(value));
|
|
790
|
+
/** A value in its wire form, as indented JSON. */
|
|
791
|
+
const writeJson = (schema, value) => Schema.encodeEffect(schema)(value).pipe(Effect.orDie, Effect.flatMap((encoded) => writeOut(`${JSON.stringify(encoded, null, " ")}\n`)));
|
|
769
792
|
const writeError = (value) => Effect.sync(() => void process.stderr.write(value));
|
|
770
793
|
const terminalColumns = () => process.stderr.isTTY ? process.stderr.columns ?? 72 : 72;
|
|
771
794
|
//#endregion
|
|
@@ -927,6 +950,6 @@ const reportFailure = (error) => writeError(renderError(error)).pipe(Effect.andT
|
|
|
927
950
|
process.exitCode = 1;
|
|
928
951
|
})));
|
|
929
952
|
//#endregion
|
|
930
|
-
export {
|
|
953
|
+
export { encode as C, Core as S, OAuthError$1 as _, addUsage as a, decode as b, terminalColumns as c, writeJson as d, writeOut as f, Api as g, run as h, reportFailure as i, usage as l, make as m, OAuthError as n, emptyUsage as o, layer as p, renderError as r, header as s, InvalidInputError as t, writeError as u, ThreadInfo as v, ofThread as w, Connected as x, path as y };
|
|
931
954
|
|
|
932
|
-
//# sourceMappingURL=error-
|
|
955
|
+
//# sourceMappingURL=error-CSeYCa9R.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-CSeYCa9R.mjs","names":["decode","OAuthError","Contract.Api","Envelope.decode","Client.ExecutionError"],"sources":["../../src/server/envelope.ts","../../src/server/part.ts","../../src/server/contract.ts","../../src/server/client.ts","../../src/cli/output.ts","../../src/cli/error.ts"],"sourcesContent":["import { EventList, EventSchema, optional } from \"@codeworksh/harness/effect\";\nimport { Effect, Predicate, Schema } from \"effect\";\n\n/**\n * The wire form of an `EventSchema.Payload`. `data` is carried in its encoded\n * form — decoded payloads are not wire-safe (`Schema.Duration`, aikit class\n * transforms) — so clients decode it lazily through their own copy of the\n * registry and can skip types they do not know.\n */\nexport const EventEnvelope = Schema.Struct({\n\tid: EventSchema.ID,\n\ttype: Schema.String,\n\tdurable: optional(Schema.Struct({ aggregateId: Schema.String, seq: Schema.Int, version: Schema.Int })),\n\tmetadata: optional(Schema.Record(Schema.String, Schema.String)),\n\tdata: Schema.Unknown,\n});\nexport type EventEnvelope = typeof EventEnvelope.Type;\n\n/** Whether an event belongs to a thread: every thread-scoped event names its `threadId`. */\nexport const ofThread =\n\t(threadId: string) =>\n\t(event: { readonly data: unknown }): boolean =>\n\t\tPredicate.hasProperty(event.data, \"threadId\") && event.data.threadId === threadId;\n\nexport class UnknownEventTypeError extends Schema.TaggedError<UnknownEventTypeError>()(\"UnknownEventTypeError\", {\n\ttype: Schema.String,\n}) {}\n\n/** The transport's own readiness frame; it has no meaning inside the harness. */\nexport const Connected = EventSchema.define({ type: \"server.connected\", schema: {} });\n\n/** Resolves a published type to the definition that encodes it. */\nexport type Registry = (type: string) => EventSchema.Definition | undefined;\n\n/**\n * What a stock client can decode: the harness's public events plus the frames\n * the transport adds itself. A server may know more than this -- plugins\n * register their own types -- which is exactly why `data` crosses the wire\n * encoded and is decoded lazily, so an unknown type is skipped, not fatal.\n */\nconst core = EventSchema.latest([...EventList.PublicDefinitions, Connected]);\nexport const Core: Registry = (type) => core.get(type);\n\nexport class EncodingError extends Schema.TaggedError<EncodingError>()(\"EventEncodingError\", {\n\ttype: Schema.String,\n\tcause: Schema.Defect(),\n}) {}\n\nexport const encode = Effect.fn(\"Envelope.encode\")(function* (payload: EventSchema.Payload, registry: Registry = Core) {\n\tconst definition = registry(payload.type);\n\tif (definition === undefined) return yield* new UnknownEventTypeError({ type: payload.type });\n\tconst data = yield* Schema.encodeEffect(definition.data)(payload.data).pipe(\n\t\tEffect.mapError((cause) => new EncodingError({ type: payload.type, cause })),\n\t);\n\treturn {\n\t\tid: payload.id,\n\t\ttype: payload.type,\n\t\t...(payload.durable === undefined ? {} : { durable: payload.durable }),\n\t\t...(payload.metadata === undefined ? {} : { metadata: payload.metadata }),\n\t\tdata,\n\t};\n});\n\nexport const decode = Effect.fn(\"Envelope.decode\")(function* (envelope: EventEnvelope, registry: Registry = Core) {\n\tconst definition = registry(envelope.type);\n\tif (definition === undefined) {\n\t\treturn yield* new UnknownEventTypeError({ type: envelope.type });\n\t}\n\tconst data = yield* Schema.decodeEffect(definition.data)(envelope.data);\n\treturn {\n\t\tid: envelope.id,\n\t\ttype: envelope.type,\n\t\t...(envelope.durable === undefined ? {} : { durable: envelope.durable }),\n\t\t...(envelope.metadata === undefined ? {} : { metadata: envelope.metadata }),\n\t\tdata,\n\t} as EventSchema.Payload;\n});\n\nexport * as Envelope from \"./envelope.ts\";\n","import { Schema } from \"effect\";\n\n/*\n * A stored message part as clients see it: aikit's part JSON (persisted verbatim by the harness),\n * narrowed to what a client renders. Provider replay data (signatures, namespaces) and tool\n * `details` are left out, so decoding a stored part drops them.\n */\n\nexport const TextContent = Schema.Struct({ type: Schema.Literal(\"text\"), text: Schema.String });\nexport const ImageContent = Schema.Struct({\n\ttype: Schema.Literal(\"image\"),\n\tdata: Schema.String,\n\tmimeType: Schema.String,\n});\nexport const ThinkingContent = Schema.Struct({\n\ttype: Schema.Literal(\"thinking\"),\n\tthinking: Schema.String,\n\t/** The provider withheld the reasoning; `thinking` is then empty. */\n\tredacted: Schema.optionalKey(Schema.Boolean),\n});\n\n/** aikit's ToolStatusEnum. */\nexport const ToolStatus = Schema.Literals([\"pending\", \"running\", \"completed\", \"error\", \"skipped\", \"aborted\"]);\n\nexport const ToolResult = Schema.Struct({\n\tcontent: Schema.Array(Schema.Union([TextContent, ImageContent])),\n\tisError: Schema.Boolean,\n});\n\nexport const ToolCall = Schema.Struct({\n\ttype: Schema.Literal(\"toolCall\"),\n\tcallID: Schema.String,\n\tname: Schema.String,\n\targuments: Schema.Record(Schema.String, Schema.Json),\n\tstatus: ToolStatus,\n\t/** Present once the call settled (completed, error, skipped, aborted). */\n\tresult: Schema.optionalKey(ToolResult),\n\t/** Epoch milliseconds: started, and last lifecycle update. */\n\ttime: Schema.optionalKey(Schema.Struct({ start: Schema.Finite, end: Schema.Finite })),\n});\nexport type ToolCall = typeof ToolCall.Type;\n\nexport const Part = Schema.Union([TextContent, ImageContent, ThinkingContent, ToolCall]);\nexport type Part = typeof Part.Type;\n\n/** A stored part row's JSON, or none when it is not a part a client renders. */\nexport const decode = Schema.decodeUnknownOption(Schema.fromJsonString(Part));\n\nexport * as MessagePart from \"./part.ts\";\n","import { Model } from \"@codeworksh/aikit\";\nimport {\n\tControl,\n\tEvent,\n\tLocation,\n\toptional,\n\tProject,\n\tPromptSchema,\n\tRunner,\n\tSandbox,\n\tSandboxError,\n\tSession,\n\tSessionStore,\n\tSettings,\n\tThreadSchema,\n\tThreadStore,\n} from \"@codeworksh/harness/effect\";\nimport { Schema } from \"effect\";\nimport { Rpc, RpcGroup } from \"effect/rpc\";\nimport { EncodingError, EventEnvelope } from \"./envelope.ts\";\nimport { Part } from \"./part.ts\";\n\n/** The HTTP path the RPC endpoint is served on; the version moves with breaking wire changes. */\nexport const path = \"/rpc/v1\";\n\nexport const SandboxInfo = Schema.Struct({\n\tid: Sandbox.SandboxInstance.ID,\n\tdriver: Schema.String,\n\tkind: Sandbox.SandboxInstance.Kind,\n\tproviderResourceId: Schema.OptionFromNullOr(Schema.String),\n\townership: Sandbox.SandboxInstance.Ownership,\n\tstatus: Sandbox.SandboxInstance.Status,\n\tusage: Sandbox.SandboxInstance.Usage,\n\trefCount: Schema.Int,\n\tcreatedAt: Schema.DateFromString,\n\tupdatedAt: Schema.DateFromString,\n});\nexport type SandboxInfo = typeof SandboxInfo.Type;\n\n/** The container: where its threads run by default, and which host project it reads. */\nexport const SessionInfo = Schema.Struct({\n\tid: Session.SessionSchema.ID,\n\tdirectory: Session.AbsolutePath,\n\t/** The host directory this session is anchored to. Absent when it has none. */\n\thostDir: optional(Session.AbsolutePath),\n\tsandbox: optional(SandboxInfo),\n\t/** The project the session's space belongs to. */\n\tproject: optional(Schema.Struct({ id: Schema.String, name: Schema.String })),\n\t/** Last activity in any of its threads, epoch milliseconds. */\n\tupdatedAt: Schema.Finite,\n\t/** Where unaddressed prompts go. */\n\tmainThreadId: ThreadSchema.ID,\n});\nexport type SessionInfo = typeof SessionInfo.Type;\n\nexport const ThreadOrigin = Schema.Union([\n\tSchema.Struct({ kind: Schema.Literal(\"main\") }),\n\tSchema.Struct({ kind: Schema.Literal(\"fork\"), threadId: Schema.String, entryId: Schema.String }),\n\tSchema.Struct({\n\t\tkind: Schema.Literal(\"subagent\"),\n\t\tthreadId: Schema.String,\n\t\tcallId: Schema.String,\n\t\tentryId: optional(Schema.String),\n\t}),\n]);\n\n/** Billed usage of a thread's own entries; what it inherits through a fork point counts for its source. */\nexport const ThreadUsage = Schema.Struct({\n\t/** Total cost in US dollars, from the catalog's prices. */\n\tcost: Schema.Finite,\n\tinput: Schema.Int,\n\toutput: Schema.Int,\n\tcacheRead: Schema.Int,\n\tcacheWrite: Schema.Int,\n});\nexport type ThreadUsage = typeof ThreadUsage.Type;\n\n/** One linear transcript of a session, with the session embedded. */\nexport const ThreadInfo = Schema.Struct({\n\tid: ThreadSchema.ID,\n\torigin: ThreadOrigin,\n\t/** Absent until its first own prompt; clients show a fork's source title until then. */\n\ttitle: optional(Schema.String),\n\t/** Last activity, epoch milliseconds. */\n\tupdatedAt: Schema.Finite,\n\t/** The model chosen for this thread; absent when settings decide. */\n\tmodel: optional(Schema.Struct({ provider: Schema.String, id: Schema.String })),\n\t/** The thinking level chosen for this thread; absent when settings decide. */\n\tthinkingLevel: optional(Schema.Enum(Model.ThinkingLevelEnum)),\n\t/** Where it runs instead of the session's space and directory. */\n\tplacement: optional(Schema.Struct({ spaceId: Schema.String, directory: Session.AbsolutePath })),\n\t/** Its unfinished run was cut off by restarts too often to resume on its own; the next prompt runs it. */\n\tparked: optional(Schema.Boolean),\n\tusage: ThreadUsage,\n\tsession: SessionInfo,\n});\nexport type ThreadInfo = typeof ThreadInfo.Type;\n\n/** A thread of a session: `threadId`, or the session's `main` thread when absent. */\nconst ThreadRef = {\n\tsessionId: Session.SessionSchema.ID,\n\tthreadId: optional(ThreadSchema.ID),\n};\n\n/** One message in a thread's line (inherited ones first), oldest first. */\nexport const HistoryEntry = Schema.Struct({\n\t/** The entry id: what live events and `thread.message` refer to. */\n\tid: Schema.String,\n\t/** The thread that wrote it: this one, or a source it was forked from. */\n\tthreadId: Schema.String,\n\t/** Its place in the session's durable log; live events continue from it. */\n\tseq: Schema.Int,\n\trole: Schema.Literals([\"user\", \"assistant\"]),\n\t/** `draft` is a reply still streaming; `aborted` one that was interrupted. */\n\tstate: Schema.Literals([\"committed\", \"draft\", \"aborted\"]),\n\t/** Epoch milliseconds. */\n\tcreatedAt: Schema.Finite,\n\t/** Epoch milliseconds of the last change; for a reply, when it ended once it is no longer a draft. */\n\tupdatedAt: Schema.Finite,\n\tparts: Schema.Array(Part),\n});\nexport type HistoryEntry = typeof HistoryEntry.Type;\n\n/** A prompt admitted but not yet in the conversation: a steer waiting for the next model request, or a follow-up for the next turn. */\nexport const QueuedPrompt = Schema.Struct({\n\t/** The id of the user message it becomes once promoted. */\n\tid: Schema.String,\n\tdelivery: PromptSchema.Delivery,\n\ttext: Schema.String,\n\t/** Epoch milliseconds. */\n\tcreatedAt: Schema.Finite,\n});\nexport type QueuedPrompt = typeof QueuedPrompt.Type;\n\n/** Ends `session.log`'s replay; `seq` is absent when the session has no durable events yet. */\nexport const LogSynced = Schema.Struct({\n\ttype: Schema.Literal(\"log.synced\"),\n\t/** The session the log was read for. */\n\taggregateId: Schema.String,\n\tseq: optional(Schema.Int),\n});\nexport type LogSynced = typeof LogSynced.Type;\n\n/** A thread's model and thinking choices: a given field replaces the stored one, `null` clears it. */\nexport const RuntimeConfig = Schema.Struct({\n\tmodel: optional(Schema.NullOr(Schema.Struct({ provider: Schema.String, id: Schema.String }))),\n\tthinkingLevel: optional(Schema.NullOr(Schema.Enum(Model.ThinkingLevelEnum))),\n});\nexport type RuntimeConfig = typeof RuntimeConfig.Type;\n\nexport const SandboxRef = Sandbox.Selection;\n\n/** A model to choose, by the catalog's id and display name, with the thinking levels it supports. */\nexport const ModelOption = Schema.Struct({\n\tid: Schema.String,\n\tname: Schema.String,\n\t/** In ascending order; `[\"off\"]` for a model that does not reason. */\n\tthinkingLevels: Schema.Array(Schema.Enum(Model.ThinkingLevelEnum)),\n});\n\n/** A provider this server can call, with the models a session may use from it. */\nexport const ModelProvider = Schema.Struct({\n\tid: Schema.String,\n\tname: Schema.String,\n\tmodels: Schema.Array(ModelOption),\n});\nexport type ModelProvider = typeof ModelProvider.Type;\n\n/** A project's name as a client sets it: trimmed, never empty. */\nexport const ProjectName = Schema.Trimmed.check(Schema.isNonEmpty());\n\nexport class OAuthError extends Schema.TaggedError<OAuthError>()(\"Server.OAuthError\", {\n\tmessage: Schema.String,\n}) {}\n\n/** OAuth providers whose credentials this server stores. */\nexport const OAuthProvider = Schema.Literals([\"openai-codex\", \"github-copilot\"]);\nexport type OAuthProvider = typeof OAuthProvider.Type;\n\n/**\n * Credentials as the provider's aikit module persists them. The union is\n * discriminated by `provider` so one set of RPCs serves every login.\n */\nexport const OAuthCredentials = Schema.Union([\n\tSchema.Struct({\n\t\tprovider: Schema.Literal(\"openai-codex\"),\n\t\taccess: Schema.String,\n\t\trefresh: Schema.String,\n\t\texpires: Schema.Finite,\n\t\taccountId: Schema.String,\n\t}),\n\tSchema.Struct({\n\t\tprovider: Schema.Literal(\"github-copilot\"),\n\t\taccess: Schema.String,\n\t\trefresh: Schema.String,\n\t\texpires: Schema.Finite,\n\t\tenterpriseUrl: optional(Schema.String),\n\t\tapiEndpoint: optional(Schema.String),\n\t\tavailableModelIds: optional(Schema.Array(Schema.String)),\n\t}),\n]);\nexport type OAuthCredentials = typeof OAuthCredentials.Type;\n\n/** What a login looks like from the outside: never the tokens themselves. */\nexport const OAuthInfo = Schema.Struct({\n\tprovider: OAuthProvider,\n\t/** Epoch millis, or 0 for a credential that does not expire. */\n\texpires: Schema.Finite,\n\taccountId: optional(Schema.String),\n\tapiEndpoint: optional(Schema.String),\n\tenterpriseUrl: optional(Schema.String),\n\tavailableModels: optional(Schema.Int),\n});\nexport type OAuthInfo = typeof OAuthInfo.Type;\n\nconst SessionErrors = Schema.Union([\n\tSessionStore.SessionNotFoundError,\n\tThreadStore.ThreadNotFoundError,\n\tSessionStore.SessionLinkedSpaceNotFoundError,\n\tSessionStore.RelinkError,\n]);\n\nconst ThreadErrors = Schema.Union([SessionStore.SessionNotFoundError, ThreadStore.ThreadNotFoundError]);\n\n// Every lifecycle error the sandbox control plane can raise; narrowing per\n// endpoint would misreport what `withMount` and `stop` actually fail with.\nconst SandboxErrors = Schema.Union([\n\tSandboxError.SandboxNotFoundError,\n\tSandboxError.SandboxDriverNotRegisteredError,\n\tSandboxError.SandboxDriverRegistrationError,\n\tSandboxError.SandboxUnsupportedError,\n\tSandboxError.SandboxProviderError,\n\tSandboxError.SandboxUnavailError,\n\tSandboxError.SandboxRemovedError,\n\tSandboxError.SandboxTransitionConflictError,\n\tSandboxError.SandboxBusyError,\n]);\n\nconst LocationErrors = Schema.Union([Location.DirectoryNotFoundError, Location.NotDirectoryError]);\n\nexport const Api = RpcGroup.make(\n\t/**\n\t * The server's own identity: the process and build a client is talking to.\n\t *\n\t * The health probe: a discovery registration names a pid and version, and a\n\t * caller confirms the process answering is the one that registered before it\n\t * trusts the endpoint. Like every other capability it rides the RPC channel,\n\t * so there is no separate HTTP surface to keep in step.\n\t */\n\tRpc.make(\"server.info\", {\n\t\tpayload: {},\n\t\tsuccess: Schema.Struct({ pid: Schema.Int, version: Schema.String }),\n\t}),\n\tRpc.make(\"auth.save\", {\n\t\tpayload: { credentials: OAuthCredentials },\n\t\tsuccess: OAuthInfo,\n\t\terror: OAuthError,\n\t}),\n\tRpc.make(\"auth.status\", {\n\t\tpayload: { provider: OAuthProvider },\n\t\tsuccess: Schema.NullOr(OAuthInfo),\n\t\terror: OAuthError,\n\t}),\n\tRpc.make(\"auth.refresh\", {\n\t\tpayload: { provider: OAuthProvider },\n\t\tsuccess: Schema.NullOr(OAuthInfo),\n\t\terror: OAuthError,\n\t}),\n\tRpc.make(\"auth.logout\", {\n\t\tpayload: { provider: OAuthProvider },\n\t\tsuccess: Schema.Void,\n\t\terror: OAuthError,\n\t}),\n\t/** A session and its `main` thread; the main thread's info, with the session embedded. */\n\tRpc.make(\"session.create\", {\n\t\tpayload: {\n\t\t\t/** The main thread's title; absent = its first prompt names it. */\n\t\t\ttitle: optional(Schema.String),\n\t\t\tdirectory: optional(Schema.String),\n\t\t\t/**\n\t\t\t * The host directory this session is anchored to, usually the caller's project root.\n\t\t\t * Unrelated to `directory`, which names a place inside the session's space.\n\t\t\t *\n\t\t\t * It is an anchor and nothing more: whatever needs a host-side directory resolves from\n\t\t\t * here rather than from wherever the server happens to be running. What reads it is the\n\t\t\t * reader's business, not this field's.\n\t\t\t *\n\t\t\t * Optional and honoured as given. Omitting it is normal, not a failure.\n\t\t\t */\n\t\t\thostDir: optional(Session.AbsolutePath),\n\t\t\tsandbox: optional(SandboxRef),\n\t\t\truntime: optional(RuntimeConfig),\n\t\t\t/**\n\t\t\t * Names the project when this session creates it, ahead of the repository's and the\n\t\t\t * folder's name. A project that already exists keeps its name; `project.rename` changes it.\n\t\t\t */\n\t\t\tproject: optional(Schema.Struct({ name: ProjectName })),\n\t\t},\n\t\tsuccess: ThreadInfo,\n\t\terror: Schema.Union([SessionErrors, SandboxErrors, LocationErrors]),\n\t}),\n\tRpc.make(\"project.rename\", {\n\t\tpayload: { projectId: Schema.String, name: ProjectName },\n\t\tsuccess: Schema.Struct({ id: Schema.String, name: Schema.String }),\n\t\terror: Project.ProjectNotFoundError,\n\t}),\n\t/**\n\t * The models a session anchored at `hostDir` can use: providers this server holds credentials\n\t * for, in the catalog plus that project's settings, and the model settings pick when a session\n\t * names none. Without `hostDir`, only the user's settings apply. Credentials are checked for\n\t * presence, not validity.\n\t */\n\tRpc.make(\"model.list\", {\n\t\tpayload: { hostDir: optional(Session.AbsolutePath) },\n\t\tsuccess: Schema.Struct({\n\t\t\tproviders: Schema.Array(ModelProvider),\n\t\t\tdefault: Schema.Struct({\n\t\t\t\tprovider: Schema.String,\n\t\t\t\tid: Schema.String,\n\t\t\t\t/** As settings name it; a run clamps it to what the model supports. */\n\t\t\t\tthinkingLevel: Schema.Enum(Model.ThinkingLevelEnum),\n\t\t\t\t/** Display names from the catalog, present even when its provider is not listed. */\n\t\t\t\tname: optional(Schema.String),\n\t\t\t\tproviderName: optional(Schema.String),\n\t\t\t}),\n\t\t}),\n\t\terror: Schema.Union([Settings.SettingsError, Runner.ModelCatalogError]),\n\t}),\n\t/**\n\t * Point an existing session at a host directory, or clear it with `null`.\n\t *\n\t * Not `session.relink`: that moves where the *work* happens, this changes which host directory\n\t * the session is *anchored to*. Conflating them would recreate exactly the `cwd`/`hostDir`\n\t * confusion the split exists to remove, which is why they sound alike and stay apart.\n\t */\n\tRpc.make(\"session.link\", {\n\t\tpayload: {\n\t\t\tsessionId: Session.SessionSchema.ID,\n\t\t\t/** Absent clears the anchor, leaving the session with no host directory. */\n\t\t\thostDir: optional(Session.AbsolutePath),\n\t\t},\n\t\tsuccess: SessionInfo,\n\t\terror: SessionStore.SessionNotFoundError,\n\t}),\n\t/**\n\t * Moves where the work happens. Without `threadId`, the session's default space and directory,\n\t * which every thread without its own placement follows; with it, that thread's placement only.\n\t * Answers with the addressed thread (`main` when absent): its `placement` and embedded session\n\t * show where it now runs.\n\t */\n\tRpc.make(\"session.relink\", {\n\t\tpayload: {\n\t\t\tsessionId: Session.SessionSchema.ID,\n\t\t\tthreadId: optional(ThreadSchema.ID),\n\t\t\tsandbox: optional(SandboxRef),\n\t\t\tdirectory: optional(Schema.String),\n\t\t},\n\t\tsuccess: ThreadInfo,\n\t\terror: Schema.Union([SessionErrors, SandboxErrors, LocationErrors]),\n\t}),\n\t/** Stops every thread, then removes the session with its log. `deleted` is false when it did not exist. */\n\tRpc.make(\"session.delete\", {\n\t\tpayload: { sessionId: Session.SessionSchema.ID },\n\t\tsuccess: Schema.Struct({ deleted: Schema.Boolean }),\n\t}),\n\t/** Interrupts every running thread of the session. */\n\tRpc.make(\"session.interrupt\", {\n\t\tpayload: { sessionId: Session.SessionSchema.ID },\n\t\tsuccess: Schema.Struct({ interrupted: Schema.Boolean }),\n\t}),\n\t/**\n\t * A session's durable events after `after` (exclusive; omitted reads from the start), then a\n\t * `log.synced` marker at the head read when the call began. With `follow`, each event then\n\t * streams as it commits; without it the stream ends at the marker. Every thread of the session\n\t * writes this one log; events name their `threadId`.\n\t * Ephemeral events (text and tool progress deltas) are never stored, so they are not here;\n\t * `event.subscribe` carries them live. To resume, pass the higher of the last event's\n\t * `durable.seq` and the last marker's `seq`: the marker can sit past the last event sent.\n\t * With `threadId`, only that thread's events; the marker still names the session's head. A fork's\n\t * own log starts at its `session.thread.forked`: what it inherits is in `thread.history`.\n\t */\n\tRpc.make(\"session.log\", {\n\t\tpayload: {\n\t\t\tsessionId: Session.SessionSchema.ID,\n\t\t\tthreadId: optional(ThreadSchema.ID),\n\t\t\tafter: optional(Schema.Int),\n\t\t\tfollow: optional(Schema.Boolean),\n\t\t},\n\t\tsuccess: Schema.Union([EventEnvelope, LogSynced]),\n\t\terror: Schema.Union([SessionStore.SessionNotFoundError, EncodingError]),\n\t\tstream: true,\n\t}),\n\t/** Threads newest first, each with its session embedded: of one session, or all. */\n\tRpc.make(\"thread.list\", {\n\t\tpayload: { sessionId: optional(Session.SessionSchema.ID) },\n\t\tsuccess: Schema.Array(ThreadInfo),\n\t}),\n\tRpc.make(\"thread.info\", {\n\t\tpayload: ThreadRef,\n\t\tsuccess: ThreadInfo,\n\t\terror: ThreadErrors,\n\t}),\n\t/**\n\t * The conversation in a thread's line: user and assistant messages, inherited ones first, oldest\n\t * first. The harness's own entries (compactions, resets, notices) are left out.\n\t */\n\tRpc.make(\"thread.history\", {\n\t\tpayload: ThreadRef,\n\t\tsuccess: Schema.Struct({ entries: Schema.Array(HistoryEntry) }),\n\t\terror: ThreadErrors,\n\t}),\n\t/**\n\t * Prompts admitted to the thread but not yet promoted, in admission order. Admission and\n\t * promotion are durable events, so a client following `session.log` rereads this whenever the\n\t * log moves.\n\t */\n\tRpc.make(\"thread.queue\", {\n\t\tpayload: ThreadRef,\n\t\tsuccess: Schema.Struct({ entries: Schema.Array(QueuedPrompt) }),\n\t\terror: ThreadErrors,\n\t}),\n\tRpc.make(\"thread.configure\", {\n\t\tpayload: { ...ThreadRef, runtime: RuntimeConfig },\n\t\tsuccess: ThreadInfo,\n\t\terror: ThreadErrors,\n\t}),\n\t/**\n\t * A new thread whose history continues from this one's line through `entryId`, which must be\n\t * committed. `before` stops at the entry's predecessor and returns its text to edit again.\n\t */\n\tRpc.make(\"thread.fork\", {\n\t\tpayload: { ...ThreadRef, entryId: Schema.String, mode: optional(Schema.Literals([\"at\", \"before\"])) },\n\t\tsuccess: Schema.Struct({ thread: ThreadInfo, text: optional(Schema.String) }),\n\t\terror: Schema.Union([ThreadErrors, ThreadStore.ForkError]),\n\t}),\n\tRpc.make(\"thread.prompt\", {\n\t\tpayload: {\n\t\t\t...ThreadRef,\n\t\t\ttext: Schema.String,\n\t\t\tdelivery: optional(PromptSchema.Delivery),\n\t\t\tid: optional(Session.SessionMessageSchema.ID),\n\t\t},\n\t\tsuccess: Schema.Struct({ threadId: ThreadSchema.ID }),\n\t\terror: Schema.Union([ThreadErrors, Control.PromptConflictError]),\n\t}),\n\t/**\n\t * Withdraws a queued prompt before it joins the conversation. `cancelled` is false when it had\n\t * already been promoted (it then stays in the conversation) or no pending prompt has that id.\n\t */\n\tRpc.make(\"thread.cancel\", {\n\t\tpayload: { ...ThreadRef, messageId: Session.SessionMessageSchema.ID },\n\t\tsuccess: Schema.Struct({ cancelled: Schema.Boolean }),\n\t\terror: ThreadErrors,\n\t}),\n\t/**\n\t * Moves a queued prompt to the other lane or rewrites it, keeping its place in the queue.\n\t * `delivery: \"steer\"` also wakes the thread, so a prompt left waiting after a stop runs now.\n\t * `updated` is false when it had already been promoted or cancelled, or no pending prompt has that id.\n\t */\n\tRpc.make(\"thread.update\", {\n\t\tpayload: {\n\t\t\t...ThreadRef,\n\t\t\tmessageId: Session.SessionMessageSchema.ID,\n\t\t\tdelivery: optional(PromptSchema.Delivery),\n\t\t\ttext: optional(Schema.String),\n\t\t},\n\t\tsuccess: Schema.Struct({ updated: Schema.Boolean }),\n\t\terror: ThreadErrors,\n\t}),\n\tRpc.make(\"thread.interrupt\", {\n\t\tpayload: ThreadRef,\n\t\tsuccess: Schema.Struct({ interrupted: Schema.Boolean }),\n\t\terror: ThreadErrors,\n\t}),\n\t/**\n\t * Whether a prompt materialized into the thread's conversation. An admitted prompt that is still\n\t * queued has no entry yet, so this is the projection a client reconciles against when the\n\t * volatile stream left it unsure.\n\t */\n\tRpc.make(\"thread.message\", {\n\t\tpayload: { ...ThreadRef, messageId: Session.SessionMessageSchema.ID },\n\t\tsuccess: Schema.Struct({ found: Schema.Boolean }),\n\t\terror: ThreadErrors,\n\t}),\n\tRpc.make(\"thread.wait\", {\n\t\tpayload: ThreadRef,\n\t\tsuccess: Schema.Void,\n\t\terror: ThreadErrors,\n\t}),\n\t/**\n\t * Re-import every configured plugin, for the whole server.\n\t *\n\t * The one thing an exchange cannot notice on its own: a local plugin whose contents changed\n\t * while its path did not. A failure keeps the previous set and is reported here rather than\n\t * emptying a running server's tool registry.\n\t */\n\tRpc.make(\"plugin.reload\", {\n\t\tpayload: {},\n\t\t// No error channel: a reload that fails keeps the previous set and reports why, because a\n\t\t// server that empties its tool registry over a typo is worse than one that says so.\n\t\tsuccess: Schema.Struct({ plugins: Schema.Int, failure: optional(Schema.String) }),\n\t}),\n\tRpc.make(\"sandbox.drivers\", {\n\t\tpayload: {},\n\t\tsuccess: Schema.Array(Schema.Struct({ name: Schema.String, kind: Schema.String })),\n\t}),\n\tRpc.make(\"sandbox.list\", {\n\t\tpayload: {},\n\t\tsuccess: Schema.Array(SandboxInfo),\n\t}),\n\tRpc.make(\"sandbox.create\", {\n\t\tpayload: { driver: Schema.String },\n\t\tsuccess: SandboxInfo,\n\t\terror: SandboxErrors,\n\t}),\n\tRpc.make(\"sandbox.register\", {\n\t\tpayload: { driver: Schema.String, providerResourceId: Schema.String },\n\t\tsuccess: SandboxInfo,\n\t\terror: SandboxErrors,\n\t}),\n\tRpc.make(\"sandbox.stop\", {\n\t\tpayload: { sandboxId: Sandbox.SandboxInstance.ID },\n\t\tsuccess: Schema.Void,\n\t\terror: SandboxErrors,\n\t}),\n\t/**\n\t * Every event the server publishes, live, after a `server.connected` frame. With `threadId`,\n\t * only the events naming that thread; the frame still comes first.\n\t */\n\tRpc.make(\"event.subscribe\", {\n\t\tpayload: { threadId: optional(ThreadSchema.ID) },\n\t\tsuccess: EventEnvelope,\n\t\terror: Schema.Union([Event.SubscriptionOverflowError, EncodingError]),\n\t\tstream: true,\n\t}),\n);\n\nexport * as Contract from \"./contract.ts\";\n","import { EventList, type EventSchema, optional, Session } from \"@codeworksh/harness/effect\";\nimport { NodeSocket } from \"@effect/platform-node\";\nimport { Deferred, Effect, Layer, Schema, Stream } from \"effect\";\nimport { RpcClient, RpcSerialization } from \"effect/rpc\";\nimport { Contract } from \"./contract.ts\";\nimport { Envelope } from \"./envelope.ts\";\n\nexport const make = RpcClient.make(Contract.Api);\nexport type Client = Effect.Success<typeof make>;\n\nexport const layer = (url: string) =>\n\tRpcClient.layerProtocolSocket().pipe(\n\t\tLayer.provide(NodeSocket.layerWebSocket(url)),\n\t\tLayer.provide(RpcSerialization.layerNdjson),\n\t);\n\n/** A server-side failure as the client sees it: the category, not the cause. */\nexport class ExecutionError extends Schema.TaggedError<ExecutionError>()(\"Client.ExecutionError\", {\n\ttype: Schema.String,\n\tmessage: Schema.String,\n\tstatus: optional(Schema.Int),\n}) {}\n\n/**\n * Runs one prompt against a server and renders its output.\n *\n * Threads are shared, so the stream carries other clients' work too and every\n * terminal event has to be attributed before it is believed. A terminal that\n * arrives before our own prompt is promoted belongs to somebody else's drain:\n * it is remembered rather than raised, and forgotten the moment our prompt is\n * promoted. It only becomes our outcome if the session reaches idle having\n * never promoted us -- at which point it is the best explanation available for\n * why our prompt never ran.\n */\nexport const run = Effect.fn(\"Client.run\")(function* <E, R>(\n\trpc: Client,\n\tinput: { sessionId: Session.SessionSchema.ID; threadId: Session.ThreadSchema.ID; text: string },\n\trender: (event: EventSchema.Payload) => Effect.Effect<void, E, R>,\n) {\n\tconst id = Session.SessionMessageSchema.ID.create();\n\tlet admitted = false;\n\tlet promoted = false;\n\tlet settled = false;\n\tlet unattributed: ExecutionError | undefined;\n\t// Raised once a busy period ends without our prompt in it: the session may be\n\t// about to go idle, and only idleness proves our prompt is never running.\n\tconst stalled = yield* Deferred.make<void>();\n\n\tconst terminal = (event: EventSchema.Payload): ExecutionError | undefined => {\n\t\tif (Schema.is(EventList.ExecutionInterrupted)(event))\n\t\t\treturn new ExecutionError({\n\t\t\t\ttype: \"aborted\",\n\t\t\t\tmessage: event.data.reason === \"shutdown\" ? \"Server stopped the session\" : \"Session interrupted\",\n\t\t\t});\n\t\tif (Schema.is(EventList.ExecutionFailed)(event))\n\t\t\treturn new ExecutionError({\n\t\t\t\ttype: event.data.error.type,\n\t\t\t\tmessage: event.data.error.message,\n\t\t\t\t...(event.data.error.status === undefined ? {} : { status: event.data.error.status }),\n\t\t\t});\n\t\treturn undefined;\n\t};\n\n\tconst consume = rpc[\"event.subscribe\"]({ threadId: input.threadId }).pipe(\n\t\tStream.mapEffect(\n\t\t\tEffect.fnUntraced(function* (envelope) {\n\t\t\t\tif (envelope.type === Envelope.Connected.type) {\n\t\t\t\t\tyield* rpc[\"thread.prompt\"]({ ...input, id, delivery: \"followUp\" });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst event = yield* Envelope.decode(envelope).pipe(\n\t\t\t\t\tEffect.catchTag(\"UnknownEventTypeError\", () => Effect.void),\n\t\t\t\t);\n\t\t\t\tif (event === undefined) return;\n\t\t\t\tif (Schema.is(EventList.PromptAdmitted)(event) && event.data.messageId === id) admitted = true;\n\t\t\t\tif (Schema.is(EventList.Prompted)(event) && event.data.messageId === id) {\n\t\t\t\t\tpromoted = true;\n\t\t\t\t\t// Our prompt is running after all; whatever ended before it was not ours.\n\t\t\t\t\tunattributed = undefined;\n\t\t\t\t}\n\t\t\t\tif (!admitted) return;\n\n\t\t\t\tconst ended = terminal(event);\n\t\t\t\tconst succeeded = Schema.is(EventList.ExecutionSucceeded)(event);\n\t\t\t\tif (!promoted) {\n\t\t\t\t\tif (ended !== undefined) unattributed = ended;\n\t\t\t\t\t// A busy period that ended without us: wait for idle to find out\n\t\t\t\t\t// whether a successor still picks our prompt up.\n\t\t\t\t\tif (ended !== undefined || succeeded) yield* Deferred.succeed(stalled, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (ended !== undefined) return yield* ended;\n\t\t\t\tif (succeeded) {\n\t\t\t\t\tsettled = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tyield* render(event);\n\t\t\t}),\n\t\t),\n\t\tStream.takeUntil(() => settled),\n\t\tStream.runDrain,\n\t);\n\n\t// Idle is the cue to reconcile, not the verdict. `wait` follows successors, so\n\t// it resolves only once the session is quiet -- then the projection says\n\t// whether our prompt was ever part of it. A prompt that did run leaves its\n\t// terminal in flight on the same socket, so the consumer is left alone to\n\t// finish; only a prompt that never materialized ends the run early.\n\tlet abandoned = false;\n\tconst reconcile = Deferred.await(stalled).pipe(\n\t\tEffect.andThen(rpc[\"thread.wait\"]({ sessionId: input.sessionId, threadId: input.threadId })),\n\t\tEffect.andThen(rpc[\"thread.message\"]({ sessionId: input.sessionId, threadId: input.threadId, messageId: id })),\n\t\tEffect.andThen(({ found }) =>\n\t\t\tfound\n\t\t\t\t? Effect.never\n\t\t\t\t: Effect.sync(() => {\n\t\t\t\t\t\tabandoned = true;\n\t\t\t\t\t}),\n\t\t),\n\t);\n\n\tyield* Effect.raceFirst(consume, reconcile);\n\tif (settled) return;\n\tif (abandoned)\n\t\treturn yield* unattributed ?? new ExecutionError({ type: \"unknown\", message: \"Prompt was not promoted\" });\n\treturn yield* new ExecutionError({\n\t\ttype: \"transport.disconnected\",\n\t\tmessage: \"Event stream ended before the prompt finished; its output was not rendered\",\n\t});\n});\n\nexport * as Client from \"./client.ts\";\n","import type { Message } from \"@codeworksh/aikit\";\nimport { Effect, Schema } from \"effect\";\n\nexport interface UsageSummary {\n\treadonly turns: number;\n\treadonly provider?: string;\n\treadonly model?: string;\n\treadonly input: number;\n\treadonly output: number;\n\treadonly reasoning: number;\n\treadonly cacheRead: number;\n\treadonly cacheWrite: number;\n\treadonly totalTokens: number;\n\treadonly cost: number;\n}\n\nexport const emptyUsage: UsageSummary = {\n\tturns: 0,\n\tinput: 0,\n\toutput: 0,\n\treasoning: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: 0,\n};\n\nexport const addUsage = (summary: UsageSummary, message: Message.AssistantMessage): UsageSummary => ({\n\tturns: summary.turns + 1,\n\tprovider: message.provider.id,\n\tmodel: message.responseModel ?? message.model,\n\tinput: summary.input + message.usage.input,\n\toutput: summary.output + message.usage.output,\n\treasoning: summary.reasoning + (message.usage.reasoning ?? 0),\n\tcacheRead: summary.cacheRead + message.usage.cacheRead,\n\tcacheWrite: summary.cacheWrite + message.usage.cacheWrite,\n\ttotalTokens: summary.totalTokens + message.usage.totalTokens,\n\tcost: summary.cost + message.usage.cost.total,\n});\n\nconst number = new Intl.NumberFormat(\"en-US\");\nconst row = (label: string, value: string) => `${label.padEnd(9)}${value}\\n`;\n\nconst formatCost = (cost: number): string => `$${cost.toFixed(cost > 0 && cost < 0.01 ? 6 : 4)}`;\n\nexport const divider = (label: string, columns = 72): string => {\n\tconst width = Math.min(100, Math.max(32, columns));\n\tconst start = `── ${label} `;\n\treturn `${start}${\"─\".repeat(Math.max(2, width - start.length))}\\n`;\n};\n\nexport const header = (input: {\n\treadonly sessionId: string;\n\treadonly sandbox: string;\n\treadonly directory: string;\n\treadonly columns?: number;\n}): string =>\n\t`${row(\"session\", input.sessionId)}${row(\"sandbox\", `${input.sandbox} · ${input.directory}`)}\\n${divider(\n\t\t\"response\",\n\t\tinput.columns,\n\t)}`;\n\nexport const usage = (summary: UsageSummary, columns?: number): string => {\n\tconst turns = `${summary.turns} ${summary.turns === 1 ? \"turn\" : \"turns\"}`;\n\tconst model =\n\t\tsummary.provider === undefined || summary.model === undefined\n\t\t\t? \"unknown\"\n\t\t\t: `${summary.provider}/${summary.model}`;\n\tconst reasoning = summary.reasoning === 0 ? \"\" : ` · ${number.format(summary.reasoning)} reasoning`;\n\treturn `${divider(\"usage\", columns)}${row(\"model\", model)}${row(\n\t\t\"tokens\",\n\t\t`${number.format(summary.input)} input · ${number.format(summary.output)} output${reasoning} · ${number.format(\n\t\t\tsummary.totalTokens,\n\t\t)} total`,\n\t)}${row(\"cache\", `${number.format(summary.cacheRead)} read · ${number.format(summary.cacheWrite)} write`)}${row(\n\t\t\"cost\",\n\t\t`${formatCost(summary.cost)} · ${turns}`,\n\t)}`;\n};\n\nexport const writeOut = (value: string) => Effect.sync(() => void process.stdout.write(value));\n/** A value in its wire form, as indented JSON. */\nexport const writeJson = <A, I>(schema: Schema.Codec<A, I>, value: A) =>\n\tSchema.encodeEffect(schema)(value).pipe(\n\t\tEffect.orDie,\n\t\tEffect.flatMap((encoded) => writeOut(`${JSON.stringify(encoded, null, \"\\t\")}\\n`)),\n\t);\nexport const writeError = (value: string) => Effect.sync(() => void process.stderr.write(value));\nexport const terminalColumns = () => (process.stderr.isTTY ? (process.stderr.columns ?? 72) : 72);\n","import { ModelCatalog, Plugin, Runner, SandboxError, SessionStore, Settings } from \"@codeworksh/harness/effect\";\nimport { SandboxProvider } from \"@codeworksh/harness/sandbox\";\nimport { Duration, Effect, Schema } from \"effect\";\nimport { Client } from \"../server/client.ts\";\nimport { writeError } from \"./output.ts\";\n\n/** Bad flag or argument combinations the parser cannot express on its own. */\nexport class InvalidInputError extends Schema.TaggedError<InvalidInputError>()(\"CLI.InvalidInputError\", {\n\tmessage: Schema.String,\n}) {}\n\nexport class OAuthError extends Schema.TaggedError<OAuthError>()(\"CLI.OAuthError\", {\n\tmessage: Schema.String,\n\tcause: Schema.optional(Schema.Defect()),\n}) {}\n\n/**\n * Every failure a command handler may surface to the runtime. Harness failures are\n * rendered inside the handler that owns them, so only the CLI's own errors reach\n * the top-level renderer.\n */\nexport type CommandError = InvalidInputError | OAuthError;\n\nconst isInvalidInputError = Schema.is(InvalidInputError);\nconst isOAuthError = Schema.is(OAuthError);\nconst isProviderError = Schema.is(Runner.ProviderError);\nconst isModelCatalogError = Schema.is(Runner.ModelCatalogError);\nconst isModelCatalogRefreshError = Schema.is(ModelCatalog.RefreshError);\nconst isModelNotFoundError = Schema.is(Runner.ModelNotFoundError);\nconst isLLMStreamError = Schema.is(Runner.LLMStreamError);\nconst isSandboxProviderError = Schema.is(SandboxProvider.SandboxProviderError);\nconst isPluginInstallError = Schema.is(Plugin.InstallError);\nconst isPluginSourceError = Schema.is(Plugin.SourceError);\nconst isPluginStoreError = Schema.is(Plugin.StoreError);\nconst isPluginLoadError = Schema.is(Plugin.LoadError);\nconst isSessionNotLinkedError = Schema.is(SessionStore.SessionNotLinkedError);\nconst isSettingsError = Schema.is(Settings.SettingsError);\nconst isSandboxDriverNotRegisteredError = Schema.is(SandboxError.SandboxDriverNotRegisteredError);\nconst isSandboxDriverRegistrationError = Schema.is(SandboxError.SandboxDriverRegistrationError);\nconst isExecutionError = Schema.is(Client.ExecutionError);\n\nconst credentialHint = (provider: string): string => {\n\tswitch (provider) {\n\t\tcase \"openrouter\":\n\t\t\treturn \"set OPENROUTER_API_KEY and retry\";\n\t\tcase \"openai\":\n\t\t\treturn \"set OPENAI_API_KEY and retry\";\n\t\tcase \"openai-codex\":\n\t\t\treturn \"run `codework auth login --openai-codex` and retry\";\n\t\tcase \"github-copilot\":\n\t\t\treturn \"run `codework auth login --github-copilot` and retry\";\n\t\tcase \"anthropic\":\n\t\t\treturn \"set ANTHROPIC_API_KEY and retry\";\n\t\tcase \"google\":\n\t\t\treturn \"set GOOGLE_GENERATIVE_AI_API_KEY and retry\";\n\t\tcase \"xai\":\n\t\t\treturn \"set XAI_API_KEY and retry\";\n\t\tdefault:\n\t\t\treturn `configure credentials for provider \"${provider}\" and retry`;\n\t}\n};\n\nconst providerHint = (error: Runner.ProviderError): string | undefined => {\n\tswitch (error.reason._tag) {\n\t\tcase \"Runner.ProviderAuthenticationError\":\n\t\t\treturn error.reason.authentication === \"missing\"\n\t\t\t\t? credentialHint(error.provider)\n\t\t\t\t: `check the credentials configured for provider \"${error.provider}\"`;\n\t\tcase \"Runner.ProviderAuthorizationError\":\n\t\t\treturn \"check that the credential can access this model and endpoint\";\n\t\tcase \"Runner.ProviderModelUnavailableError\":\n\t\t\treturn \"check the provider model ID and whether your account can access it\";\n\t\tcase \"Runner.ProviderRateLimitError\":\n\t\t\treturn error.reason.retryAfter === undefined\n\t\t\t\t? \"retry after the provider rate-limit window resets\"\n\t\t\t\t: `retry in about ${Math.ceil(Duration.toMillis(error.reason.retryAfter) / 1_000)} seconds`;\n\t\tcase \"Runner.ProviderQuotaError\":\n\t\t\treturn \"check the provider account quota or billing balance\";\n\t\tcase \"Runner.ProviderTimeoutError\":\n\t\tcase \"Runner.ProviderTransportError\":\n\t\tcase \"Runner.ProviderUnavailableError\":\n\t\t\treturn error.isRetryable ? \"this failure is retryable\" : undefined;\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n};\n\nconst unknownMessage = (error: unknown): string => {\n\tif (error instanceof Error && error.message.trim().length > 0) return error.message;\n\tif (typeof error === \"string\" && error.trim().length > 0) return error;\n\tif (typeof error === \"object\" && error !== null && \"_tag\" in error) {\n\t\t// A bare tag such as `ServeError` hides the reason; its cause carries it (`EADDRINUSE`).\n\t\tconst cause = \"cause\" in error ? error.cause : undefined;\n\t\treturn cause instanceof Error ? `${String(error._tag)}: ${cause.message}` : String(error._tag);\n\t}\n\treturn \"the command failed for an unknown reason\";\n};\n\n/**\n * What the reader can do about a reference that failed to prepare. A plugin list is\n * usually hand-written in a settings file, so the phase is worth translating.\n */\n/** One hint per reason. Lowercase, like everything else a plugin failure prints. */\nconst providerCategory = (reason: Runner.ProviderFailureReason): string => {\n\tswitch (reason._tag) {\n\t\tcase \"Runner.ProviderAuthenticationError\":\n\t\t\treturn \"provider-authentication-error\";\n\t\tcase \"Runner.ProviderConfigurationError\":\n\t\t\treturn \"provider-configuration-error\";\n\t\tcase \"Runner.ProviderAuthorizationError\":\n\t\t\treturn \"provider-authorization-error\";\n\t\tcase \"Runner.ProviderModelUnavailableError\":\n\t\t\treturn \"provider-model-unavailable-error\";\n\t\tcase \"Runner.ProviderRateLimitError\":\n\t\t\treturn \"provider-rate-limit-error\";\n\t\tcase \"Runner.ProviderQuotaError\":\n\t\t\treturn \"provider-quota-error\";\n\t\tcase \"Runner.ProviderInvalidRequestError\":\n\t\t\treturn \"provider-invalid-request-error\";\n\t\tcase \"Runner.ProviderContentPolicyError\":\n\t\t\treturn \"provider-content-filter-error\";\n\t\tcase \"Runner.ProviderTimeoutError\":\n\t\t\treturn \"provider-timeout-error\";\n\t\tcase \"Runner.ProviderTransportError\":\n\t\t\treturn \"provider-transport-error\";\n\t\tcase \"Runner.ProviderUnavailableError\":\n\t\t\treturn \"provider-unavailable-error\";\n\t\tcase \"Runner.ProviderInvalidResponseError\":\n\t\t\treturn \"provider-invalid-response-error\";\n\t\tcase \"Runner.ProviderUnknownError\":\n\t\t\treturn \"provider-unknown-error\";\n\t}\n};\n\nconst pluginReasonHint = (\n\treason:\n\t\t| Plugin.SourceError[\"reason\"]\n\t\t| Plugin.InstallError[\"reason\"]\n\t\t| Plugin.StoreError[\"reason\"]\n\t\t| Plugin.LoadError[\"reason\"],\n): string => {\n\tswitch (reason) {\n\t\tcase \"plugin-unsupported-source\":\n\t\t\treturn \"a path entry starts with `./`, `../`, `~/` or `/`; anything else is a package or a git spec, and a remote tarball is not supported\";\n\t\tcase \"plugin-not-found\":\n\t\t\treturn \"the path does not exist; check the spelling, remembering it anchors to the settings file that declares it\";\n\t\tcase \"plugin-escapes-root\":\n\t\t\treturn \"a plugin path must stay inside the project it is declared in\";\n\t\tcase \"plugin-resolve-failed\":\n\t\t\treturn \"check that the registry or git remote is reachable, and that your credentials are current\";\n\t\tcase \"plugin-fetch-failed\":\n\t\t\treturn \"check the package name and version, and that the registry is reachable\";\n\t\tcase \"plugin-no-commit\":\n\t\t\treturn \"the git source installed but no commit could be recovered; name a branch, tag or commit explicitly\";\n\t\tcase \"plugin-no-entrypoint\":\n\t\t\treturn \"the package installed but exports no module to import; check its `exports` and `main`\";\n\t\tcase \"plugin-not-installed\":\n\t\t\treturn \"run `codework plugin install` to fetch what the settings files name\";\n\t\tcase \"plugin-lock-timeout\":\n\t\t\treturn \"another install is holding this entry; wait for it to finish, or remove the stale `.lock` directory\";\n\t\tcase \"plugin-marker-invalid\":\n\t\tcase \"plugin-index-invalid\":\n\t\t\treturn \"the store entry is damaged; remove it and install again\";\n\t\tcase \"plugin-collect-failed\":\n\t\t\treturn \"the store could not be tidied; check the permissions on the plugin cache\";\n\t\tcase \"plugin-import-failed\":\n\t\t\treturn \"the module failed to load; import it directly to see its own error\";\n\t\tcase \"plugin-missing-dependency\":\n\t\t\treturn \"the plugin's own dependencies are missing; install them where the plugin lives\";\n\t\tcase \"plugin-not-compiled\":\n\t\t\treturn \"a plugin installed from git or npm must ship compiled javascript; build it and commit or publish the output\";\n\t\tcase \"plugin-invalid-definition\":\n\t\t\treturn \"a plugin module must default-export one object with a `setup` and a `vendor.domain.name` id\";\n\t}\n};\n\nconst settingsHint = (reason: Settings.SettingsError[\"reason\"]): string => {\n\tswitch (reason) {\n\t\tcase \"read\":\n\t\t\treturn \"the file exists but could not be read; check that it is a file and readable\";\n\t\tcase \"parse\":\n\t\t\treturn \"the file is not valid JSON; the location above is where parsing stopped\";\n\t\tcase \"decode\":\n\t\t\treturn \"the key above holds a value this setting does not accept\";\n\t}\n};\n\n/** Render typed SDK errors for humans without exposing Effect causes or provider payloads. */\nexport const renderError = (error: unknown): string => {\n\tif (isSandboxDriverNotRegisteredError(error)) {\n\t\treturn `error: sandbox driver \"${error.driver}\" is not registered (available: ${error.registered?.join(\", \") ?? \"none\"})\\n`;\n\t}\n\tif (isSandboxDriverRegistrationError(error)) {\n\t\treturn `error: ${error.reason}\\n`;\n\t}\n\tif (isInvalidInputError(error)) {\n\t\treturn `error: ${error.message}\\n`;\n\t}\n\tif (isOAuthError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[oauth-credential-error]: ${error.message}`,\n\t\t\t\t...(error.cause === undefined ? [] : [`detail: ${unknownMessage(error.cause)}`]),\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isSandboxProviderError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error: SandboxProviderError - ${error.sanitized.message}`,\n\t\t\t\t`driver: ${error.driver}`,\n\t\t\t\t`operation: ${error.operation}`,\n\t\t\t\t...(error.sanitized.code === undefined ? [] : [`code: ${error.sanitized.code}`]),\n\t\t\t\t...(error.stack === undefined ? [] : [\"traceback:\", error.stack]),\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isSessionNotLinkedError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[${error.reason}]: ${error.message}`,\n\t\t\t\t`session: ${error.sessionId}`,\n\t\t\t\t\"hint: run `codework session link <session-id>` from the directory to anchor it to\",\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isSettingsError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[settings-${error.reason}-failed]: ${error.path}`,\n\t\t\t\t`detail: ${error.detail}`,\n\t\t\t\t`hint: ${settingsHint(error.reason)}`,\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\t// One shape for all three plugin domains: the reason is the slug, the message is the sentence,\n\t// and the reference is the string the person recognises from their settings file.\n\tif (\n\t\tisPluginSourceError(error) ||\n\t\tisPluginInstallError(error) ||\n\t\tisPluginStoreError(error) ||\n\t\tisPluginLoadError(error)\n\t) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[${error.reason}]: ${error.message}`,\n\t\t\t\t...(error.reference === \"\" ? [] : [`reference: ${error.reference}`]),\n\t\t\t\t...(error.file === undefined ? [] : [`declared in: ${error.file}`]),\n\t\t\t\t...(isPluginLoadError(error) && error.id !== undefined ? [`id: ${error.id}`] : []),\n\t\t\t\t`hint: ${pluginReasonHint(error.reason)}`,\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isProviderError(error)) {\n\t\tconst hint = providerHint(error);\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[${providerCategory(error.reason)}]: ${error.message}`,\n\t\t\t\t`provider: ${error.provider}`,\n\t\t\t\t`model: ${error.model}`,\n\t\t\t\t...(error.reason.requestId === undefined ? [] : [`request: ${error.reason.requestId}`]),\n\t\t\t\t...(hint === undefined ? [] : [`hint: ${hint}`]),\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isModelCatalogError(error)) {\n\t\treturn (\n\t\t\t[`error[model-catalog-${error.reason}]: ${error.message}`, \"hint: run `codework models refresh`\"].join(\"\\n\") +\n\t\t\t\"\\n\"\n\t\t);\n\t}\n\tif (isModelCatalogRefreshError(error)) {\n\t\treturn (\n\t\t\t[`error[catalog-refresh-failed]: ${error.message}`, \"hint: check the network connection and retry\"].join(\n\t\t\t\t\"\\n\",\n\t\t\t) + \"\\n\"\n\t\t);\n\t}\n\tif (isModelNotFoundError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\t`error[model-not-found-error]: ${error.message}`,\n\t\t\t\t\"hint: check the provider/model IDs in models.gen.json or regenerate the catalog\",\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\tif (isLLMStreamError(error)) {\n\t\treturn `error[llm-stream-error]: ${error.message}\\n`;\n\t}\n\t// A remote run has only the category the server published; render it the same\n\t// way a local typed error is rendered, minus the detail that stayed server-side.\n\tif (isExecutionError(error)) {\n\t\treturn (\n\t\t\t[\n\t\t\t\terror.type === \"aborted\" ? `error: ${error.message}` : `error[${error.type}]: ${error.message}`,\n\t\t\t\t...(error.status === undefined ? [] : [`status: ${error.status}`]),\n\t\t\t].join(\"\\n\") + \"\\n\"\n\t\t);\n\t}\n\treturn `error: ${unknownMessage(error)}\\n`;\n};\n\nexport const reportFailure = (error: unknown) =>\n\twriteError(renderError(error)).pipe(\n\t\tEffect.andThen(\n\t\t\tEffect.sync(() => {\n\t\t\t\tprocess.exitCode = 1;\n\t\t\t}),\n\t\t),\n\t);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { i as Cmd, t as handler } from "./runtime-Bg4mc9BB.mjs";
|
|
2
|
+
import { d as writeJson, f as writeOut, i as reportFailure, m as make, p as layer, t as InvalidInputError, v as ThreadInfo } from "./error-CSeYCa9R.mjs";
|
|
3
|
+
import { t as threadFlag } from "./thread-CEYjLavT.mjs";
|
|
4
|
+
import { Effect, Option, Schema } from "effect";
|
|
5
|
+
import { Session } from "@codeworksh/harness/effect";
|
|
6
|
+
//#region src/cli/cmd/handlers/thread/fork.ts
|
|
7
|
+
const Forked = Schema.Struct({
|
|
8
|
+
thread: ThreadInfo,
|
|
9
|
+
text: Schema.optional(Schema.String)
|
|
10
|
+
});
|
|
11
|
+
var fork_default = handler(Cmd.commands.thread.commands.fork, Effect.fn("CLI.thread.fork")(function* ({ session, thread, at, before, json, server }) {
|
|
12
|
+
return yield* Effect.gen(function* () {
|
|
13
|
+
const point = Option.isSome(at) ? Option.isNone(before) ? { entryId: at.value } : void 0 : Option.map(before, (entryId) => ({
|
|
14
|
+
entryId,
|
|
15
|
+
mode: "before"
|
|
16
|
+
})).pipe(Option.getOrUndefined);
|
|
17
|
+
if (point === void 0) return yield* new InvalidInputError({ message: "Pass exactly one of --at or --before" });
|
|
18
|
+
const threadId = yield* threadFlag(thread);
|
|
19
|
+
const forked = yield* (yield* make)["thread.fork"]({
|
|
20
|
+
sessionId: Session.SessionSchema.ID.make(session),
|
|
21
|
+
...threadId === void 0 ? {} : { threadId },
|
|
22
|
+
...point
|
|
23
|
+
});
|
|
24
|
+
if (json) return yield* writeJson(Forked, forked);
|
|
25
|
+
yield* writeOut(`${forked.thread.id}\n`);
|
|
26
|
+
if (forked.text !== void 0) yield* writeOut(`\n${forked.text}\n`);
|
|
27
|
+
}).pipe(Effect.provide(layer(server)), Effect.scoped, Effect.catch(reportFailure));
|
|
28
|
+
}));
|
|
29
|
+
//#endregion
|
|
30
|
+
export { fork_default as default };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=fork-CAu8PdA3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fork-CAu8PdA3.mjs","names":["Runtime.handler","Client.make","Client.layer"],"sources":["../../src/cli/cmd/handlers/thread/fork.ts"],"sourcesContent":["import { Session } from \"@codeworksh/harness/effect\";\nimport { Effect, Option, Schema } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { Client } from \"../../../../server/client.ts\";\nimport { ThreadInfo } from \"../../../../server/contract.ts\";\nimport { InvalidInputError, reportFailure } from \"../../../error.ts\";\nimport { writeJson, writeOut } from \"../../../output.ts\";\nimport { threadFlag } from \"../../../thread.ts\";\nimport { Cmd } from \"../../cmd.ts\";\n\nconst Forked = Schema.Struct({ thread: ThreadInfo, text: Schema.optional(Schema.String) });\n\nexport default Runtime.handler(\n\tCmd.commands.thread.commands.fork,\n\tEffect.fn(\"CLI.thread.fork\")(function* ({ session, thread, at, before, json, server }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst point = Option.isSome(at)\n\t\t\t\t? Option.isNone(before)\n\t\t\t\t\t? { entryId: at.value }\n\t\t\t\t\t: undefined\n\t\t\t\t: Option.map(before, (entryId) => ({ entryId, mode: \"before\" as const })).pipe(Option.getOrUndefined);\n\t\t\tif (point === undefined) {\n\t\t\t\treturn yield* new InvalidInputError({ message: \"Pass exactly one of --at or --before\" });\n\t\t\t}\n\t\t\tconst threadId = yield* threadFlag(thread);\n\t\t\tconst rpc = yield* Client.make;\n\t\t\tconst forked = yield* rpc[\"thread.fork\"]({\n\t\t\t\tsessionId: Session.SessionSchema.ID.make(session),\n\t\t\t\t...(threadId === undefined ? {} : { threadId }),\n\t\t\t\t...point,\n\t\t\t});\n\t\t\tif (json) return yield* writeJson(Forked, forked);\n\t\t\tyield* writeOut(`${forked.thread.id}\\n`);\n\t\t\tif (forked.text !== undefined) yield* writeOut(`\\n${forked.text}\\n`);\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.provide(Client.layer(server)), Effect.scoped, Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;AAUA,MAAM,SAAS,OAAO,OAAO;CAAE,QAAQ;CAAY,MAAM,OAAO,SAAS,OAAO,MAAM;AAAE,CAAC;AAEzF,IAAA,eAAeA,QACd,IAAI,SAAS,OAAO,SAAS,MAC7B,OAAO,GAAG,iBAAiB,CAAC,CAAC,WAAW,EAAE,SAAS,QAAQ,IAAI,QAAQ,MAAM,UAAU;CAsBtF,OAAO,OArBS,OAAO,IAAI,aAAa;EACvC,MAAM,QAAQ,OAAO,OAAO,EAAE,IAC3B,OAAO,OAAO,MAAM,IACnB,EAAE,SAAS,GAAG,MAAM,IACpB,KAAA,IACD,OAAO,IAAI,SAAS,aAAa;GAAE;GAAS,MAAM;EAAkB,EAAE,CAAC,CAAC,KAAK,OAAO,cAAc;EACrG,IAAI,UAAU,KAAA,GACb,OAAO,OAAO,IAAI,kBAAkB,EAAE,SAAS,uCAAuC,CAAC;EAExF,MAAM,WAAW,OAAO,WAAW,MAAM;EAEzC,MAAM,SAAS,QAAO,OADHC,KAAAA,CACO,cAAc,CAAC;GACxC,WAAW,QAAQ,cAAc,GAAG,KAAK,OAAO;GAChD,GAAI,aAAa,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS;GAC7C,GAAG;EACJ,CAAC;EACD,IAAI,MAAM,OAAO,OAAO,UAAU,QAAQ,MAAM;EAChD,OAAO,SAAS,GAAG,OAAO,OAAO,GAAG,GAAG;EACvC,IAAI,OAAO,SAAS,KAAA,GAAW,OAAO,SAAS,KAAK,OAAO,KAAK,GAAG;CACpE,CAEoB,CAAC,CAAC,KAAK,OAAO,QAAQC,MAAa,MAAM,CAAC,GAAG,OAAO,QAAQ,OAAO,MAAM,aAAa,CAAC;AAC5G,CAAC,CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as version } from "./package-
|
|
1
|
+
import { t as version } from "./package-CmagAGZz.mjs";
|
|
2
2
|
import { Context, Effect, FileSystem, Layer, Option, Path, Schedule, Schema } from "effect";
|
|
3
3
|
import { isSea } from "node:sea";
|
|
4
4
|
//#region src/server/registration.ts
|
|
@@ -89,4 +89,4 @@ const layer = Layer.succeed(Service, Service.of(current));
|
|
|
89
89
|
//#endregion
|
|
90
90
|
export { file as a, register as c, command as i, current as n, infoJson as o, layer as r, log as s, Service as t };
|
|
91
91
|
|
|
92
|
-
//# sourceMappingURL=identity-
|
|
92
|
+
//# sourceMappingURL=identity-CpsvMaTx.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-
|
|
1
|
+
{"version":3,"file":"identity-CpsvMaTx.mjs","names":["pkg.version"],"sources":["../../src/server/registration.ts","../../src/server/identity.ts"],"sourcesContent":["import { Effect, FileSystem, Layer, Option, Path, Schedule, Schema } from \"effect\";\nimport { isSea } from \"node:sea\";\n\n/**\n * How a running server advertises itself so later invocations can find it\n * without scanning ports or the process table.\n *\n * The file is a discovery hint, never proof: a caller reads it for the endpoint,\n * then asks the endpoint `server.info` and believes the answer only when the\n * live pid and version match the ones on file. A crashed server leaves a\n * registration behind; the failed probe is what retires it.\n */\nexport const Info = Schema.Struct({\n\t/** Operating system process identifier of the server that wrote this. */\n\tpid: Schema.Int,\n\t/** The build serving this endpoint; a mismatch means a different binary. */\n\tversion: Schema.String,\n\t/** The `ws://host:port/rpc/v1` endpoint a client connects to. */\n\turl: Schema.String,\n\t/** The TCP port the server bound, for a caller that would rather reuse it than default. */\n\tport: Schema.Int,\n});\nexport type Info = typeof Info.Type;\n\nexport const infoJson = Schema.fromJsonString(Info);\n\n/** The registration file for a CodeWork home: `<home>/service.json`. */\nexport const file = (home: string) => `${home}/service.json`;\n\n/** Where a background (`serve --service`) server writes its log: `<log>/server.log`, truncated per start. */\nexport const log = (logDir: string) => `${logDir}/server.log`;\n\nconst decode = Schema.decodeUnknownEffect(infoJson);\n\nexport const write = Effect.fn(\"ServerRegistration.write\")(function* (path: string, info: Info) {\n\tconst fs = yield* FileSystem.FileSystem;\n\tconst paths = yield* Path.Path;\n\tyield* fs.makeDirectory(paths.dirname(path), { recursive: true });\n\tconst encoded = yield* Schema.encodeEffect(infoJson)(info);\n\t// Write beside the target and rename, so a reader never sees a half-written\n\t// file. 0600 because a future registration may carry a credential.\n\tconst temp = `${path}.${info.pid}.tmp`;\n\tyield* fs.writeFileString(temp, encoded, { mode: 0o600 });\n\tyield* fs.rename(temp, path);\n});\n\n/**\n * Publishes a registration for as long as this server lives, removing it on the\n * way out if it is still the one on file. A file left by a crash is overwritten\n * by the next server to start, and retired by a probe that cannot confirm it.\n *\n * One home has one discoverable server. Every few seconds the file is checked:\n * a missing or unreadable file is written again, and a file naming another\n * server means this one lost discovery for good, so it shuts down rather than\n * run on where nothing can find or stop it.\n */\nexport const register = (options: { readonly home: string; readonly info: Info }) =>\n\tLayer.effectDiscard(\n\t\tEffect.gen(function* () {\n\t\t\tconst path = file(options.home);\n\t\t\tconst fs = yield* FileSystem.FileSystem;\n\t\t\tconst current = fs.readFileString(path).pipe(Effect.flatMap(decode), Effect.option);\n\t\t\tconst owns = (found: Info) => found.pid === options.info.pid && found.url === options.info.url;\n\n\t\t\tyield* write(path, options.info);\n\t\t\tyield* Effect.addFinalizer(() =>\n\t\t\t\tcurrent.pipe(\n\t\t\t\t\tEffect.flatMap((found) => (Option.isSome(found) && owns(found.value) ? fs.remove(path) : Effect.void)),\n\t\t\t\t\tEffect.ignore,\n\t\t\t\t),\n\t\t\t);\n\t\t\t// Forked after the finalizer, so shutdown stops the watch before the file is removed.\n\t\t\tyield* current.pipe(\n\t\t\t\tEffect.flatMap((found) =>\n\t\t\t\t\tOption.isNone(found)\n\t\t\t\t\t\t? write(path, options.info).pipe(Effect.ignore, Effect.as(true))\n\t\t\t\t\t\t: Effect.succeed(owns(found.value)),\n\t\t\t\t),\n\t\t\t\tEffect.repeat({ while: (ours) => ours, schedule: Schedule.spaced(\"5 seconds\") }),\n\t\t\t\tEffect.andThen(Effect.logWarning(`${path} names another server; shutting down`)),\n\t\t\t\t// The same graceful path `codework service stop` takes.\n\t\t\t\tEffect.andThen(Effect.sync(() => process.kill(process.pid, \"SIGTERM\"))),\n\t\t\t\tEffect.forkScoped,\n\t\t\t);\n\t\t}),\n\t);\n\n/**\n * The launcher command for a managed server: this same CLI, asked to serve.\n *\n * A packaged install runs `dist/pack/index.mjs`; under `--conditions=development`\n * the entry is TypeScript, and `process.execArgv` carries the conditions forward\n * so a managed server resolves workspace sources the same way this process did.\n * The standalone binary is its own entry.\n */\nexport const command = (): ReadonlyArray<string> => {\n\tif (isSea()) return [process.execPath];\n\tconst entry = process.argv[1];\n\tif (entry === undefined) return [process.execPath];\n\tconst runtime = import.meta.url.endsWith(\".ts\") ? process.execArgv : [];\n\treturn [process.execPath, ...runtime, entry];\n};\n\nexport * as Registration from \"./registration.ts\";\n","import { Context, Layer } from \"effect\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\n\n/**\n * What a running server is, as its clients need to know it.\n *\n * A discovery registration names the pid and version it wrote; `server.info`\n * answers with the live ones so a caller can tell the process it reached is the\n * one that registered rather than a different server that took the same port.\n */\nexport interface Interface {\n\treadonly pid: number;\n\treadonly version: string;\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@codeworksh/cli/server/identity/Service\") {}\n\n/** This process: a server answers with it, a client compares a server's version against it. */\nexport const current: Interface = { pid: process.pid, version: pkg.version };\n\nexport const layer = Layer.succeed(Service, Service.of(current));\n\nexport * as Identity from \"./identity.ts\";\n"],"mappings":";;;;;;;;;;;;;AAYA,MAAa,OAAO,OAAO,OAAO;;CAEjC,KAAK,OAAO;;CAEZ,SAAS,OAAO;;CAEhB,KAAK,OAAO;;CAEZ,MAAM,OAAO;AACd,CAAC;AAGD,MAAa,WAAW,OAAO,eAAe,IAAI;;AAGlD,MAAa,QAAQ,SAAiB,GAAG,KAAK;;AAG9C,MAAa,OAAO,WAAmB,GAAG,OAAO;AAEjD,MAAM,SAAS,OAAO,oBAAoB,QAAQ;AAElD,MAAa,QAAQ,OAAO,GAAG,0BAA0B,CAAC,CAAC,WAAW,MAAc,MAAY;CAC/F,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,QAAQ,OAAO,KAAK;CAC1B,OAAO,GAAG,cAAc,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;CAChE,MAAM,UAAU,OAAO,OAAO,aAAa,QAAQ,CAAC,CAAC,IAAI;CAGzD,MAAM,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI;CACjC,OAAO,GAAG,gBAAgB,MAAM,SAAS,EAAE,MAAM,IAAM,CAAC;CACxD,OAAO,GAAG,OAAO,MAAM,IAAI;AAC5B,CAAC;;;;;;;;;;;AAYD,MAAa,YAAY,YACxB,MAAM,cACL,OAAO,IAAI,aAAa;CACvB,MAAM,OAAO,KAAK,QAAQ,IAAI;CAC9B,MAAM,KAAK,OAAO,WAAW;CAC7B,MAAM,UAAU,GAAG,eAAe,IAAI,CAAC,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG,OAAO,MAAM;CAClF,MAAM,QAAQ,UAAgB,MAAM,QAAQ,QAAQ,KAAK,OAAO,MAAM,QAAQ,QAAQ,KAAK;CAE3F,OAAO,MAAM,MAAM,QAAQ,IAAI;CAC/B,OAAO,OAAO,mBACb,QAAQ,KACP,OAAO,SAAS,UAAW,OAAO,OAAO,KAAK,KAAK,KAAK,MAAM,KAAK,IAAI,GAAG,OAAO,IAAI,IAAI,OAAO,IAAK,GACrG,OAAO,MACR,CACD;CAEA,OAAO,QAAQ,KACd,OAAO,SAAS,UACf,OAAO,OAAO,KAAK,IAChB,MAAM,MAAM,QAAQ,IAAI,CAAC,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG,IAAI,CAAC,IAC7D,OAAO,QAAQ,KAAK,MAAM,KAAK,CAAC,CACpC,GACA,OAAO,OAAO;EAAE,QAAQ,SAAS;EAAM,UAAU,SAAS,OAAO,WAAW;CAAE,CAAC,GAC/E,OAAO,QAAQ,OAAO,WAAW,GAAG,KAAK,qCAAqC,CAAC,GAE/E,OAAO,QAAQ,OAAO,WAAW,QAAQ,KAAK,QAAQ,KAAK,SAAS,CAAC,CAAC,GACtE,OAAO,UACR;AACD,CAAC,CACF;;;;;;;;;AAUD,MAAa,gBAAuC;CACnD,IAAI,MAAM,GAAG,OAAO,CAAC,QAAQ,QAAQ;CACrC,MAAM,QAAQ,QAAQ,KAAK;CAC3B,IAAI,UAAU,KAAA,GAAW,OAAO,CAAC,QAAQ,QAAQ;CACjD,MAAM,UAAU,YAAY,IAAI,SAAS,KAAK,IAAI,QAAQ,WAAW,CAAC;CACtE,OAAO;EAAC,QAAQ;EAAU,GAAG;EAAS;CAAK;AAC5C;;;ACtFA,IAAa,UAAb,cAA6B,QAAQ,QAA4B,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC;;AAG/G,MAAa,UAAqB;CAAE,KAAK,QAAQ;CAAcA;AAAY;AAE3E,MAAa,QAAQ,MAAM,QAAQ,SAAS,QAAQ,GAAG,OAAO,CAAC"}
|
package/index.mjs
CHANGED
|
@@ -1,41 +1,48 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { t as version } from "./package-
|
|
3
|
-
import { i as Cmd, n as handlers, r as run } from "./runtime-
|
|
2
|
+
import { t as version } from "./package-CmagAGZz.mjs";
|
|
3
|
+
import { i as Cmd, n as handlers, r as run } from "./runtime-Bg4mc9BB.mjs";
|
|
4
4
|
import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
|
|
5
5
|
import * as NodeServices from "@effect/platform-node/NodeServices";
|
|
6
6
|
import { Effect } from "effect";
|
|
7
7
|
//#region src/index.ts
|
|
8
8
|
const Handlers = handlers(Cmd, {
|
|
9
9
|
auth: {
|
|
10
|
-
login: () => import("./login-
|
|
11
|
-
status: () => import("./status-
|
|
12
|
-
refresh: () => import("./refresh-
|
|
13
|
-
logout: () => import("./logout-
|
|
10
|
+
login: () => import("./login-BaUYCO2G.mjs"),
|
|
11
|
+
status: () => import("./status-DBzQVkL2.mjs"),
|
|
12
|
+
refresh: () => import("./refresh-CNQBX5NK.mjs"),
|
|
13
|
+
logout: () => import("./logout-BAks2xS7.mjs")
|
|
14
14
|
},
|
|
15
|
-
run: () => import("./run-
|
|
16
|
-
tui: () => import("./tui-
|
|
17
|
-
serve: () => import("./serve-
|
|
15
|
+
run: () => import("./run-CRV3jJ2d.mjs"),
|
|
16
|
+
tui: () => import("./tui-CBUtCHzR.mjs"),
|
|
17
|
+
serve: () => import("./serve-XrW3PuIZ.mjs"),
|
|
18
18
|
service: {
|
|
19
|
-
start: () => import("./start-
|
|
20
|
-
restart: () => import("./restart-
|
|
21
|
-
status: () => import("./status-
|
|
22
|
-
stop: () => import("./stop-
|
|
19
|
+
start: () => import("./start-CJ4XeLwV.mjs"),
|
|
20
|
+
restart: () => import("./restart-B0XSXYtj.mjs"),
|
|
21
|
+
status: () => import("./status-6NyZu0f_.mjs"),
|
|
22
|
+
stop: () => import("./stop-BY1c7cUX.mjs")
|
|
23
23
|
},
|
|
24
|
-
session: {
|
|
25
|
-
|
|
24
|
+
session: {
|
|
25
|
+
link: () => import("./link-CsfmcRa8.mjs"),
|
|
26
|
+
relink: () => import("./relink-BlRMYOra.mjs")
|
|
27
|
+
},
|
|
28
|
+
thread: {
|
|
29
|
+
list: () => import("./list-C60d6ifJ.mjs"),
|
|
30
|
+
fork: () => import("./fork-CAu8PdA3.mjs")
|
|
31
|
+
},
|
|
32
|
+
acp: () => import("./acp-BTtByOlX.mjs"),
|
|
26
33
|
plugin: {
|
|
27
|
-
add: () => import("./add-
|
|
28
|
-
check: () => import("./check-
|
|
29
|
-
install: () => import("./install-
|
|
30
|
-
list: () => import("./list-
|
|
31
|
-
reload: () => import("./reload-
|
|
32
|
-
remove: () => import("./remove-
|
|
33
|
-
update: () => import("./update-
|
|
34
|
+
add: () => import("./add-Dm3RaxB1.mjs"),
|
|
35
|
+
check: () => import("./check-BdfxwBaL.mjs"),
|
|
36
|
+
install: () => import("./install-D5kkATcv.mjs"),
|
|
37
|
+
list: () => import("./list-CakHFl9C.mjs"),
|
|
38
|
+
reload: () => import("./reload-h_2WARQN.mjs"),
|
|
39
|
+
remove: () => import("./remove-CVbXLNTb.mjs"),
|
|
40
|
+
update: () => import("./update-CORsF38E.mjs")
|
|
34
41
|
},
|
|
35
42
|
models: {
|
|
36
|
-
$: () => import("./list-
|
|
37
|
-
providers: () => import("./providers-
|
|
38
|
-
refresh: () => import("./refresh-
|
|
43
|
+
$: () => import("./list-CHIzxyZx.mjs"),
|
|
44
|
+
providers: () => import("./providers-DVh6hhLU.mjs"),
|
|
45
|
+
refresh: () => import("./refresh-tj3xbNRY.mjs")
|
|
39
46
|
}
|
|
40
47
|
});
|
|
41
48
|
const main = run(Cmd, Handlers, { version }).pipe(Effect.provide(NodeServices.layer));
|
package/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["Runtime.handlers","Runtime.run","pkg.version"],"sources":["../../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport { Effect } from \"effect\";\nimport type { CliError } from \"effect/cli\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { Cmd } from \"./cli/cmd/cmd.ts\";\nimport type { CommandError } from \"./cli/error.ts\";\nimport { Runtime } from \"./framework/runtime.ts\";\n\nconst Handlers = Runtime.handlers(Cmd, {\n\tauth: {\n\t\tlogin: () => import(\"./cli/cmd/handlers/auth/login.ts\"),\n\t\tstatus: () => import(\"./cli/cmd/handlers/auth/status.ts\"),\n\t\trefresh: () => import(\"./cli/cmd/handlers/auth/refresh.ts\"),\n\t\tlogout: () => import(\"./cli/cmd/handlers/auth/logout.ts\"),\n\t},\n\trun: () => import(\"./cli/cmd/handlers/run.ts\"),\n\ttui: () => import(\"./cli/cmd/handlers/tui.ts\"),\n\tserve: () => import(\"./cli/cmd/handlers/serve.ts\"),\n\tservice: {\n\t\tstart: () => import(\"./cli/cmd/handlers/service/start.ts\"),\n\t\trestart: () => import(\"./cli/cmd/handlers/service/restart.ts\"),\n\t\tstatus: () => import(\"./cli/cmd/handlers/service/status.ts\"),\n\t\tstop: () => import(\"./cli/cmd/handlers/service/stop.ts\"),\n\t},\n\tsession: {\n\t\tlink: () => import(\"./cli/cmd/handlers/session/link.ts\"),\n\t},\n\tacp: () => import(\"./cli/cmd/handlers/acp.ts\"),\n\tplugin: {\n\t\tadd: () => import(\"./cli/cmd/handlers/plugin/add.ts\"),\n\t\tcheck: () => import(\"./cli/cmd/handlers/plugin/check.ts\"),\n\t\tinstall: () => import(\"./cli/cmd/handlers/plugin/install.ts\"),\n\t\tlist: () => import(\"./cli/cmd/handlers/plugin/list.ts\"),\n\t\treload: () => import(\"./cli/cmd/handlers/plugin/reload.ts\"),\n\t\tremove: () => import(\"./cli/cmd/handlers/plugin/remove.ts\"),\n\t\tupdate: () => import(\"./cli/cmd/handlers/plugin/update.ts\"),\n\t},\n\tmodels: {\n\t\t$: () => import(\"./cli/cmd/handlers/models/list.ts\"),\n\t\tproviders: () => import(\"./cli/cmd/handlers/models/providers.ts\"),\n\t\trefresh: () => import(\"./cli/cmd/handlers/models/refresh.ts\"),\n\t},\n});\n\nexport const main: Effect.Effect<void, CommandError | CliError.CliError> = Runtime.run(Cmd, Handlers, {\n\tversion: pkg.version,\n}).pipe(Effect.provide(NodeServices.layer));\n\nNodeRuntime.runMain(main);\n"],"mappings":";;;;;;;AAWA,MAAM,WAAWA,SAAiB,KAAK;CACtC,MAAM;EACL,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,eAAe,OAAO;EACtB,cAAc,OAAO;CACtB;CACA,WAAW,OAAO;CAClB,WAAW,OAAO;CAClB,aAAa,OAAO;CACpB,SAAS;EACR,aAAa,OAAO;EACpB,eAAe,OAAO;EACtB,cAAc,OAAO;EACrB,YAAY,OAAO;CACpB;CACA,SAAS
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["Runtime.handlers","Runtime.run","pkg.version"],"sources":["../../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport { Effect } from \"effect\";\nimport type { CliError } from \"effect/cli\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { Cmd } from \"./cli/cmd/cmd.ts\";\nimport type { CommandError } from \"./cli/error.ts\";\nimport { Runtime } from \"./framework/runtime.ts\";\n\nconst Handlers = Runtime.handlers(Cmd, {\n\tauth: {\n\t\tlogin: () => import(\"./cli/cmd/handlers/auth/login.ts\"),\n\t\tstatus: () => import(\"./cli/cmd/handlers/auth/status.ts\"),\n\t\trefresh: () => import(\"./cli/cmd/handlers/auth/refresh.ts\"),\n\t\tlogout: () => import(\"./cli/cmd/handlers/auth/logout.ts\"),\n\t},\n\trun: () => import(\"./cli/cmd/handlers/run.ts\"),\n\ttui: () => import(\"./cli/cmd/handlers/tui.ts\"),\n\tserve: () => import(\"./cli/cmd/handlers/serve.ts\"),\n\tservice: {\n\t\tstart: () => import(\"./cli/cmd/handlers/service/start.ts\"),\n\t\trestart: () => import(\"./cli/cmd/handlers/service/restart.ts\"),\n\t\tstatus: () => import(\"./cli/cmd/handlers/service/status.ts\"),\n\t\tstop: () => import(\"./cli/cmd/handlers/service/stop.ts\"),\n\t},\n\tsession: {\n\t\tlink: () => import(\"./cli/cmd/handlers/session/link.ts\"),\n\t\trelink: () => import(\"./cli/cmd/handlers/session/relink.ts\"),\n\t},\n\tthread: {\n\t\tlist: () => import(\"./cli/cmd/handlers/thread/list.ts\"),\n\t\tfork: () => import(\"./cli/cmd/handlers/thread/fork.ts\"),\n\t},\n\tacp: () => import(\"./cli/cmd/handlers/acp.ts\"),\n\tplugin: {\n\t\tadd: () => import(\"./cli/cmd/handlers/plugin/add.ts\"),\n\t\tcheck: () => import(\"./cli/cmd/handlers/plugin/check.ts\"),\n\t\tinstall: () => import(\"./cli/cmd/handlers/plugin/install.ts\"),\n\t\tlist: () => import(\"./cli/cmd/handlers/plugin/list.ts\"),\n\t\treload: () => import(\"./cli/cmd/handlers/plugin/reload.ts\"),\n\t\tremove: () => import(\"./cli/cmd/handlers/plugin/remove.ts\"),\n\t\tupdate: () => import(\"./cli/cmd/handlers/plugin/update.ts\"),\n\t},\n\tmodels: {\n\t\t$: () => import(\"./cli/cmd/handlers/models/list.ts\"),\n\t\tproviders: () => import(\"./cli/cmd/handlers/models/providers.ts\"),\n\t\trefresh: () => import(\"./cli/cmd/handlers/models/refresh.ts\"),\n\t},\n});\n\nexport const main: Effect.Effect<void, CommandError | CliError.CliError> = Runtime.run(Cmd, Handlers, {\n\tversion: pkg.version,\n}).pipe(Effect.provide(NodeServices.layer));\n\nNodeRuntime.runMain(main);\n"],"mappings":";;;;;;;AAWA,MAAM,WAAWA,SAAiB,KAAK;CACtC,MAAM;EACL,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,eAAe,OAAO;EACtB,cAAc,OAAO;CACtB;CACA,WAAW,OAAO;CAClB,WAAW,OAAO;CAClB,aAAa,OAAO;CACpB,SAAS;EACR,aAAa,OAAO;EACpB,eAAe,OAAO;EACtB,cAAc,OAAO;EACrB,YAAY,OAAO;CACpB;CACA,SAAS;EACR,YAAY,OAAO;EACnB,cAAc,OAAO;CACtB;CACA,QAAQ;EACP,YAAY,OAAO;EACnB,YAAY,OAAO;CACpB;CACA,WAAW,OAAO;CAClB,QAAQ;EACP,WAAW,OAAO;EAClB,aAAa,OAAO;EACpB,eAAe,OAAO;EACtB,YAAY,OAAO;EACnB,cAAc,OAAO;EACrB,cAAc,OAAO;EACrB,cAAc,OAAO;CACtB;CACA,QAAQ;EACP,SAAS,OAAO;EAChB,iBAAiB,OAAO;EACxB,eAAe,OAAO;CACvB;AACD,CAAC;AAED,MAAa,OAA8DC,IAAY,KAAK,UAAU,EAC5FC,QACV,CAAC,CAAC,CAAC,KAAK,OAAO,QAAQ,aAAa,KAAK,CAAC;AAE1C,YAAY,QAAQ,IAAI"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { i as Cmd, t as handler } from "./runtime-
|
|
2
|
-
import {
|
|
3
|
-
import { i as read, t as fetchable } from "./entries-
|
|
1
|
+
import { i as Cmd, t as handler } from "./runtime-Bg4mc9BB.mjs";
|
|
2
|
+
import { f as writeOut, i as reportFailure } from "./error-CSeYCa9R.mjs";
|
|
3
|
+
import { i as read, t as fetchable } from "./entries-C6AeEOS1.mjs";
|
|
4
4
|
import { Effect } from "effect";
|
|
5
5
|
import { Plugin } from "@codeworksh/harness/effect";
|
|
6
6
|
//#region src/cli/cmd/handlers/plugin/install.ts
|
|
@@ -51,4 +51,4 @@ var install_default = handler(Cmd.commands.plugin.commands.install, Effect.fn("C
|
|
|
51
51
|
//#endregion
|
|
52
52
|
export { install_default as default };
|
|
53
53
|
|
|
54
|
-
//# sourceMappingURL=install-
|
|
54
|
+
//# sourceMappingURL=install-D5kkATcv.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-
|
|
1
|
+
{"version":3,"file":"install-D5kkATcv.mjs","names":["Runtime.handler"],"sources":["../../src/cli/cmd/handlers/plugin/install.ts"],"sourcesContent":["import { Plugin } from \"@codeworksh/harness/effect\";\nimport { Effect } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport { fetchable, read } from \"./entries.ts\";\n\n/**\n * `plugin install`, with no argument: the answer to a fresh checkout.\n *\n * A committed `.codework/settings.jsonc` names plugins, the store on a colleague's machine is\n * empty, and something has to materialise them. This is `npm install` with no arguments -- it\n * writes no settings entry, because the entries already exist.\n *\n * It is also what lets **boot stay offline**. Without it the only path from an entry to bytes is a\n * boot that installs, which makes every fresh start a possible network wait; with it, boot\n * resolves or reports, and the error names this command as the remedy.\n */\nexport default Runtime.handler(\n\tCmd.commands.plugin.commands.install,\n\tEffect.fn(\"CLI.plugin.install\")(function* () {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst shared = yield* Cmd.spec;\n\t\t\tconst { entries, cache } = yield* read(shared);\n\n\t\t\tlet installed = 0;\n\t\t\tlet present = 0;\n\t\t\tlet local = 0;\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst target = fetchable(entry.target);\n\t\t\t\tif (target === undefined) {\n\t\t\t\t\t// A local plugin is loaded where it lies and never copied into the store, so\n\t\t\t\t\t// there is nothing to install. An unparseable entry is `list`'s to report.\n\t\t\t\t\tlocal += 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ((yield* Plugin.resolve(target, cache, entry.from)) !== undefined) {\n\t\t\t\t\tpresent += 1;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t// `inspect` installs, imports and validates, so a spec that turns out not to be a\n\t\t\t\t// plugin fails here rather than at the next run. The reported ID comes from the\n\t\t\t\t// module, never from the spec.\n\t\t\t\tconst plugin = yield* Plugin.inspect(entry.reference, { cache, hostDir: entry.from, file: entry.file });\n\t\t\t\tinstalled += 1;\n\t\t\t\tyield* writeOut(`Installed ${entry.reference} (${plugin.id})\\n`);\n\t\t\t}\n\n\t\t\tconst parts = [\n\t\t\t\t`${installed} installed`,\n\t\t\t\t...(present === 0 ? [] : [`${present} already present`]),\n\t\t\t\t...(local === 0 ? [] : [`${local} local`]),\n\t\t\t];\n\t\t\tyield* writeOut(`${parts.join(\", \")}\\n`);\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,IAAA,kBAAeA,QACd,IAAI,SAAS,OAAO,SAAS,SAC7B,OAAO,GAAG,oBAAoB,CAAC,CAAC,aAAa;CAoC5C,OAAO,OAnCS,OAAO,IAAI,aAAa;EACvC,MAAM,SAAS,OAAO,IAAI;EAC1B,MAAM,EAAE,SAAS,UAAU,OAAO,KAAK,MAAM;EAE7C,IAAI,YAAY;EAChB,IAAI,UAAU;EACd,IAAI,QAAQ;EACZ,KAAK,MAAM,SAAS,SAAS;GAC5B,MAAM,SAAS,UAAU,MAAM,MAAM;GACrC,IAAI,WAAW,KAAA,GAAW;IAGzB,SAAS;IACT;GACD;GACA,KAAK,OAAO,OAAO,QAAQ,QAAQ,OAAO,MAAM,IAAI,OAAO,KAAA,GAAW;IACrE,WAAW;IACX;GACD;GAIA,MAAM,SAAS,OAAO,OAAO,QAAQ,MAAM,WAAW;IAAE;IAAO,SAAS,MAAM;IAAM,MAAM,MAAM;GAAK,CAAC;GACtG,aAAa;GACb,OAAO,SAAS,aAAa,MAAM,UAAU,IAAI,OAAO,GAAG,IAAI;EAChE;EAEA,MAAM,QAAQ;GACb,GAAG,UAAU;GACb,GAAI,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,iBAAiB;GACtD,GAAI,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO;EACzC;EACA,OAAO,SAAS,GAAG,MAAM,KAAK,IAAI,EAAE,GAAG;CACxC,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as Cmd, t as handler } from "./runtime-
|
|
2
|
-
import {
|
|
1
|
+
import { i as Cmd, t as handler } from "./runtime-Bg4mc9BB.mjs";
|
|
2
|
+
import { f as writeOut, i as reportFailure, m as make, p as layer } from "./error-CSeYCa9R.mjs";
|
|
3
3
|
import { Effect, Option, Path } from "effect";
|
|
4
4
|
import { Session } from "@codeworksh/harness/effect";
|
|
5
5
|
//#region src/cli/cmd/handlers/session/link.ts
|
|
@@ -38,4 +38,4 @@ var link_default = handler(Cmd.commands.session.commands.link, Effect.fn("CLI.se
|
|
|
38
38
|
//#endregion
|
|
39
39
|
export { link_default as default };
|
|
40
40
|
|
|
41
|
-
//# sourceMappingURL=link-
|
|
41
|
+
//# sourceMappingURL=link-CsfmcRa8.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-
|
|
1
|
+
{"version":3,"file":"link-CsfmcRa8.mjs","names":["Runtime.handler","Client.make","Client.layer"],"sources":["../../src/cli/cmd/handlers/session/link.ts"],"sourcesContent":["import { Session } from \"@codeworksh/harness/effect\";\nimport { Effect, Option, Path } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Client } from \"../../../../server/client.ts\";\nimport { Cmd } from \"../../cmd.ts\";\n\n/**\n * Sets `hostDir` on an existing session.\n *\n * **The session ID identifies it; the path is the target.** A project cannot identify a session --\n * it may have many or none, and it is the session that carries the field.\n *\n * The path defaults to the shell's directory, which is both the common case (you are standing in\n * the project you want to link) and safe to default: the CLI runs on the host, so the trust\n * question about naming host paths is about remote clients, not about a local shell's own cwd.\n *\n * Not `session relink`, which moves a session to another checkout of the same project. Different\n * axes -- `relink` changes where the *work* happens, `link` changes which host directory the\n * session is *anchored to* -- and conflating them would recreate the confusion the two names\n * exist to avoid.\n *\n * The anchor is not a settings mechanism. Settings discovery reads it, so do plugin installs, and\n * so will whatever needs a host-side directory next; naming any one of them in the description is\n * what made this read like a settings flag.\n */\nexport default Runtime.handler(\n\tCmd.commands.session.commands.link,\n\tEffect.fn(\"CLI.session.link\")(function* ({ session, path, unlink, server }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst nodePath = yield* Path.Path;\n\t\t\tconst rpc = yield* Client.make;\n\t\t\tconst sessionId = Session.SessionSchema.ID.make(session);\n\t\t\tconst hostDir = unlink\n\t\t\t\t? undefined\n\t\t\t\t: Session.AbsolutePath.make(nodePath.resolve(Option.getOrElse(path, () => \".\")));\n\n\t\t\tconst info = yield* rpc[\"session.link\"]({\n\t\t\t\tsessionId,\n\t\t\t\t...(hostDir === undefined ? {} : { hostDir }),\n\t\t\t});\n\t\t\t// Settings are re-read every exchange, so this applies at the next one: no reload, no\n\t\t\t// restart, the project layer simply starts or stops being read.\n\t\t\tyield* writeOut(\n\t\t\t\tinfo.hostDir === undefined\n\t\t\t\t\t? `Unlinked ${info.id}; it now reads the user settings alone.\\n`\n\t\t\t\t\t: `Linked ${info.id} to ${info.hostDir}\\n`,\n\t\t\t);\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.provide(Client.layer(server)), Effect.scoped, Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAA,eAAeA,QACd,IAAI,SAAS,QAAQ,SAAS,MAC9B,OAAO,GAAG,kBAAkB,CAAC,CAAC,WAAW,EAAE,SAAS,MAAM,QAAQ,UAAU;CAsB3E,OAAO,OArBS,OAAO,IAAI,aAAa;EACvC,MAAM,WAAW,OAAO,KAAK;EAC7B,MAAM,MAAM,OAAOC;EACnB,MAAM,YAAY,QAAQ,cAAc,GAAG,KAAK,OAAO;EACvD,MAAM,UAAU,SACb,KAAA,IACA,QAAQ,aAAa,KAAK,SAAS,QAAQ,OAAO,UAAU,YAAY,GAAG,CAAC,CAAC;EAEhF,MAAM,OAAO,OAAO,IAAI,eAAe,CAAC;GACvC;GACA,GAAI,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ;EAC5C,CAAC;EAGD,OAAO,SACN,KAAK,YAAY,KAAA,IACd,YAAY,KAAK,GAAG,6CACpB,UAAU,KAAK,GAAG,MAAM,KAAK,QAAQ,GACzC;CACD,CAEoB,CAAC,CAAC,KAAK,OAAO,QAAQC,MAAa,MAAM,CAAC,GAAG,OAAO,QAAQ,OAAO,MAAM,aAAa,CAAC;AAC5G,CAAC,CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { i as Cmd, t as handler } from "./runtime-Bg4mc9BB.mjs";
|
|
2
|
+
import { d as writeJson, f as writeOut, i as reportFailure, m as make, p as layer, v as ThreadInfo } from "./error-CSeYCa9R.mjs";
|
|
3
|
+
import { Effect, Schema } from "effect";
|
|
4
|
+
import { Session } from "@codeworksh/harness/effect";
|
|
5
|
+
//#region src/cli/cmd/handlers/thread/list.ts
|
|
6
|
+
const origin = (info) => {
|
|
7
|
+
switch (info.origin.kind) {
|
|
8
|
+
case "main": return "main";
|
|
9
|
+
case "fork": return `fork of ${info.origin.threadId}`;
|
|
10
|
+
case "subagent": return `subagent of ${info.origin.threadId}`;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
const cost = (info) => `$${info.usage.cost.toFixed(4)}`;
|
|
14
|
+
var list_default = handler(Cmd.commands.thread.commands.list, Effect.fn("CLI.thread.list")(function* ({ session, json, server }) {
|
|
15
|
+
return yield* Effect.gen(function* () {
|
|
16
|
+
const threads = yield* (yield* make)["thread.list"]({ sessionId: Session.SessionSchema.ID.make(session) });
|
|
17
|
+
if (json) return yield* writeJson(Schema.Array(ThreadInfo), threads);
|
|
18
|
+
if (threads.length === 0) return yield* writeOut(`No threads in ${session}.\n`);
|
|
19
|
+
const rows = threads.map((info) => [
|
|
20
|
+
info.id,
|
|
21
|
+
origin(info),
|
|
22
|
+
info.model === void 0 ? "-" : `${info.model.provider}/${info.model.id}`,
|
|
23
|
+
`${info.usage.input + info.usage.output} tok ${cost(info)}`,
|
|
24
|
+
info.title ?? "(untitled)"
|
|
25
|
+
]);
|
|
26
|
+
const widths = rows[0]?.map((_, column) => Math.max(...rows.map((row) => row[column]?.length ?? 0))) ?? [];
|
|
27
|
+
for (const row of rows) {
|
|
28
|
+
const last = row.length - 1;
|
|
29
|
+
yield* writeOut(`${row.map((cell, column) => column === last ? cell : cell.padEnd(widths[column] ?? 0)).join(" ")}\n`);
|
|
30
|
+
}
|
|
31
|
+
}).pipe(Effect.provide(layer(server)), Effect.scoped, Effect.catch(reportFailure));
|
|
32
|
+
}));
|
|
33
|
+
//#endregion
|
|
34
|
+
export { list_default as default };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=list-C60d6ifJ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-C60d6ifJ.mjs","names":["Runtime.handler","Client.make","ThreadInfoSchema","Client.layer"],"sources":["../../src/cli/cmd/handlers/thread/list.ts"],"sourcesContent":["import { Session } from \"@codeworksh/harness/effect\";\nimport { Effect, Schema } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { Client } from \"../../../../server/client.ts\";\nimport { type ThreadInfo, ThreadInfo as ThreadInfoSchema } from \"../../../../server/contract.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeJson, writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\n\nconst origin = (info: ThreadInfo): string => {\n\tswitch (info.origin.kind) {\n\t\tcase \"main\":\n\t\t\treturn \"main\";\n\t\tcase \"fork\":\n\t\t\treturn `fork of ${info.origin.threadId}`;\n\t\tcase \"subagent\":\n\t\t\treturn `subagent of ${info.origin.threadId}`;\n\t}\n};\n\nconst cost = (info: ThreadInfo) => `$${info.usage.cost.toFixed(4)}`;\n\nexport default Runtime.handler(\n\tCmd.commands.thread.commands.list,\n\tEffect.fn(\"CLI.thread.list\")(function* ({ session, json, server }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst rpc = yield* Client.make;\n\t\t\tconst threads = yield* rpc[\"thread.list\"]({ sessionId: Session.SessionSchema.ID.make(session) });\n\t\t\tif (json) return yield* writeJson(Schema.Array(ThreadInfoSchema), threads);\n\t\t\tif (threads.length === 0) return yield* writeOut(`No threads in ${session}.\\n`);\n\t\t\tconst rows = threads.map((info) => [\n\t\t\t\tinfo.id,\n\t\t\t\torigin(info),\n\t\t\t\tinfo.model === undefined ? \"-\" : `${info.model.provider}/${info.model.id}`,\n\t\t\t\t`${info.usage.input + info.usage.output} tok ${cost(info)}`,\n\t\t\t\tinfo.title ?? \"(untitled)\",\n\t\t\t]);\n\t\t\tconst widths = rows[0]?.map((_, column) => Math.max(...rows.map((row) => row[column]?.length ?? 0))) ?? [];\n\t\t\tfor (const row of rows) {\n\t\t\t\tconst last = row.length - 1;\n\t\t\t\tyield* writeOut(\n\t\t\t\t\t`${row.map((cell, column) => (column === last ? cell : cell.padEnd(widths[column] ?? 0))).join(\" \")}\\n`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.provide(Client.layer(server)), Effect.scoped, Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;AASA,MAAM,UAAU,SAA6B;CAC5C,QAAQ,KAAK,OAAO,MAApB;EACC,KAAK,QACJ,OAAO;EACR,KAAK,QACJ,OAAO,WAAW,KAAK,OAAO;EAC/B,KAAK,YACJ,OAAO,eAAe,KAAK,OAAO;CACpC;AACD;AAEA,MAAM,QAAQ,SAAqB,IAAI,KAAK,MAAM,KAAK,QAAQ,CAAC;AAEhE,IAAA,eAAeA,QACd,IAAI,SAAS,OAAO,SAAS,MAC7B,OAAO,GAAG,iBAAiB,CAAC,CAAC,WAAW,EAAE,SAAS,MAAM,UAAU;CAsBlE,OAAO,OArBS,OAAO,IAAI,aAAa;EAEvC,MAAM,UAAU,QAAO,OADJC,KAAAA,CACQ,cAAc,CAAC,EAAE,WAAW,QAAQ,cAAc,GAAG,KAAK,OAAO,EAAE,CAAC;EAC/F,IAAI,MAAM,OAAO,OAAO,UAAU,OAAO,MAAMC,UAAgB,GAAG,OAAO;EACzE,IAAI,QAAQ,WAAW,GAAG,OAAO,OAAO,SAAS,iBAAiB,QAAQ,IAAI;EAC9E,MAAM,OAAO,QAAQ,KAAK,SAAS;GAClC,KAAK;GACL,OAAO,IAAI;GACX,KAAK,UAAU,KAAA,IAAY,MAAM,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM;GACtE,GAAG,KAAK,MAAM,QAAQ,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI;GACxD,KAAK,SAAS;EACf,CAAC;EACD,MAAM,SAAS,KAAK,EAAE,EAAE,KAAK,GAAG,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;EACzG,KAAK,MAAM,OAAO,MAAM;GACvB,MAAM,OAAO,IAAI,SAAS;GAC1B,OAAO,SACN,GAAG,IAAI,KAAK,MAAM,WAAY,WAAW,OAAO,OAAO,KAAK,OAAO,OAAO,WAAW,CAAC,CAAE,CAAC,CAAC,KAAK,IAAI,EAAE,GACtG;EACD;CACD,CAEoB,CAAC,CAAC,KAAK,OAAO,QAAQC,MAAa,MAAM,CAAC,GAAG,OAAO,QAAQ,OAAO,MAAM,aAAa,CAAC;AAC5G,CAAC,CACF"}
|