@p4code/cli 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/bin.mjs +117 -48
  2. package/dist/client/assets/{DiffPanel-DFWMtwNo.js → DiffPanel-EaFXxHeK.js} +2 -2
  3. package/dist/client/assets/{FilePreviewPanel-hDqwunn1.js → FilePreviewPanel-SHRWa6R7.js} +2 -2
  4. package/dist/client/assets/{PreviewPanel-FkfG2zaH.js → PreviewPanel-CKjYr26f.js} +2 -2
  5. package/dist/client/assets/{angular-html-D1bodirL.js → angular-html-C9jMC3ZQ.js} +2 -2
  6. package/dist/client/assets/{angular-ts-DFwSl5dY.js → angular-ts-CYoSZaKw.js} +2 -2
  7. package/dist/client/assets/{apl-BSgDHbhR.js → apl-CgWZs6Gn.js} +2 -2
  8. package/dist/client/assets/arrow-right-BpqEKABW.js +2 -0
  9. package/dist/client/assets/{astro-B5xAVlWW.js → astro-CUIqu6Jz.js} +2 -2
  10. package/dist/client/assets/{blade-DWwZA3Xz.js → blade-iplcV4Ix.js} +2 -2
  11. package/dist/client/assets/{c-BEpb31ei.js → c-Dd6jN1w_.js} +2 -2
  12. package/dist/client/assets/{cobol-C6zTWyM4.js → cobol-0ScsIx-z.js} +2 -2
  13. package/dist/client/assets/{coffee-DdF9Yam1.js → coffee-KS_79spe.js} +2 -2
  14. package/dist/client/assets/{cpp-DKWi6_r-.js → cpp-BllSLkvw.js} +2 -2
  15. package/dist/client/assets/{crystal-DgkDMi80.js → crystal-DF2_oukQ.js} +2 -2
  16. package/dist/client/assets/{css-Bwoot0jv.js → css-DBr167Oo.js} +2 -2
  17. package/dist/client/assets/{edge-DpISuE7V.js → edge-CRJ0aLAq.js} +2 -2
  18. package/dist/client/assets/{elixir-C01RZc83.js → elixir-DXl1oanW.js} +2 -2
  19. package/dist/client/assets/{elm-Bf8f9rUd.js → elm-CqKx609q.js} +2 -2
  20. package/dist/client/assets/{erb-CIf6pEnP.js → erb-MLJdAbE4.js} +2 -2
  21. package/dist/client/assets/{fileCommentAnnotations-ByCcXh7H.js → fileCommentAnnotations-1icTsJAg.js} +2 -2
  22. package/dist/client/assets/{git-rebase-BvUdIX_d.js → git-rebase-M0aVykt3.js} +2 -2
  23. package/dist/client/assets/{glimmer-js-D81v3RPP.js → glimmer-js-CXPK1DP8.js} +2 -2
  24. package/dist/client/assets/{glimmer-ts-fNKMT61k.js → glimmer-ts-wptUL2fp.js} +2 -2
  25. package/dist/client/assets/{glsl-vja7cLas.js → glsl-BRKhgqUF.js} +2 -2
  26. package/dist/client/assets/{graphql-BAZB24Xe.js → graphql-1BUUHzT4.js} +2 -2
  27. package/dist/client/assets/{hack-CMtrp-V5.js → hack-BR9NLXvX.js} +2 -2
  28. package/dist/client/assets/{haml-DBWpAY-o.js → haml-BgBKuGz0.js} +2 -2
  29. package/dist/client/assets/{handlebars-XK5zfRVr.js → handlebars-BUs0Hgpn.js} +2 -2
  30. package/dist/client/assets/{html-vebb6dVP.js → html-BWwNwdti.js} +2 -2
  31. package/dist/client/assets/{html-derivative-Cw9C5kli.js → html-derivative-B2dGSGlK.js} +2 -2
  32. package/dist/client/assets/{http-BYvuKZHX.js → http-NIyxdCuV.js} +2 -2
  33. package/dist/client/assets/{hurl-CpsMR6xa.js → hurl-CH8mm6dw.js} +2 -2
  34. package/dist/client/assets/{index-BLXLvs73.js → index-kYCDr7kR.js} +187 -187
  35. package/dist/client/assets/{java-RQhZQoJi.js → java-CQPmtuJ5.js} +2 -2
  36. package/dist/client/assets/{javascript-zuHlOJ3o.js → javascript-DzjJJM-s.js} +2 -2
  37. package/dist/client/assets/{jinja-D85yp_cm.js → jinja-4Qs6tVyC.js} +2 -2
  38. package/dist/client/assets/{jison-BrwNTiOp.js → jison-CPG2kEI3.js} +2 -2
  39. package/dist/client/assets/{json-D6zKnh4D.js → json-DlY_RU7e.js} +2 -2
  40. package/dist/client/assets/{jsx-pJNfQcG9.js → jsx-Cd_ApdjY.js} +2 -2
  41. package/dist/client/assets/{julia-DciUhiLe.js → julia-SX8cqtZg.js} +2 -2
  42. package/dist/client/assets/{just-BEjxPLNv.js → just-Ao5BO2B0.js} +2 -2
  43. package/dist/client/assets/{latex-DsAADVlo.js → latex-C46nB2Dk.js} +2 -2
  44. package/dist/client/assets/{liquid-iJJrReic.js → liquid-BMcKK3Z1.js} +2 -2
  45. package/dist/client/assets/{lua-BI7-JqfY.js → lua-DjG6qAWa.js} +2 -2
  46. package/dist/client/assets/{marko-EIBrVtPm.js → marko-3JoFYw3q.js} +2 -2
  47. package/dist/client/assets/{mdc-Ck49TBkx.js → mdc-BpGP1uha.js} +2 -2
  48. package/dist/client/assets/{nginx-DopLa0xS.js → nginx-HOkzmdTd.js} +2 -2
  49. package/dist/client/assets/{nim-COE1mnjh.js → nim-CeKNmMcr.js} +2 -2
  50. package/dist/client/assets/{perl-D7l0Da76.js → perl-BWQkxnsH.js} +2 -2
  51. package/dist/client/assets/{php-BCE4oDfX.js → php-Df4cK7Vr.js} +2 -2
  52. package/dist/client/assets/{pug-B_c7OAy1.js → pug-CoCjyAiE.js} +2 -2
  53. package/dist/client/assets/{qml-k34ZhWfO.js → qml-DYi25PQ3.js} +2 -2
  54. package/dist/client/assets/{r-wgJNeMVi.js → r-BzJkuBsW.js} +2 -2
  55. package/dist/client/assets/{razor-JbycVmC6.js → razor-BhG_PBuW.js} +2 -2
  56. package/dist/client/assets/{regexp-7QFekdWt.js → regexp-BAM54YZk.js} +2 -2
  57. package/dist/client/assets/{rst-C8gOEuzM.js → rst-DHl4hyZ2.js} +2 -2
  58. package/dist/client/assets/{ruby-DfZNo4kq.js → ruby-gNx0WumM.js} +2 -2
  59. package/dist/client/assets/{sas-BJhOgW_o.js → sas-CW83v0Dn.js} +2 -2
  60. package/dist/client/assets/{scss-D926pszU.js → scss-WgrcQHVQ.js} +2 -2
  61. package/dist/client/assets/{shellscript-CoqnDwms.js → shellscript-CKEnN-lX.js} +2 -2
  62. package/dist/client/assets/{shellsession-CGMS8gZk.js → shellsession-BbcmvnCz.js} +2 -2
  63. package/dist/client/assets/{soy-CIKF2D6I.js → soy-D1MIxKdU.js} +2 -2
  64. package/dist/client/assets/{sql-CkVOyoyS.js → sql-Bhxl_Mi7.js} +2 -2
  65. package/dist/client/assets/{stata-CECQ179z.js → stata-C-LT_UBU.js} +2 -2
  66. package/dist/client/assets/{surrealql-Bf1Az_cR.js → surrealql-Ch_ceRvJ.js} +2 -2
  67. package/dist/client/assets/{svelte-BpIBHbiM.js → svelte-DlhsOd0r.js} +2 -2
  68. package/dist/client/assets/{templ-DtxTEUC-.js → templ-CIHR3tEf.js} +2 -2
  69. package/dist/client/assets/{tex-CNvbX85C.js → tex-DRWioNbs.js} +2 -2
  70. package/dist/client/assets/{textarea-Da1Z5UPN.js → textarea-CHMvJ0-S.js} +22 -22
  71. package/dist/client/assets/{ts-tags-B2_hHKj2.js → ts-tags-BvRYwyAy.js} +2 -2
  72. package/dist/client/assets/{tsx-DNp5WCP5.js → tsx-BRkrE5rM.js} +2 -2
  73. package/dist/client/assets/{twig-CBMvmisW.js → twig-BlZvFnQN.js} +2 -2
  74. package/dist/client/assets/{typescript-CD8iaNuH.js → typescript-Djd2wnjW.js} +2 -2
  75. package/dist/client/assets/{vue-BOpxstHd.js → vue-DActsgCM.js} +2 -2
  76. package/dist/client/assets/{vue-html-C7Ua1z7r.js → vue-html-Cqt121Xa.js} +2 -2
  77. package/dist/client/assets/{vue-vine-BW2B7VA6.js → vue-vine-CzSkk7Q4.js} +2 -2
  78. package/dist/client/assets/{xml-J7P8pGRv.js → xml-DPi6y6-m.js} +2 -2
  79. package/dist/client/assets/{xsl-B-mxb3Nx.js → xsl-BAvs_EI4.js} +2 -2
  80. package/dist/client/assets/{yaml-IDU07r3p.js → yaml-DFFGim1C.js} +2 -2
  81. package/dist/client/index.html +2 -2
  82. package/package.json +1 -1
  83. package/dist/client/assets/arrow-right-Cv0-U4r_.js +0 -2
