@liberseek/boft-cli-win32-arm64 0.6.9 → 0.7.1

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 (36) hide show
  1. package/README.md +1 -1
  2. package/THIRD_PARTY_NOTICES.txt +12 -4
  3. package/app/codexhost-distribution.json +1 -1
  4. package/app/desktop-controller.mjs +287 -170
  5. package/app/host-runtime.mjs +2450 -1044
  6. package/app/plugins/antigravity/plugin.mjs +167 -16
  7. package/app/plugins/claude-code/plugin.mjs +311 -58
  8. package/app/plugins/codebuddy/plugin.mjs +2355 -894
  9. package/app/plugins/cursor-cli/plugin.mjs +35973 -10933
  10. package/app/plugins/deepseek-harness/plugin.mjs +125 -7
  11. package/app/plugins/enabled.json +4 -1
  12. package/app/plugins/grok/plugin.mjs +261 -97
  13. package/app/plugins/hermes/plugin.mjs +2486 -99
  14. package/app/plugins/kiro-cli/plugin.mjs +120 -3
  15. package/app/plugins/muse/plugin.mjs +110 -0
  16. package/app/plugins/omp/plugin.mjs +145 -10
  17. package/app/plugins/opencode/plugin.mjs +162 -46
  18. package/app/plugins/pi/plugin.mjs +2891 -1678
  19. package/app/plugins/qoder/assets/icon.svg +1 -0
  20. package/app/plugins/qoder/manifest.json +12 -0
  21. package/app/plugins/qoder/plugin.mjs +52352 -0
  22. package/app/plugins/qoder-cn/assets/icon.svg +1 -0
  23. package/app/plugins/qoder-cn/manifest.json +12 -0
  24. package/app/plugins/qoder-cn/plugin.mjs +52350 -0
  25. package/app/plugins/workbuddy/assets/icon.svg +29 -0
  26. package/app/plugins/workbuddy/manifest.json +14 -0
  27. package/app/plugins/workbuddy/plugin.mjs +25007 -0
  28. package/app/renderer-extension.js +6043 -1442
  29. package/bin/boft.exe +0 -0
  30. package/libexec/boft-node-repl.exe +0 -0
  31. package/libexec/boft-shim.exe +0 -0
  32. package/libexec/boft-updater.exe +0 -0
  33. package/licenses/Qoder-Agent-SDK-LICENSE.txt +7 -0
  34. package/licenses/QoderCN-Agent-SDK-LICENSE.txt +7 -0
  35. package/licenses/{opencodex-LICENSE.txt → tailwindcss-LICENSE.txt} +1 -1
  36. package/package.json +1 -1