package/dist/bin.mjs CHANGED
@@ -233,7 +233,7 @@ const make$72 = () => {
233
233
  const layer$68 = Layer.sync(NetService, make$72);
234
234
  //#endregion
235
235
  //#region package.json
236
- var version = "0.1.1";
236
+ var version = "0.1.2";
237
237
  //#endregion
238
238
  //#region src/config.ts
239
239
  /**
@@ -8171,6 +8171,7 @@ const WS_METHODS = {
8171
8171
  serverGetSettings: "server.getSettings",
8172
8172
  serverUpdateSettings: "server.updateSettings",
8173
8173
  serverDiscoverSourceControl: "server.discoverSourceControl",
8174
+ serverGetProviderUsage: "server.getProviderUsage",
8174
8175
  serverGetTraceDiagnostics: "server.getTraceDiagnostics",
8175
8176
  serverGetProcessDiagnostics: "server.getProcessDiagnostics",
8176
8177
  serverGetProcessResourceHistory: "server.getProcessResourceHistory",
@@ -8523,6 +8524,16 @@ const WsServerDiscoverSourceControlRpc = Rpc.make(WS_METHODS.serverDiscoverSourc
8523
8524
  success: SourceControlDiscoveryResult,
8524
8525
  error: EnvironmentAuthorizationError
8525
8526
  });
8527
+ /**
8528
+ * The provider's own usage report, as the provider CLI prints it. Read-only and
8529
+ * local to the provider: no model turn is involved, so asking for it costs
8530
+ * nothing and never lands in a thread.
8531
+ */
8532
+ const WsServerGetProviderUsageRpc = Rpc.make(WS_METHODS.serverGetProviderUsage, {
8533
+ payload: Schema$1.Struct({ instanceId: ProviderInstanceId }),
8534
+ success: Schema$1.Struct({ report: Schema$1.String }),
8535
+ error: Schema$1.Union([TextGenerationError, EnvironmentAuthorizationError])
8536
+ });
8526
8537
  const WsServerGetTraceDiagnosticsRpc = Rpc.make(WS_METHODS.serverGetTraceDiagnostics, {
8527
8538
  payload: Schema$1.Struct({}),
8528
8539
  success: ServerTraceDiagnosticsResult,
@@ -8818,7 +8829,7 @@ const WsSubscribeAuthAccessRpc = Rpc.make(WS_METHODS.subscribeAuthAccess, {
8818
8829
  error: Schema$1.Union([AuthAccessStreamError, EnvironmentAuthorizationError]),
8819
8830
  stream: true
8820
8831
  });
8821
- const WsRpcGroup = RpcGroup.make(WsServerProbeRpc, WsServerGetConfigRpc, WsServerRefreshProvidersRpc, WsServerUpdateProviderRpc, WsServerUpdateServerRpc, WsServerUpsertKeybindingRpc, WsServerRemoveKeybindingRpc, WsServerGetSettingsRpc, WsServerUpdateSettingsRpc, WsServerDiscoverSourceControlRpc, WsServerGetTraceDiagnosticsRpc, WsServerGetProcessDiagnosticsRpc, WsServerGetProcessResourceHistoryRpc, WsServerSignalProcessRpc, WsSourceControlLookupRepositoryRpc, WsSourceControlCloneRepositoryRpc, WsSourceControlPublishRepositoryRpc, WsProjectsListEntriesRpc, WsProjectsReadFileRpc, WsProjectsSearchEntriesRpc, WsProjectsWriteFileRpc, WsShellOpenInEditorRpc, WsFilesystemBrowseRpc, WsAssetsCreateUrlRpc, WsSubscribeVcsStatusRpc, WsVcsPullRpc, WsVcsRefreshStatusRpc, WsGitRunStackedActionRpc, WsGitResolvePullRequestRpc, WsGitPreparePullRequestThreadRpc, WsVcsListRefsRpc, WsVcsCreateWorktreeRpc, WsVcsRemoveWorktreeRpc, WsVcsCreateRefRpc, WsVcsSwitchRefRpc, WsVcsInitRpc, WsReviewGetDiffPreviewRpc, WsTerminalOpenRpc, WsTerminalAttachRpc, WsTerminalWriteRpc, WsTerminalResizeRpc, WsTerminalClearRpc, WsTerminalRestartRpc, WsTerminalCloseRpc, WsSubscribeTerminalEventsRpc, WsSubscribeTerminalMetadataRpc, WsPreviewOpenRpc, WsPreviewNavigateRpc, WsPreviewResizeRpc, WsPreviewRefreshRpc, WsPreviewCloseRpc, WsPreviewListRpc, WsPreviewReportStatusRpc, WsPreviewAutomationConnectRpc, WsPreviewAutomationRespondRpc, WsPreviewAutomationFocusHostRpc, WsSubscribePreviewEventsRpc, WsSubscribeDiscoveredLocalServersRpc, WsSubscribeServerConfigRpc, WsSubscribeServerLifecycleRpc, WsSubscribeAuthAccessRpc, WsTasksListRpc, WsTasksGetRpc, WsTasksCreateRpc, WsTasksUpdateRpc, WsTasksDeleteRpc, WsTasksStartThreadRpc, WsSubscribeTasksRpc, WsHubGetSyncStatusRpc, WsHubConnectRpc, WsHubDisconnectRpc, WsHubSetSyncModeRpc, WsHubSetShareModeRpc, WsHubMintTokenRpc, WsSkillsSyncRpc, WsSkillsPublishRpc, WsSkillsPublishAllRpc, WsSkillsUnpublishRpc, WsAssetsReadRpc, WsAssetsSaveRpc, WsAssetsDeleteRpc, WsAssetsCreateLocalRpc, WsAssetsRemoveLocalRpc, WsMcpListRpc, WsMcpSaveRpc, WsMcpRemoveRpc, WsMcpSetSecretRpc, WsOrchestrationDispatchCommandRpc, WsOrchestrationGetTurnDiffRpc, WsOrchestrationGetFullThreadDiffRpc, WsOrchestrationGetArchivedShellSnapshotRpc, WsOrchestrationSubscribeShellRpc, WsOrchestrationSubscribeThreadRpc);
8832
+ const WsRpcGroup = RpcGroup.make(WsServerProbeRpc, WsServerGetConfigRpc, WsServerRefreshProvidersRpc, WsServerUpdateProviderRpc, WsServerUpdateServerRpc, WsServerUpsertKeybindingRpc, WsServerRemoveKeybindingRpc, WsServerGetSettingsRpc, WsServerUpdateSettingsRpc, WsServerDiscoverSourceControlRpc, WsServerGetProviderUsageRpc, WsServerGetTraceDiagnosticsRpc, WsServerGetProcessDiagnosticsRpc, WsServerGetProcessResourceHistoryRpc, WsServerSignalProcessRpc, WsSourceControlLookupRepositoryRpc, WsSourceControlCloneRepositoryRpc, WsSourceControlPublishRepositoryRpc, WsProjectsListEntriesRpc, WsProjectsReadFileRpc, WsProjectsSearchEntriesRpc, WsProjectsWriteFileRpc, WsShellOpenInEditorRpc, WsFilesystemBrowseRpc, WsAssetsCreateUrlRpc, WsSubscribeVcsStatusRpc, WsVcsPullRpc, WsVcsRefreshStatusRpc, WsGitRunStackedActionRpc, WsGitResolvePullRequestRpc, WsGitPreparePullRequestThreadRpc, WsVcsListRefsRpc, WsVcsCreateWorktreeRpc, WsVcsRemoveWorktreeRpc, WsVcsCreateRefRpc, WsVcsSwitchRefRpc, WsVcsInitRpc, WsReviewGetDiffPreviewRpc, WsTerminalOpenRpc, WsTerminalAttachRpc, WsTerminalWriteRpc, WsTerminalResizeRpc, WsTerminalClearRpc, WsTerminalRestartRpc, WsTerminalCloseRpc, WsSubscribeTerminalEventsRpc, WsSubscribeTerminalMetadataRpc, WsPreviewOpenRpc, WsPreviewNavigateRpc, WsPreviewResizeRpc, WsPreviewRefreshRpc, WsPreviewCloseRpc, WsPreviewListRpc, WsPreviewReportStatusRpc, WsPreviewAutomationConnectRpc, WsPreviewAutomationRespondRpc, WsPreviewAutomationFocusHostRpc, WsSubscribePreviewEventsRpc, WsSubscribeDiscoveredLocalServersRpc, WsSubscribeServerConfigRpc, WsSubscribeServerLifecycleRpc, WsSubscribeAuthAccessRpc, WsTasksListRpc, WsTasksGetRpc, WsTasksCreateRpc, WsTasksUpdateRpc, WsTasksDeleteRpc, WsTasksStartThreadRpc, WsSubscribeTasksRpc, WsHubGetSyncStatusRpc, WsHubConnectRpc, WsHubDisconnectRpc, WsHubSetSyncModeRpc, WsHubSetShareModeRpc, WsHubMintTokenRpc, WsSkillsSyncRpc, WsSkillsPublishRpc, WsSkillsPublishAllRpc, WsSkillsUnpublishRpc, WsAssetsReadRpc, WsAssetsSaveRpc, WsAssetsDeleteRpc, WsAssetsCreateLocalRpc, WsAssetsRemoveLocalRpc, WsMcpListRpc, WsMcpSaveRpc, WsMcpRemoveRpc, WsMcpSetSecretRpc, WsOrchestrationDispatchCommandRpc, WsOrchestrationGetTurnDiffRpc, WsOrchestrationGetFullThreadDiffRpc, WsOrchestrationGetArchivedShellSnapshotRpc, WsOrchestrationSubscribeShellRpc, WsOrchestrationSubscribeThreadRpc);
8822
8833
  //#endregion
8823
8834
  //#region ../../packages/shared/src/oauthScope.ts
8824
8835
  const OAUTH_SCOPE_TOKEN = /^[\u0021\u0023-\u005b\u005d-\u007e]+$/u;
@@ -32144,6 +32155,34 @@ const make$37 = Effect.fn("ProviderMaintenanceRunner.make")(function* () {
32144
32155
  });
32145
32156
  const layer$32 = Layer.effect(ProviderMaintenanceRunner, make$37());
32146
32157
  //#endregion
32158
+ //#region src/provider/Services/ProviderInstanceRegistry.ts
32159
+ var ProviderInstanceRegistry = class extends Context.Service()("@p4code/cli/provider/Services/ProviderInstanceRegistry") {};
32160
+ //#endregion
32161
+ //#region src/textGeneration/TextGeneration.ts
32162
+ /**
32163
+ * TextGeneration - Service tag for commit and change request text generation.
32164
+ */
32165
+ var TextGeneration = class extends Context.Service()("@p4code/cli/textGeneration/TextGeneration") {};
32166
+ const resolveInstance = (registry, operation, instanceId) => registry.getInstance(instanceId).pipe(Effect.flatMap((instance) => instance ? Effect.succeed(instance.textGeneration) : Effect.fail(new TextGenerationError({
32167
+ operation,
32168
+ detail: `No provider instance registered for id '${instanceId}'.`
32169
+ }))));
32170
+ const makeTextGenerationFromRegistry = (registry) => TextGeneration.of({
32171
+ generateCommitMessage: (input) => resolveInstance(registry, "generateCommitMessage", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generateCommitMessage(input))),
32172
+ generatePrContent: (input) => resolveInstance(registry, "generatePrContent", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generatePrContent(input))),
32173
+ generateBranchName: (input) => resolveInstance(registry, "generateBranchName", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generateBranchName(input))),
32174
+ generateThreadTitle: (input) => resolveInstance(registry, "generateThreadTitle", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generateThreadTitle(input))),
32175
+ getUsageReport: (input) => resolveInstance(registry, "getUsageReport", input.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.getUsageReport ? textGeneration.getUsageReport(input) : Effect.fail(new TextGenerationError({
32176
+ operation: "getUsageReport",
32177
+ detail: "This provider does not report account usage."
32178
+ }))))
32179
+ });
32180
+ const make$36 = Effect.gen(function* () {
32181
+ const registry = yield* ProviderInstanceRegistry;
32182
+ return makeTextGenerationFromRegistry(registry);
32183
+ });
32184
+ const layer$31 = Layer.effect(TextGeneration, make$36);
32185
+ //#endregion
32147
32186
  //#region ../../packages/shared/src/KeyedCoalescingWorker.ts