@@ -14523,9 +14523,104 @@ function date4(params) {
14523
14523
  // ../../../node_modules/zod/v4/classic/external.js
14524
14524
  config(en_default());
14525
14525
 
14526
+ // ../../shared-contracts/dist/credential-imports.js
14527
+ var credentialSourceSchema = external_exports.object({
14528
+ id: external_exports.string().min(1).max(256),
14529
+ harnessId: external_exports.string().min(1),
14530
+ label: external_exports.string().min(1).max(512),
14531
+ provider: external_exports.enum(["openai-codex", "xai"])
14532
+ }).strict();
14533
+ var credentialImportNameSchema = external_exports.string().regex(/^[a-z][a-z0-9-]{0,47}$/);
14534
+ var credentialImportRecordSchema = external_exports.object({
14535
+ name: credentialImportNameSchema,
14536
+ source: credentialSourceSchema,
14537
+ importedAt: external_exports.string()
14538
+ }).strict();
14539
+ var credentialImportsRequestSchema = external_exports.discriminatedUnion("action", [
14540
+ external_exports.object({ action: external_exports.literal("list") }).strict(),
14541
+ external_exports.object({
14542
+ action: external_exports.literal("import"),
14543
+ sourceId: external_exports.string().min(1).max(256),
14544
+ name: credentialImportNameSchema,
14545
+ confirmed: external_exports.literal(true)
14546
+ }).strict(),
14547
+ external_exports.object({
14548
+ action: external_exports.literal("reimport"),
14549
+ sourceId: external_exports.string().min(1).max(256),
14550
+ name: credentialImportNameSchema,
14551
+ confirmed: external_exports.literal(true)
14552
+ }).strict(),
14553
+ external_exports.object({
14554
+ action: external_exports.literal("remove"),
14555
+ name: credentialImportNameSchema,
14556
+ confirmed: external_exports.literal(true)
14557
+ }).strict()
14558
+ ]);
14559
+ var credentialOtherLoginSchema = external_exports.object({
14560
+ provider: external_exports.string().min(1).max(128),
14561
+ type: external_exports.enum(["oauth", "api_key", "unknown"]),
14562
+ /** Best-effort account label (e.g. the email in a Codex token), derived locally when present. */
14563
+ label: external_exports.string().min(1).max(512).optional(),
14564
+ /** Recognized credential vendor, derived from the OAuth token issuer. Absent when unknown. */
14565
+ vendor: external_exports.enum(["openai-codex", "xai"]).optional()
14566
+ }).strict();
14567
+ var credentialImportsResultSchema = external_exports.object({
14568
+ sources: external_exports.array(credentialSourceSchema),
14569
+ targets: external_exports.array(external_exports.object({
14570
+ harnessId: external_exports.string(),
14571
+ providers: external_exports.array(external_exports.enum(["openai-codex", "xai"])),
14572
+ imports: external_exports.array(credentialImportRecordSchema),
14573
+ others: external_exports.array(credentialOtherLoginSchema).default([])
14574
+ }).strict())
14575
+ }).strict();
14576
+ var credentialImportsParamsSchema = external_exports.object({
14577
+ targetHarnessId: external_exports.string().min(1).max(128).optional(),
14578
+ request: credentialImportsRequestSchema
14579
+ }).strict();
14580
+
14526
14581
  // ../../shared-contracts/dist/version.js
14527
14582
  var WORKSPACE_CONTRACT_VERSION = 1;
14528
14583
 
14584
+ // ../../shared-contracts/dist/idle-release.js
14585
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MIN = 5;
14586
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MAX = 1440;
14587
+ var idleReleaseSettingsSchema = external_exports.strictObject({
14588
+ enabled: external_exports.boolean(),
14589
+ timeoutMinutes: external_exports.number().int().min(IDLE_RELEASE_TIMEOUT_MINUTES_MIN).max(IDLE_RELEASE_TIMEOUT_MINUTES_MAX)
14590
+ });
14591
+ var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
14592
+ enabled: false,
14593
+ timeoutMinutes: 30
14594
+ });
14595
+
14596
+ // ../../shared-contracts/dist/loaded-sessions.js
14597
+ var loadedSessionStateSchema = external_exports.enum([
14598
+ "idle",
14599
+ "running",
14600
+ "busy",
14601
+ "closing",
14602
+ "failed",
14603
+ "blocked"
14604
+ ]);
14605
+ var loadedSessionReasonSchema = external_exports.enum([
14606
+ "none",
14607
+ "disabled",
14608
+ "timeout",
14609
+ "operation",
14610
+ "background",
14611
+ "identity",
14612
+ "persistence",
14613
+ "closeFailed"
14614
+ ]);
14615
+ var loadedSessionsSchema = external_exports.array(external_exports.strictObject({
14616
+ threadId: external_exports.string(),
14617
+ title: external_exports.string(),
14618
+ harnessId: external_exports.string(),
14619
+ state: loadedSessionStateSchema,
14620
+ reason: loadedSessionReasonSchema,
14621
+ inactiveMs: external_exports.number().nonnegative()
14622
+ }));
14623
+
14529
14624
  // ../../shared-contracts/dist/ids.js
14530
14625
  var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
14531
14626
  message: "Identifier must not be empty or whitespace"