32148
32187
  const makeKeyedCoalescingWorker = (options) => Effect.gen(function* () {
32149
32188
  const queue = yield* Effect.acquireRelease(TxQueue.unbounded(), TxQueue.shutdown);
@@ -32441,7 +32480,7 @@ const serversEqual = (left, right) => {
32441
32480
  }
32442
32481
  return true;
32443
32482
  };
32444
- const make$36 = Effect.gen(function* PortDiscoveryMake() {
32483
+ const make$35 = Effect.gen(function* PortDiscoveryMake() {
32445
32484
  const net = yield* NetService;
32446
32485
  const processRunner = yield* ProcessRunner;
32447
32486
  const hostPlatform = yield* HostProcessPlatform;
@@ -32592,7 +32631,7 @@ const make$36 = Effect.gen(function* PortDiscoveryMake() {
32592
32631
  unregisterTerminal
32593
32632
  });
32594
32633
  }).pipe(Effect.withSpan("PortDiscovery.make"));
32595
- const layer$31 = Layer.effect(PortDiscovery, make$36);
32634
+ const layer$30 = Layer.effect(PortDiscovery, make$35);
32596
32635
  //#endregion
32597
32636
  //#region src/terminal/Manager.ts
32598
32637
  /**
@@ -33270,7 +33309,7 @@ function normalizedRuntimeEnv(env) {
33270
33309
  if (entries.length === 0) return null;
33271
33310
  return Object.fromEntries(entries.toSorted(([left], [right]) => left.localeCompare(right)));
33272
33311
  }
33273
- const make$35 = Effect.fn("TerminalManager.make")(function* () {
33312
+ const make$34 = Effect.fn("TerminalManager.make")(function* () {
33274
33313
  const { terminalLogsDir } = yield* ServerConfig$1;
33275
33314
  const ptyAdapter = yield* PtyAdapter;
33276
33315
  const portDiscovery = yield* PortDiscovery;
@@ -34232,7 +34271,7 @@ const makeWithOptions$1 = Effect.fn("TerminalManager.makeWithOptions")(function*
34232
34271
  subscribeMetadata
34233
34272
  });
34234
34273
  });
34235
- const layer$30 = Layer.effect(TerminalManager, make$35()).pipe(Layer.provide(layer$52));
34274
+ const layer$29 = Layer.effect(TerminalManager, make$34()).pipe(Layer.provide(layer$52));
34236
34275
  //#endregion
34237
34276
  //#region src/mcp/McpInvocationContext.ts
34238
34277
  var McpInvocationContext = class extends Context.Service()("@p4code/cli/mcp/McpInvocationContext") {};
@@ -34380,7 +34419,7 @@ const classifyResponseError = (context, error) => {
34380
34419
  });
34381
34420
  }
34382
34421
  };
34383
- const make$34 = Effect.gen(function* PreviewAutomationBrokerMake() {
34422
+ const make$33 = Effect.gen(function* PreviewAutomationBrokerMake() {
34384
34423
  const crypto = yield* Crypto.Crypto;
34385
34424
  const state = yield* SynchronizedRef.make({
34386
34425
  clients: /* @__PURE__ */ new Map(),
@@ -34614,7 +34653,7 @@ const make$34 = Effect.gen(function* PreviewAutomationBrokerMake() {
34614
34653
  invoke
34615
34654
  });
34616
34655
  }).pipe(Effect.withSpan("PreviewAutomationBroker.make"));
34617
- const layer$29 = Layer.effect(PreviewAutomationBroker, make$34);
34656
+ const layer$28 = Layer.effect(PreviewAutomationBroker, make$33);
34618
34657
  //#endregion
34619
34658
  //#region src/preview/Manager.ts
34620
34659
  /**
@@ -34678,7 +34717,7 @@ const buildIdleSnapshot = (input) => ({
34678
34717
  viewport: FILL_PREVIEW_VIEWPORT,
34679
34718
  updatedAt: input.updatedAt
34680
34719
  });
34681
- const make$33 = Effect.gen(function* PreviewManagerMake() {
34720
+ const make$32 = Effect.gen(function* PreviewManagerMake() {
34682
34721
  const serverEpoch = NodeCrypto.randomUUID();
34683
34722
  const stateRef = yield* SynchronizedRef.make(initialState);
34684
34723
  const eventsPubSub = yield* PubSub.unbounded();
@@ -34909,7 +34948,7 @@ const make$33 = Effect.gen(function* PreviewManagerMake() {
34909
34948
  subscribeEvents: PubSub.subscribe(eventsPubSub)
34910
34949
  });
34911
34950
  }).pipe(Effect.withSpan("PreviewManager.make"));
34912
- const layer$28 = Layer.effect(PreviewManager, make$33);
34951
+ const layer$27 = Layer.effect(PreviewManager, make$32);
34913
34952
  //#endregion
34914
34953
  //#region src/workspace/WorkspaceSearchIndex.ts
34915
34954
  const WORKSPACE_INDEX_MAX_ENTRIES = 25e3;
@@ -35043,7 +35082,7 @@ const waitForScan = (cwd, finder, onFailure) => Effect.try({
35043
35082
  timeout: WORKSPACE_INDEX_SCAN_TIMEOUT
35044
35083
  })
35045
35084
  }), Effect.withSpan("WorkspaceSearchIndex.waitForScan"));
35046
- const make$32 = Effect.fn("WorkspaceSearchIndex.make")(function* (cwd) {
35085
+ const make$31 = Effect.fn("WorkspaceSearchIndex.make")(function* (cwd) {
35047
35086
  const finder = yield* Effect.acquireRelease(createFinder(cwd), (finder) => Effect.try({
35048
35087
  try: () => finder.destroy(),
35049
35088
  catch: (cause) => new WorkspaceSearchIndexDestroyFailed({
@@ -35117,9 +35156,9 @@ const make$32 = Effect.fn("WorkspaceSearchIndex.make")(function* (cwd) {
35117
35156
  * workspace root. WorkspaceSearchIndexMap owns memoization and idle cleanup;
35118
35157
  * using a default cwd here would mix resources from different workspaces.
35119
35158
  */
35120
- const layer$27 = (cwd) => Layer.effect(WorkspaceSearchIndex, make$32(cwd));
35159
+ const layer$26 = (cwd) => Layer.effect(WorkspaceSearchIndex, make$31(cwd));
35121
35160
  var WorkspaceSearchIndexMap = class extends LayerMap.Service()("@p4code/cli/workspace/WorkspaceSearchIndexMap", {
35122
- lookup: layer$27,
35161
+ lookup: layer$26,
35123
35162
  idleTimeToLive: WORKSPACE_INDEX_IDLE_TTL
35124
35163
  }) {};
35125
35164
  //#endregion
@@ -35181,7 +35220,7 @@ const resolveBrowseTarget = Effect.fn("WorkspaceEntries.resolveBrowseTarget")(fu
35181
35220
  if (!input.cwd) return yield* new WorkspaceEntriesCurrentProjectRequiredError({ partialPath: input.partialPath });
35182
35221
  return path.resolve(expandHomePath$1(input.cwd, path), input.partialPath);
35183
35222
  });