@@ -15032,6 +15127,8 @@ var pluginPresentationShape = {
15032
15127
  id: harnessPluginIdSchema,
15033
15128
  name: external_exports.string().trim().min(1).max(128),
15034
15129
  version: external_exports.string().min(1).max(128),
15130
+ /** The factory accepts a persisted local entrypoint through its construction context. */
15131
+ launchCommand: external_exports.literal(true).optional(),
15035
15132
  links: external_exports.object({
15036
15133
  documentation: documentationUrlSchema.optional(),
15037
15134
  installation: documentationUrlSchema.optional()
@@ -15069,6 +15166,19 @@ var harnessPluginRouteSchema = external_exports.object({
15069
15166
  permissionModeId: harnessPermissionModeIdSchema.optional()
15070
15167
  }).strict();
15071
15168
 
15169
+ // ../../shared-contracts/dist/harness-launch-settings.js
15170
+ var harnessLaunchPathSchema = external_exports.string().trim().min(1).max(4096).refine((value) => !/[\u0000\r\n]/u.test(value), "Invalid entrypoint path");
15171
+ var harnessLaunchSettingsGetSchema = external_exports.object({
15172
+ harnessId: harnessPluginIdSchema
15173
+ }).strict();
15174
+ var harnessLaunchSettingsSetSchema = harnessLaunchSettingsGetSchema.extend({
15175
+ path: harnessLaunchPathSchema.nullable()
15176
+ });
15177
+ var harnessLaunchSettingsSchema = external_exports.object({
15178
+ path: harnessLaunchPathSchema.nullable(),
15179
+ restartRequired: external_exports.boolean()
15180
+ }).strict();
15181
+
15072
15182
  // ../../shared-contracts/dist/codex-accounts.js
15073
15183
  var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
15074
15184
  var nonBlankTextSchema3 = external_exports.string().trim().min(1);
@@ -21708,6 +21818,7 @@ var KiroTurnOutput = class {
21708
21818
  const file2 = {
21709
21819
  type: "fileChange",
21710
21820
  itemId: hostItemIdSchema.parse(`file-${tool.item.itemId}`),
21821
+ sourceItemIds: [tool.item.itemId],
21711
21822
  changes: changes ?? []
21712
21823
  };
21713
21824
  if (tool.file) {
@@ -22091,6 +22202,10 @@ async function readKiroSnapshot(location) {
22091
22202
  const completedAtMs = Date.parse(end?.timestamp ?? "");
22092
22203
  const hasTiming = Number.isFinite(startedAtMs) && Number.isFinite(completedAtMs) && startedAtMs >= 0 && completedAtMs >= startedAtMs;
22093
22204
  const lastContent = turn.rows.findLast((row) => row.payload.type === "tool_call" || row.payload.type === "assistant" && kiroVisibleText(historyText(row.payload)).trim().length > 0 && !["Reasoning", "Summary"].includes(String(row.payload.operationType)));
22205
+ const toolSources = new Map(turn.rows.filter((row) => row.payload.type === "tool_call").map((row) => [
22206
+ row.payload.toolCallId,
22207
+ hostItemIdSchema.parse(`kiro-${nativeSessionId}-${row.id}`)
22208
+ ]));
22094
22209
  for (const row of turn.rows) {
22095
22210
  const type = row.payload?.type;
22096
22211
  const itemId = hostItemIdSchema.parse(`kiro-${nativeSessionId}-${row.id}`);
@@ -22141,10 +22256,12 @@ async function readKiroSnapshot(location) {
22141
22256
  } else if (type === "tool_result") {
22142
22257
  const changes = row.payload.success === true ? projectKiroFileChanges(row.payload.content, location.cwd) : null;
22143
22258
  if (changes) {
22259
+ const sourceItemId = toolSources.get(row.payload.toolCallId);
22144
22260
  items.push({
22145
22261
  item: {
22146
22262
  type: "fileChange",
22147
22263
  itemId,
22264
+ sourceItemIds: sourceItemId ? [sourceItemId] : [],
22148
22265
  changes
22149
22266
  },
22150
22267
  outcome: { status: "succeeded" }
@@ -23005,12 +23122,12 @@ var KiroSession = class {
23005
23122
  return { ok: true, value: { accepted: true } };
23006
23123
  }
23007
23124
  async #selectModel(command) {
23008
- if (this.#activeTurnId !== null || this.#configBusy) {
23125
+ if (this.#configBusy) {
23009
23126
  return {
23010
23127
  ok: false,
23011
23128
  error: {
23012
23129
  code: "sessionBusy",
23013
- message: "Cannot change model while turn is active",
23130
+ message: "Another configuration change is in progress",
23014
23131
  retryable: false
23015
23132
  }
23016
23133
  };
@@ -23101,7 +23218,7 @@ var KiroSession = class {
23101
23218
  });
23102
23219
  }
23103
23220
  async #selectThinking(command) {
23104
- if (this.#activeTurnId !== null || this.#configBusy) {
23221
+ if (this.#configBusy) {
23105
23222
  return {
23106
23223
  ok: false,
23107
23224
  error: { code: "sessionBusy", message: "Session is busy", retryable: true }
@@ -14774,9 +14774,104 @@ function date4(params) {
14774
14774
  // ../../../node_modules/zod/v4/classic/external.js
14775
14775
  config(en_default());
14776
14776
 
14777
+ // ../../shared-contracts/dist/credential-imports.js
14778
+ var credentialSourceSchema = external_exports.object({
14779
+ id: external_exports.string().min(1).max(256),
14780
+ harnessId: external_exports.string().min(1),
14781
+ label: external_exports.string().min(1).max(512),
14782
+ provider: external_exports.enum(["openai-codex", "xai"])
14783
+ }).strict();
14784
+ var credentialImportNameSchema = external_exports.string().regex(/^[a-z][a-z0-9-]{0,47}$/);
14785
+ var credentialImportRecordSchema = external_exports.object({
14786
+ name: credentialImportNameSchema,
14787
+ source: credentialSourceSchema,
14788
+ importedAt: external_exports.string()
14789
+ }).strict();
14790
+ var credentialImportsRequestSchema = external_exports.discriminatedUnion("action", [
14791
+ external_exports.object({ action: external_exports.literal("list") }).strict(),
14792
+ external_exports.object({
14793
+ action: external_exports.literal("import"),
14794
+ sourceId: external_exports.string().min(1).max(256),
14795
+ name: credentialImportNameSchema,
14796
+ confirmed: external_exports.literal(true)
14797
+ }).strict(),
14798
+ external_exports.object({
14799
+ action: external_exports.literal("reimport"),
14800
+ sourceId: external_exports.string().min(1).max(256),
14801
+ name: credentialImportNameSchema,
14802
+ confirmed: external_exports.literal(true)
14803
+ }).strict(),
14804
+ external_exports.object({
14805
+ action: external_exports.literal("remove"),
14806
+ name: credentialImportNameSchema,
14807
+ confirmed: external_exports.literal(true)
14808
+ }).strict()
14809
+ ]);
14810
+ var credentialOtherLoginSchema = external_exports.object({
14811
+ provider: external_exports.string().min(1).max(128),
14812
+ type: external_exports.enum(["oauth", "api_key", "unknown"]),
14813
+ /** Best-effort account label (e.g. the email in a Codex token), derived locally when present. */
14814
+ label: external_exports.string().min(1).max(512).optional(),
14815
+ /** Recognized credential vendor, derived from the OAuth token issuer. Absent when unknown. */
14816
+ vendor: external_exports.enum(["openai-codex", "xai"]).optional()
14817
+ }).strict();
14818
+ var credentialImportsResultSchema = external_exports.object({
14819
+ sources: external_exports.array(credentialSourceSchema),
14820
+ targets: external_exports.array(external_exports.object({
14821
+ harnessId: external_exports.string(),
14822
+ providers: external_exports.array(external_exports.enum(["openai-codex", "xai"])),
14823
+ imports: external_exports.array(credentialImportRecordSchema),
14824
+ others: external_exports.array(credentialOtherLoginSchema).default([])
14825
+ }).strict())
14826
+ }).strict();
14827
+ var credentialImportsParamsSchema = external_exports.object({
14828
+ targetHarnessId: external_exports.string().min(1).max(128).optional(),
14829
+ request: credentialImportsRequestSchema
14830
+ }).strict();
14831
+
14777
14832
  // ../../shared-contracts/dist/version.js
14778
14833
  var WORKSPACE_CONTRACT_VERSION = 1;
14779
14834
 
14835
+ // ../../shared-contracts/dist/idle-release.js
14836
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MIN = 5;
14837
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MAX = 1440;
14838
+ var idleReleaseSettingsSchema = external_exports.strictObject({
14839
+ enabled: external_exports.boolean(),
14840
+ timeoutMinutes: external_exports.number().int().min(IDLE_RELEASE_TIMEOUT_MINUTES_MIN).max(IDLE_RELEASE_TIMEOUT_MINUTES_MAX)
14841
+ });
14842
+ var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
14843
+ enabled: false,
14844
+ timeoutMinutes: 30
14845
+ });
14846
+
14847
+ // ../../shared-contracts/dist/loaded-sessions.js
14848
+ var loadedSessionStateSchema = external_exports.enum([
14849
+ "idle",
14850
+ "running",
14851
+ "busy",
14852
+ "closing",
14853
+ "failed",
14854
+ "blocked"
14855
+ ]);
14856
+ var loadedSessionReasonSchema = external_exports.enum([
14857
+ "none",
14858
+ "disabled",
14859
+ "timeout",
14860
+ "operation",
14861
+ "background",
14862
+ "identity",
14863
+ "persistence",
14864
+ "closeFailed"
14865
+ ]);
14866
+ var loadedSessionsSchema = external_exports.array(external_exports.strictObject({
14867
+ threadId: external_exports.string(),
14868
+ title: external_exports.string(),
14869
+ harnessId: external_exports.string(),
14870
+ state: loadedSessionStateSchema,
14871
+ reason: loadedSessionReasonSchema,
14872
+ inactiveMs: external_exports.number().nonnegative()
14873
+ }));
14874
+
14780
14875
  // ../../shared-contracts/dist/ids.js
14781
14876
  var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
14782
14877
  message: "Identifier must not be empty or whitespace"
@@ -15283,6 +15378,8 @@ var pluginPresentationShape = {
15283
15378
  id: harnessPluginIdSchema,
15284
15379
  name: external_exports.string().trim().min(1).max(128),
15285
15380
  version: external_exports.string().min(1).max(128),
15381
+ /** The factory accepts a persisted local entrypoint through its construction context. */
15382
+ launchCommand: external_exports.literal(true).optional(),
15286
15383
  links: external_exports.object({
15287
15384
  documentation: documentationUrlSchema.optional(),
15288
15385
  installation: documentationUrlSchema.optional()
@@ -15320,6 +15417,19 @@ var harnessPluginRouteSchema = external_exports.object({
15320
15417
  permissionModeId: harnessPermissionModeIdSchema.optional()
15321
15418
  }).strict();
15322
15419
 
15420
+ // ../../shared-contracts/dist/harness-launch-settings.js
15421
+ var harnessLaunchPathSchema = external_exports.string().trim().min(1).max(4096).refine((value) => !/[\u0000\r\n]/u.test(value), "Invalid entrypoint path");
15422
+ var harnessLaunchSettingsGetSchema = external_exports.object({
15423
+ harnessId: harnessPluginIdSchema
15424
+ }).strict();
15425
+ var harnessLaunchSettingsSetSchema = harnessLaunchSettingsGetSchema.extend({
15426
+ path: harnessLaunchPathSchema.nullable()
15427
+ });
15428
+ var harnessLaunchSettingsSchema = external_exports.object({
15429
+ path: harnessLaunchPathSchema.nullable(),
15430
+ restartRequired: external_exports.boolean()
15431
+ }).strict();
15432
+
15323
15433
  // ../../shared-contracts/dist/codex-accounts.js
15324
15434
  var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
15325
15435
  var nonBlankTextSchema3 = external_exports.string().trim().min(1);
@@ -15043,9 +15043,104 @@ function date4(params) {
15043
15043
  // ../../../node_modules/zod/v4/classic/external.js
15044
15044
  config(en_default());
15045
15045
 
15046
+ // ../../shared-contracts/dist/credential-imports.js
15047
+ var credentialSourceSchema = external_exports.object({
15048
+ id: external_exports.string().min(1).max(256),
15049
+ harnessId: external_exports.string().min(1),
15050
+ label: external_exports.string().min(1).max(512),
15051
+ provider: external_exports.enum(["openai-codex", "xai"])
15052
+ }).strict();
15053
+ var credentialImportNameSchema = external_exports.string().regex(/^[a-z][a-z0-9-]{0,47}$/);
15054
+ var credentialImportRecordSchema = external_exports.object({
15055
+ name: credentialImportNameSchema,
15056
+ source: credentialSourceSchema,
15057
+ importedAt: external_exports.string()
15058
+ }).strict();
15059
+ var credentialImportsRequestSchema = external_exports.discriminatedUnion("action", [
15060
+ external_exports.object({ action: external_exports.literal("list") }).strict(),
15061
+ external_exports.object({
15062
+ action: external_exports.literal("import"),
15063
+ sourceId: external_exports.string().min(1).max(256),
15064
+ name: credentialImportNameSchema,
15065
+ confirmed: external_exports.literal(true)
15066
+ }).strict(),
15067
+ external_exports.object({
15068
+ action: external_exports.literal("reimport"),
15069
+ sourceId: external_exports.string().min(1).max(256),
15070
+ name: credentialImportNameSchema,
15071
+ confirmed: external_exports.literal(true)
15072
+ }).strict(),
15073
+ external_exports.object({
15074
+ action: external_exports.literal("remove"),
15075
+ name: credentialImportNameSchema,
15076
+ confirmed: external_exports.literal(true)
15077
+ }).strict()
15078
+ ]);
15079
+ var credentialOtherLoginSchema = external_exports.object({
15080
+ provider: external_exports.string().min(1).max(128),
15081
+ type: external_exports.enum(["oauth", "api_key", "unknown"]),
15082
+ /** Best-effort account label (e.g. the email in a Codex token), derived locally when present. */
15083
+ label: external_exports.string().min(1).max(512).optional(),
15084
+ /** Recognized credential vendor, derived from the OAuth token issuer. Absent when unknown. */
15085
+ vendor: external_exports.enum(["openai-codex", "xai"]).optional()
15086
+ }).strict();
15087
+ var credentialImportsResultSchema = external_exports.object({
15088
+ sources: external_exports.array(credentialSourceSchema),
15089
+ targets: external_exports.array(external_exports.object({
15090
+ harnessId: external_exports.string(),
15091
+ providers: external_exports.array(external_exports.enum(["openai-codex", "xai"])),
15092
+ imports: external_exports.array(credentialImportRecordSchema),
15093
+ others: external_exports.array(credentialOtherLoginSchema).default([])
15094
+ }).strict())
15095
+ }).strict();
15096
+ var credentialImportsParamsSchema = external_exports.object({
15097
+ targetHarnessId: external_exports.string().min(1).max(128).optional(),
15098
+ request: credentialImportsRequestSchema
15099
+ }).strict();
15100
+
15046
15101
  // ../../shared-contracts/dist/version.js
15047
15102
  var WORKSPACE_CONTRACT_VERSION = 1;
15048
15103
 
15104
+ // ../../shared-contracts/dist/idle-release.js
15105
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MIN = 5;
15106
+ var IDLE_RELEASE_TIMEOUT_MINUTES_MAX = 1440;
15107
+ var idleReleaseSettingsSchema = external_exports.strictObject({
15108
+ enabled: external_exports.boolean(),
15109
+ timeoutMinutes: external_exports.number().int().min(IDLE_RELEASE_TIMEOUT_MINUTES_MIN).max(IDLE_RELEASE_TIMEOUT_MINUTES_MAX)
15110
+ });
15111
+ var DEFAULT_IDLE_RELEASE_SETTINGS = Object.freeze({
15112
+ enabled: false,
15113
+ timeoutMinutes: 30
15114
+ });
15115
+
15116
+ // ../../shared-contracts/dist/loaded-sessions.js
15117
+ var loadedSessionStateSchema = external_exports.enum([
15118
+ "idle",
15119
+ "running",
15120
+ "busy",
15121
+ "closing",
15122
+ "failed",
15123
+ "blocked"
15124
+ ]);
15125
+ var loadedSessionReasonSchema = external_exports.enum([
15126
+ "none",
15127
+ "disabled",
15128
+ "timeout",
15129
+ "operation",
15130
+ "background",
15131
+ "identity",
15132
+ "persistence",
15133
+ "closeFailed"
15134
+ ]);
15135
+ var loadedSessionsSchema = external_exports.array(external_exports.strictObject({
15136
+ threadId: external_exports.string(),
15137
+ title: external_exports.string(),
15138
+ harnessId: external_exports.string(),
15139
+ state: loadedSessionStateSchema,
15140
+ reason: loadedSessionReasonSchema,
15141
+ inactiveMs: external_exports.number().nonnegative()
15142
+ }));
15143
+
15049
15144
  // ../../shared-contracts/dist/ids.js
15050
15145
  var opaqueIdSchema = external_exports.string().refine((value) => value.trim().length > 0, {
15051
15146
  message: "Identifier must not be empty or whitespace"
@@ -15552,6 +15647,8 @@ var pluginPresentationShape = {
15552
15647
  id: harnessPluginIdSchema,
15553
15648
  name: external_exports.string().trim().min(1).max(128),
15554
15649
  version: external_exports.string().min(1).max(128),
15650
+ /** The factory accepts a persisted local entrypoint through its construction context. */
15651
+ launchCommand: external_exports.literal(true).optional(),
15555
15652
  links: external_exports.object({
15556
15653
  documentation: documentationUrlSchema.optional(),
15557
15654
  installation: documentationUrlSchema.optional()
@@ -15589,6 +15686,19 @@ var harnessPluginRouteSchema = external_exports.object({
15589
15686
  permissionModeId: harnessPermissionModeIdSchema.optional()
15590
15687
  }).strict();
15591
15688
 
15689
+ // ../../shared-contracts/dist/harness-launch-settings.js
15690
+ var harnessLaunchPathSchema = external_exports.string().trim().min(1).max(4096).refine((value) => !/[\u0000\r\n]/u.test(value), "Invalid entrypoint path");
15691
+ var harnessLaunchSettingsGetSchema = external_exports.object({
15692
+ harnessId: harnessPluginIdSchema
15693
+ }).strict();
15694
+ var harnessLaunchSettingsSetSchema = harnessLaunchSettingsGetSchema.extend({
15695
+ path: harnessLaunchPathSchema.nullable()
15696
+ });
15697
+ var harnessLaunchSettingsSchema = external_exports.object({
15698
+ path: harnessLaunchPathSchema.nullable(),
15699
+ restartRequired: external_exports.boolean()
15700
+ }).strict();
15701
+
15592
15702
  // ../../shared-contracts/dist/codex-accounts.js
15593
15703
  var accountIdSchema = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._~-]+$/u);
15594
15704
  var nonBlankTextSchema3 = external_exports.string().trim().min(1);
@@ -16574,7 +16684,7 @@ function withNodeRuntimeOnPath(environment, runtimeExecutable = process.execPath
16574
16684
  const directories = (environment[pathKey] ?? "").split(delimiter).filter(Boolean);
16575
16685
  const equal = platform === "win32" ? (value) => value.toLowerCase() : (value) => value;
16576
16686
  if (!directories.some((directory) => equal(directory) === equal(runtimeDirectory))) {
16577
- directories.unshift(runtimeDirectory);
16687
+ directories.push(runtimeDirectory);
16578
16688
  }
16579
16689
  return { ...environment, [pathKey]: directories.join(delimiter) };
16580
16690
  }
@@ -17199,7 +17309,8 @@ function ompRpcProcessCommand(options, dependencies = {}) {
17199
17309
  const permissionArguments = options.permissionMode ? ["--approval-mode", options.permissionMode] : [];
17200
17310
  const arguments_ = [
17201
17311
  "--mode",
17202
- "rpc",
17312
+ // OMP only creates ask and connects its tool UI in rpc-ui mode.
17313
+ "rpc-ui",
17203
17314
  ...permissionArguments,
17204
17315
  ...modelArguments,
17205
17316
  ...sessionArguments
@@ -17547,7 +17658,12 @@ var OmpRpcSession = class {
17547
17658
  if ("confirmed" in response && pending.request.method !== "confirm") {
17548
17659
  throw new Error("Omp RPC confirmation does not match the request");
17549
17660
  }
17550
- const frame = "cancelled" in response ? { type: "extension_ui_response", id: response.requestId, cancelled: true } : "confirmed" in response ? { type: "extension_ui_response", id: response.requestId, confirmed: response.confirmed } : { type: "extension_ui_response", id: response.requestId, value: response.value };
17661
+ const frame = "cancelled" in response ? {
17662
+ type: "extension_ui_response",
17663
+ id: response.requestId,
17664
+ cancelled: true,
17665
+ ...reason === "expired" ? { timedOut: true } : {}
17666
+ } : "confirmed" in response ? { type: "extension_ui_response", id: response.requestId, confirmed: response.confirmed } : { type: "extension_ui_response", id: response.requestId, value: response.value };
17551
17667
  if (!active.interactions.delete(response.requestId)) {
17552
17668
  throw new Error("Omp RPC interaction is not pending");
17553
17669
  }
@@ -17857,11 +17973,19 @@ var OmpRpcSession = class {
17857
17973
  if (!Array.isArray(value.options) || value.options.length === 0 || !value.options.every((option) => typeof option === "string" && option.length > 0)) {
17858
17974
  throw new OmpRpcFaultError("protocolError", "Omp RPC select request has invalid options");
17859
17975
  }
17976
+ let optionDetails;
17977
+ if (value.optionDetails !== void 0) {
17978
+ if (!Array.isArray(value.optionDetails) || value.optionDetails.length !== value.options.length || !value.optionDetails.every((detail) => typeof detail === "object" && detail !== null && !Array.isArray(detail) && (detail.description === void 0 || typeof detail.description === "string"))) {
17979
+ throw new OmpRpcFaultError("protocolError", "Omp RPC select option details are invalid");
17980
+ }
17981
+ optionDetails = value.optionDetails.map(({ description }) => description === void 0 ? {} : { description });
17982
+ }
17860
17983
  request = {
17861
17984
  requestId,
17862
17985
  method,
17863
17986
  title,
17864
17987
  options: [...value.options],
17988
+ ...optionDetails ? { optionDetails } : {},
17865
17989
  ...typeof timeoutMs === "number" ? { timeoutMs } : {}
17866
17990
  };
17867
17991
  } else if (method === "confirm") {
@@ -18609,7 +18733,8 @@ function synthesizeFileChange(kind, args, cwd) {
18609
18733
  {
18610
18734
  path: displayed.path,
18611
18735
  kind: "add",
18612
- unifiedDiff: createTwoFilesPatch(oldHeader2, newHeader2, "", content, "", "", { context: 3 })
18736
+ unifiedDiff: createTwoFilesPatch(oldHeader2, newHeader2, "", content, "", "", { context: 3 }),
18737
+ diffScope: "fragment"
18613
18738
  }
18614
18739
  ];
18615
18740
  }
@@ -18631,7 +18756,8 @@ function synthesizeFileChange(kind, args, cwd) {
18631
18756
  kind: "update",
18632
18757
  unifiedDiff: createTwoFilesPatch(oldHeader, newHeader, oldText, newText, "", "", {
18633
18758
  context: 3
18634
- })
18759
+ }),
18760
+ diffScope: "fragment"
18635
18761
  }
18636
18762
  ];
18637
18763
  }
@@ -19028,7 +19154,7 @@ var OmpHarnessSession = class {
19028
19154
  return this.#closePromise;
19029
19155
  }
19030
19156
  async #selectModel(command) {
19031
- if (this.#acceptingTurn || this.#active || this.#configuring) {
19157
+ if (this.#acceptingTurn || this.#configuring) {
19032
19158
  return {
19033
19159
  ok: false,
19034
19160
  error: {
@@ -19100,7 +19226,7 @@ var OmpHarnessSession = class {
19100
19226
  }
19101
19227
  };
19102
19228
  }
19103
- if (this.#acceptingTurn || this.#active || this.#configuring) {
19229
+ if (this.#acceptingTurn || this.#configuring) {
19104
19230
  return {
19105
19231
  ok: false,
19106
19232
  error: {
@@ -19663,7 +19789,11 @@ var OmpHarnessSession = class {
19663
19789
  id: "answer",
19664
19790
  type: "choice",
19665
19791
  prompt: request.title,
19666
- options: request.options.map((option) => ({ value: option, label: option })),
19792
+ options: request.options.map((option, index) => ({
19793
+ value: option,
19794
+ label: option,
19795
+ ...request.optionDetails?.[index]?.description ? { description: request.optionDetails[index].description } : {}
19796
+ })),
19667
19797
  multiple: false,
19668
19798
  allowOther: false,
19669
19799
  optional: false
@@ -19885,12 +20015,17 @@ var OmpHarnessSession = class {
19885
20015
  try {
19886
20016
  const kind = fileMutatingKind(event.toolName);
19887
20017
  const args = tool.arguments;
19888
- if (kind && synthesizeFileChange(kind, args, this.#cwd)) {
20018
+ if (kind && !patchFromResult(event.result) && synthesizeFileChange(kind, args, this.#cwd)) {
19889
20019
  return;
19890
20020
  }
19891
20021
  const changes = reliableFileChange(event.toolName, args, event.result, this.#cwd);
19892
20022
  if (changes) {
19893
- const fileItem = { type: "fileChange", itemId: this.#newItemId(), changes };
20023
+ const fileItem = {
20024
+ type: "fileChange",
20025
+ itemId: this.#newItemId(),
20026
+ sourceItemIds: [tool.item.itemId],
20027
+ changes
20028
+ };
19894
20029
  this.#event({ type: "item.started", turnId: active.command.turnId, item: fileItem });
19895
20030
  this.#completeItem(active, fileItem, { status: "succeeded" });
19896
20031
  }