35184
- const make$31 = Effect.gen(function* () {
35223
+ const make$30 = Effect.gen(function* () {
35185
35224
  const path = yield* Path.Path;
35186
35225
  const workspacePaths = yield* WorkspacePaths;
35187
35226
  const workspaceSearchIndexes = yield* WorkspaceSearchIndexMap;
@@ -35255,7 +35294,7 @@ const make$31 = Effect.gen(function* () {
35255
35294
  search
35256
35295
  });
35257
35296
  });
35258
- const layer$26 = Layer.effect(WorkspaceEntries, make$31).pipe(Layer.provide(WorkspaceSearchIndexMap.layer));
35297
+ const layer$25 = Layer.effect(WorkspaceEntries, make$30).pipe(Layer.provide(WorkspaceSearchIndexMap.layer));
35259
35298
  //#endregion
35260
35299
  //#region src/workspace/WorkspaceFileSystem.ts
35261
35300
  /**
@@ -35324,7 +35363,7 @@ Schema$1.Union([
35324
35363
  ]);
35325
35364
  /** Service tag for workspace file operations. */
35326
35365
  var WorkspaceFileSystem = class extends Context.Service()("@p4code/cli/workspace/WorkspaceFileSystem") {};
35327
- const make$30 = Effect.gen(function* () {
35366
+ const make$29 = Effect.gen(function* () {
35328
35367
  const fileSystem = yield* FileSystem.FileSystem;
35329
35368
  const path = yield* Path.Path;
35330
35369
  const workspacePaths = yield* WorkspacePaths;
@@ -35456,31 +35495,7 @@ const make$30 = Effect.gen(function* () {
35456
35495
  writeFile
35457
35496
  });
35458
35497
  });
35459
- const layer$25 = Layer.effect(WorkspaceFileSystem, make$30);
35460
- //#endregion
35461
- //#region src/provider/Services/ProviderInstanceRegistry.ts
35462
- var ProviderInstanceRegistry = class extends Context.Service()("@p4code/cli/provider/Services/ProviderInstanceRegistry") {};
35463
- //#endregion
35464
- //#region src/textGeneration/TextGeneration.ts
35465
- /**
35466
- * TextGeneration - Service tag for commit and change request text generation.
35467
- */
35468
- var TextGeneration = class extends Context.Service()("@p4code/cli/textGeneration/TextGeneration") {};
35469
- const resolveInstance = (registry, operation, instanceId) => registry.getInstance(instanceId).pipe(Effect.flatMap((instance) => instance ? Effect.succeed(instance.textGeneration) : Effect.fail(new TextGenerationError({
35470
- operation,
35471
- detail: `No provider instance registered for id '${instanceId}'.`
35472
- }))));
35473
- const makeTextGenerationFromRegistry = (registry) => TextGeneration.of({
35474
- generateCommitMessage: (input) => resolveInstance(registry, "generateCommitMessage", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generateCommitMessage(input))),
35475
- generatePrContent: (input) => resolveInstance(registry, "generatePrContent", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generatePrContent(input))),
35476
- generateBranchName: (input) => resolveInstance(registry, "generateBranchName", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generateBranchName(input))),
35477
- generateThreadTitle: (input) => resolveInstance(registry, "generateThreadTitle", input.modelSelection.instanceId).pipe(Effect.flatMap((textGeneration) => textGeneration.generateThreadTitle(input)))
35478
- });
35479
- const make$29 = Effect.gen(function* () {
35480
- const registry = yield* ProviderInstanceRegistry;
35481
- return makeTextGenerationFromRegistry(registry);
35482
- });
35483
- const layer$24 = Layer.effect(TextGeneration, make$29);
35498
+ const layer$24 = Layer.effect(WorkspaceFileSystem, make$29);
35484
35499
  //#endregion
35485
35500
  //#region src/textGeneration/TextGenerationPresets.ts
35486
35501
  const conventionalCommitsTextGenerationPolicy = {
@@ -41295,6 +41310,7 @@ const RPC_REQUIRED_SCOPE = /* @__PURE__ */ new Map([
41295
41310
  [WS_METHODS.serverProbe, AuthOrchestrationReadScope],
41296
41311
  [WS_METHODS.serverGetConfig, AuthOrchestrationReadScope],
41297
41312
  [WS_METHODS.serverRefreshProviders, AuthOrchestrationOperateScope],
41313
+ [WS_METHODS.serverGetProviderUsage, AuthOrchestrationReadScope],
41298
41314
  [WS_METHODS.serverUpdateProvider, AuthOrchestrationOperateScope],
41299
41315
  [WS_METHODS.serverUpdateServer, AuthOrchestrationOperateScope],
41300
41316
  [WS_METHODS.serverUpsertKeybinding, AuthOrchestrationOperateScope],
@@ -41431,6 +41447,7 @@ const makeWsRpcLayer = (currentSession, previewAutomationBroker) => WsRpcGroup.t
41431
41447
  const providerRegistry = yield* ProviderRegistry;
41432
41448
  const providerMaintenanceRunner = yield* ProviderMaintenanceRunner;
41433
41449
  const serverSelfUpdate = yield* ServerSelfUpdate;
41450
+ const textGeneration = yield* TextGeneration;
41434
41451
  const config = yield* ServerConfig$1;
41435
41452
  const lifecycleEvents = yield* ServerLifecycleEvents;
41436
41453
  const serverSettings = yield* ServerSettingsService;
@@ -41865,6 +41882,10 @@ const makeWsRpcLayer = (currentSession, previewAutomationBroker) => WsRpcGroup.t
41865
41882
  [WS_METHODS.serverProbe]: (_input) => observeRpcEffect$1(WS_METHODS.serverProbe, Effect.succeed({}), { "rpc.aggregate": "server" }),
41866
41883
  [WS_METHODS.serverGetConfig]: (_input) => observeRpcEffect$1(WS_METHODS.serverGetConfig, loadServerConfig, { "rpc.aggregate": "server" }),
41867
41884
  [WS_METHODS.serverRefreshProviders]: (input) => observeRpcEffect$1(WS_METHODS.serverRefreshProviders, (input.instanceId !== void 0 ? providerRegistry.refreshInstance(input.instanceId) : providerRegistry.refresh()).pipe(Effect.map((providers) => ({ providers }))), { "rpc.aggregate": "server" }),
41885
+ [WS_METHODS.serverGetProviderUsage]: (input) => observeRpcEffect$1(WS_METHODS.serverGetProviderUsage, textGeneration.getUsageReport ? textGeneration.getUsageReport(input) : Effect.fail(new TextGenerationError({
41886
+ operation: "getUsageReport",
41887
+ detail: "This provider does not report account usage."
41888
+ })), { "rpc.aggregate": "server" }),
41868
41889
  [WS_METHODS.serverUpdateProvider]: (input) => observeRpcEffect$1(WS_METHODS.serverUpdateProvider, providerMaintenanceRunner.updateProvider(input), { "rpc.aggregate": "server" }),
41869
41890
  [WS_METHODS.serverUpdateServer]: (input) => observeRpcEffect$1(WS_METHODS.serverUpdateServer, serverSelfUpdate.update(input), { "rpc.aggregate": "server" }),
41870
41891
  [WS_METHODS.serverUpsertKeybinding]: (rule) => observeRpcEffect$1(WS_METHODS.serverUpsertKeybinding, Effect.gen(function* () {
@@ -45355,13 +45376,21 @@ const makePendingClaudeProvider = (claudeSettings) => Effect.gen(function* () {
45355
45376
  * @module ClaudeTextGeneration
45356
45377
  */
45357
45378
  const CLAUDE_TIMEOUT_MS = 18e4;
45379
+ /** The usage report is a local lookup, so it should return in seconds, not minutes. */
45380
+ const USAGE_REPORT_TIMEOUT_MS = 6e4;
45358
45381
  /**
45359
45382
  * Schema for the wrapper JSON returned by `claude -p --output-format json`.
45360
45383
  * We only care about `structured_output`.
45361
45384
  */
45362
45385
  const ClaudeOutputEnvelope = Schema$1.Struct({ structured_output: Schema$1.Unknown });
45386
+ /**
45387
+ * `claude -p "/usage"` answers with the plain report in `result`. `/usage` is a
45388
+ * CLI-local command, so this costs no turn and no tokens.
45389
+ */
45390
+ const ClaudeResultEnvelope = Schema$1.Struct({ result: Schema$1.String });
45363
45391
  const encodeJsonString$2 = Schema$1.encodeEffect(Schema$1.UnknownFromJsonString);
45364
45392
  const decodeClaudeOutputEnvelope = Schema$1.decodeEffect(Schema$1.fromJsonString(ClaudeOutputEnvelope));
45393
+ const decodeClaudeResultEnvelope = Schema$1.decodeEffect(Schema$1.fromJsonString(ClaudeResultEnvelope));
45365
45394
  const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(function* (claudeSettings, environment) {
45366
45395
  const commandSpawner = yield* ChildProcessSpawner.ChildProcessSpawner;
45367
45396
  const claudeEnvironment = yield* makeClaudeEnvironment(claudeSettings, environment);
@@ -45518,6 +45547,46 @@ const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(function*
45518
45547
  outputSchemaJson: outputSchema,
45519
45548
  modelSelection: input.modelSelection
45520
45549
  })).title) };
45550
+ }),
45551
+ getUsageReport: Effect.fn("ClaudeTextGeneration.getUsageReport")(function* () {
45552
+ const operation = "getUsageReport";
45553
+ const rawStdout = yield* Effect.fn("ClaudeTextGeneration.getUsageReport.run")(function* () {
45554
+ const spawnCommand = yield* resolveSpawnCommand(claudeSettings.binaryPath || "claude", [
45555
+ "-p",
45556
+ "/usage",
45557
+ "--output-format",
45558
+ "json"
45559
+ ], { env: claudeEnvironment });
45560
+ const command = ChildProcess.make(spawnCommand.command, spawnCommand.args, {
45561
+ env: claudeEnvironment,
45562
+ shell: spawnCommand.shell
45563
+ });
45564
+ const child = yield* commandSpawner.spawn(command).pipe(Effect.mapError((cause) => normalizeCliError("claude", operation, cause, "Failed to spawn Claude CLI process")));
45565
+ const [stdout, stderr, exitCode] = yield* Effect.all([
45566
+ readStreamAsString(operation, child.stdout),
45567
+ readStreamAsString(operation, child.stderr),
45568
+ child.exitCode.pipe(Effect.mapError((cause) => normalizeCliError("claude", operation, cause, "Failed to read Claude CLI exit code")))
45569
+ ], { concurrency: "unbounded" });
45570
+ if (exitCode !== 0) {
45571
+ const detail = stderr.trim().length > 0 ? stderr.trim() : stdout.trim();
45572
+ return yield* new TextGenerationError({
45573
+ operation,
45574
+ detail: detail.length > 0 ? `Claude CLI command failed: ${detail}` : `Claude CLI command failed with code ${exitCode}.`
45575
+ });
45576
+ }
45577
+ return stdout;
45578
+ })().pipe(Effect.scoped, Effect.timeoutOption(USAGE_REPORT_TIMEOUT_MS), Effect.flatMap(Option.match({
45579
+ onNone: () => Effect.fail(new TextGenerationError({
45580
+ operation,
45581
+ detail: "Claude CLI request timed out."
45582
+ })),
45583
+ onSome: (value) => Effect.succeed(value)
45584
+ })));
45585
+ return { report: (yield* decodeClaudeResultEnvelope(rawStdout).pipe(Effect.catchTags({ SchemaError: (cause) => Effect.fail(new TextGenerationError({
45586
+ operation,
45587
+ detail: "Claude CLI returned unexpected output format.",
45588
+ cause
45589
+ })) }))).result.trim() };
45521
45590
  })
45522
45591
  };
45523
45592
  });
@@ -83535,18 +83604,18 @@ const ProviderLayerLive = ProviderServiceLive.pipe(Layer.provide(ProviderAdapter
83535
83604
  const PersistenceLayerLive = Layer.empty.pipe(Layer.provideMerge(layerConfig));
83536
83605
  const VcsDriverRegistryLayerLive = layer$35.pipe(Layer.provide(layer$36));
83537
83606
  const SourceControlProviderRegistryLayerLive = layer$14.pipe(Layer.provide(Layer.mergeAll(layer$22, layer$20, layer$18, layer$16)), Layer.provideMerge(layer$37), Layer.provideMerge(VcsDriverRegistryLayerLive));
83538
- const GitManagerLayerLive = layer$13.pipe(Layer.provideMerge(layer$23), Layer.provideMerge(layer$37), Layer.provideMerge(SourceControlProviderRegistryLayerLive), Layer.provideMerge(layer$24));
83607
+ const GitManagerLayerLive = layer$13.pipe(Layer.provideMerge(layer$23), Layer.provideMerge(layer$37), Layer.provideMerge(SourceControlProviderRegistryLayerLive), Layer.provideMerge(layer$31));
83539
83608
  const GitLayerLive = Layer.empty.pipe(Layer.provideMerge(GitManagerLayerLive), Layer.provideMerge(layer$37));
83540
83609
  const GitWorkflowLayerLive = layer$12.pipe(Layer.provideMerge(VcsDriverRegistryLayerLive), Layer.provideMerge(GitLayerLive));
83541
83610
  const SourceControlRepositoryServiceLayerLive = layer$4.pipe(Layer.provideMerge(layer$37), Layer.provideMerge(SourceControlProviderRegistryLayerLive));
83542
83611
  const ReviewLayerLive = layer$9.pipe(Layer.provideMerge(layer$37), Layer.provideMerge(VcsDriverRegistryLayerLive));
83543
83612
  const VcsLayerLive = Layer.empty.pipe(Layer.provideMerge(layer$36), Layer.provideMerge(VcsDriverRegistryLayerLive), Layer.provideMerge(layer$10.pipe(Layer.provide(VcsDriverRegistryLayerLive))), Layer.provideMerge(GitWorkflowLayerLive), Layer.provideMerge(ReviewLayerLive), Layer.provideMerge(SourceControlRepositoryServiceLayerLive), Layer.provideMerge(layer$11.pipe(Layer.provide(GitWorkflowLayerLive))));
83544
83613
  const CheckpointingLayerLive = Layer.empty.pipe(Layer.provideMerge(layer$33), Layer.provideMerge(layer$34.pipe(Layer.provide(VcsDriverRegistryLayerLive))));
83545
- const PortScannerLayerLive = layer$31.pipe(Layer.provide(layer$52));
83546
- const TerminalLayerLive = layer$30.pipe(Layer.provide(PtyAdapterLive), Layer.provide(PortScannerLayerLive));
83547
- const PreviewLayerLive = Layer.empty.pipe(Layer.provideMerge(layer$28), Layer.provideMerge(PortScannerLayerLive));
83548
- const WorkspaceEntriesLayerLive = layer$26.pipe(Layer.provide(layer$42));
83549
- const WorkspaceFileSystemLayerLive = layer$25.pipe(Layer.provide(layer$42), Layer.provide(WorkspaceEntriesLayerLive));
83614
+ const PortScannerLayerLive = layer$30.pipe(Layer.provide(layer$52));
83615
+ const TerminalLayerLive = layer$29.pipe(Layer.provide(PtyAdapterLive), Layer.provide(PortScannerLayerLive));
83616
+ const PreviewLayerLive = Layer.empty.pipe(Layer.provideMerge(layer$27), Layer.provideMerge(PortScannerLayerLive));
83617
+ const WorkspaceEntriesLayerLive = layer$25.pipe(Layer.provide(layer$42));
83618
+ const WorkspaceFileSystemLayerLive = layer$24.pipe(Layer.provide(layer$42), Layer.provide(WorkspaceEntriesLayerLive));
83550
83619
  const WorkspaceLayerLive = Layer.mergeAll(layer$42, WorkspaceEntriesLayerLive, WorkspaceFileSystemLayerLive);
83551
83620
  const ProjectFaviconResolverLayerLive = layer$40.pipe(Layer.provide(layer$42), Layer.provide(layer$41));
83552
83621
  const AuthLayerLive = layer$60.pipe(Layer.provideMerge(PersistenceLayerLive), Layer.provide(layer$64));
@@ -83561,7 +83630,7 @@ const RuntimeDependenciesLive = ReactorLayerLive.pipe(Layer.provideMerge(Checkpo
83561
83630
  */
83562
83631
  const AssetSyncLive = layer$53.pipe(Layer.provideMerge(layer$54), Layer.provideMerge(layer$55));
83563
83632
  const RuntimeServicesLive = layer$43.pipe(Layer.provideMerge(AssetSyncLive), Layer.provideMerge(RuntimeDependenciesLive));
83564
- const makeRoutesLayer = Layer.mergeAll(Layer.mergeAll(HttpApiBuilder.layer(EnvironmentHttpApi).pipe(Layer.provide(authHttpApiLayer), Layer.provide(orchestrationHttpApiLayer), Layer.provide(serverEnvironmentHttpApiLayer), Layer.provide(environmentAuthenticatedAuthLayer)), otlpTracesProxyRouteLayer, assetRouteLayer, staticAndDevRouteLayer, websocketRpcRouteLayer), layer.pipe(Layer.provide(layer$2))).pipe(Layer.provide(TaskRepositoryLive.pipe(Layer.provide(PersistenceLayerLive))), Layer.provide(ProjectionProjectRepositoryLive.pipe(Layer.provide(PersistenceLayerLive))), Layer.provide(layer$29), Layer.provide(layer$45), Layer.provide(browserApiCorsLayer), Layer.provide(httpCompressionLayer));
83633
+ const makeRoutesLayer = Layer.mergeAll(Layer.mergeAll(HttpApiBuilder.layer(EnvironmentHttpApi).pipe(Layer.provide(authHttpApiLayer), Layer.provide(orchestrationHttpApiLayer), Layer.provide(serverEnvironmentHttpApiLayer), Layer.provide(environmentAuthenticatedAuthLayer)), otlpTracesProxyRouteLayer, assetRouteLayer, staticAndDevRouteLayer, websocketRpcRouteLayer), layer.pipe(Layer.provide(layer$2))).pipe(Layer.provide(TaskRepositoryLive.pipe(Layer.provide(PersistenceLayerLive))), Layer.provide(ProjectionProjectRepositoryLive.pipe(Layer.provide(PersistenceLayerLive))), Layer.provide(layer$28), Layer.provide(layer$45), Layer.provide(browserApiCorsLayer), Layer.provide(httpCompressionLayer));
83565
83634
  const makeServerLayer = Layer.unwrap(Effect.gen(function* () {
83566
83635
  const config = yield* ServerConfig$1;
83567
83636
  yield* fixPath();