chatroom-cli 1.127.0 → 1.128.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -48728,6 +48728,14 @@ var init_pi_sdk_package = __esm(() => {
48728
48728
  };
48729
48729
  });
48730
48730
 
48731
+ // src/daemon/infrastructure/local/harness/services/pi-sdk/assistant-error.ts
48732
+ function assistantErrorOf(event) {
48733
+ if (event.message.role !== "assistant" || event.message.stopReason !== "error")
48734
+ return;
48735
+ return event.message.errorMessage ?? UNKNOWN_PROVIDER_ERROR;
48736
+ }
48737
+ var UNKNOWN_PROVIDER_ERROR = "unknown provider error";
48738
+
48731
48739
  // src/daemon/infrastructure/local/harness/services/pi-sdk/pi-sdk-stream-adapter.ts
48732
48740
  var PiSdkStreamAdapter;
48733
48741
  var init_pi_sdk_stream_adapter = __esm(() => {
@@ -48735,6 +48743,7 @@ var init_pi_sdk_stream_adapter = __esm(() => {
48735
48743
  PiSdkStreamAdapter = class PiSdkStreamAdapter extends NativeStreamAdapterBase {
48736
48744
  textBuffer = "";
48737
48745
  thinkingBuffer = "";
48746
+ lastAssistantError;
48738
48747
  constructor(logPrefix, emitLogLine, activityEmitter) {
48739
48748
  super(logPrefix, emitLogLine, activityEmitter);
48740
48749
  }
@@ -48774,17 +48783,43 @@ var init_pi_sdk_stream_adapter = __esm(() => {
48774
48783
  this.writeLine(formatAgentLogLine(this.logPrefix, "tool_result", `${event.toolName} result: ${resultStr}`));
48775
48784
  break;
48776
48785
  }
48786
+ case "message_end":
48787
+ this.recordAssistantOutcome(event);
48788
+ break;
48777
48789
  case "agent_end":
48778
- this.completeTurn({ status: "completed", source: "pi-sdk.agent_end" });
48790
+ if (event.willRetry)
48791
+ break;
48792
+ this.settleRun("pi-sdk.agent_end");
48779
48793
  break;
48780
48794
  default:
48781
48795
  break;
48782
48796
  }
48783
48797
  }
48798
+ recordAssistantOutcome(event) {
48799
+ const message = event.message;
48800
+ if (message.role !== "assistant")
48801
+ return;
48802
+ this.lastAssistantError = assistantErrorOf(event);
48803
+ if (this.lastAssistantError === undefined)
48804
+ return;
48805
+ this.writeLine(formatAgentLogLine(this.logPrefix, "run-error", `assistant error: ${this.lastAssistantError}`));
48806
+ }
48807
+ settleResolvedPrompt() {
48808
+ this.settleRun("pi-sdk.prompt.resolved");
48809
+ }
48784
48810
  finish() {
48785
48811
  this.flushText();
48786
48812
  this.flushThinking();
48787
48813
  }
48814
+ settleRun(source) {
48815
+ if (this.lastAssistantError !== undefined) {
48816
+ const error51 = this.lastAssistantError;
48817
+ if (this.completeTurn({ status: "failed", source, error: error51 }))
48818
+ this.notifyFailure(source);
48819
+ } else {
48820
+ this.completeTurn({ status: "completed", source });
48821
+ }
48822
+ }
48788
48823
  appendText(delta) {
48789
48824
  this.flushThinking();
48790
48825
  this.textBuffer += delta;
@@ -48876,9 +48911,13 @@ function waitForResumeOrAbort4(session2) {
48876
48911
  })
48877
48912
  ]);
48878
48913
  }
48879
- function resolveRequiredModel(modelRegistry, model) {
48914
+ async function createModelRuntime() {
48915
+ const sdk = await loadSdk4();
48916
+ return sdk.ModelRuntime.create();
48917
+ }
48918
+ function resolveRequiredModel(modelRuntime, model) {
48880
48919
  const slash = model.indexOf("/");
48881
- const resolved = slash === -1 ? modelRegistry.getAll().find((entry) => entry.id === model) : modelRegistry.find(model.slice(0, slash), model.slice(slash + 1));
48920
+ const resolved = slash === -1 ? modelRuntime.getModels().find((entry) => entry.id === model) : modelRuntime.getModel(model.slice(0, slash), model.slice(slash + 1));
48882
48921
  if (!resolved) {
48883
48922
  throw new Error(`Pi model not found: ${model}`);
48884
48923
  }
@@ -48912,10 +48951,8 @@ var init_pi_sdk_agent_service = __esm(() => {
48912
48951
  }
48913
48952
  async isInstalled() {
48914
48953
  try {
48915
- const { ModelRegistry, AuthStorage } = await loadSdk4();
48916
- const authStorage = AuthStorage.create();
48917
- const modelRegistry = ModelRegistry.create(authStorage);
48918
- return modelRegistry.getAvailable().length > 0;
48954
+ const modelRuntime = await createModelRuntime();
48955
+ return (await modelRuntime.getAvailable()).length > 0;
48919
48956
  } catch (err) {
48920
48957
  console.warn(`[pi-sdk] unavailable: ${formatPiSdkLoadError(err)}`);
48921
48958
  return false;
@@ -48938,26 +48975,16 @@ var init_pi_sdk_agent_service = __esm(() => {
48938
48975
  }
48939
48976
  async listModels() {
48940
48977
  try {
48941
- const { ModelRegistry, AuthStorage } = await loadSdk4();
48942
- const authStorage = AuthStorage.create();
48943
- const modelRegistry = ModelRegistry.create(authStorage);
48944
- return modelRegistry.getAvailable().map((entry) => `${entry.provider}/${entry.id}`);
48978
+ const modelRuntime = await createModelRuntime();
48979
+ return (await modelRuntime.getAvailable()).map((entry) => `${entry.provider}/${entry.id}`);
48945
48980
  } catch (err) {
48946
48981
  console.warn(`[pi-sdk] listModels failed:`, err instanceof Error ? err.message : err);
48947
48982
  return [];
48948
48983
  }
48949
48984
  }
48950
48985
  async openResumedSession(args2) {
48951
- const {
48952
- AuthStorage,
48953
- createAgentSession,
48954
- DefaultResourceLoader,
48955
- getAgentDir,
48956
- ModelRegistry,
48957
- SessionManager
48958
- } = await loadSdk4();
48959
- const authStorage = AuthStorage.create();
48960
- const modelRegistry = ModelRegistry.create(authStorage);
48986
+ const { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } = await loadSdk4();
48987
+ const modelRuntime = await createModelRuntime();
48961
48988
  const sessions = await SessionManager.list(args2.workingDir, getPiSessionDir(args2.workingDir));
48962
48989
  const match5 = sessions.find((s) => s.id === args2.harnessSessionId);
48963
48990
  if (!match5) {
@@ -48972,8 +48999,7 @@ var init_pi_sdk_agent_service = __esm(() => {
48972
48999
  const { session: session2 } = await withTimeout(createAgentSession({
48973
49000
  cwd: args2.workingDir,
48974
49001
  sessionManager: SessionManager.open(match5.path, getPiSessionDir(args2.workingDir)),
48975
- authStorage,
48976
- modelRegistry,
49002
+ modelRuntime,
48977
49003
  resourceLoader
48978
49004
  }), SESSION_CREATE_TIMEOUT_MS2, "createAgentSession");
48979
49005
  return session2;
@@ -49027,19 +49053,11 @@ var init_pi_sdk_agent_service = __esm(() => {
49027
49053
  return keeper;
49028
49054
  }
49029
49055
  async createSession(args2) {
49030
- const {
49031
- AuthStorage,
49032
- createAgentSession,
49033
- DefaultResourceLoader,
49034
- getAgentDir,
49035
- ModelRegistry,
49036
- SessionManager
49037
- } = await loadSdk4();
49038
- const authStorage = AuthStorage.create();
49039
- const modelRegistry = ModelRegistry.create(authStorage);
49056
+ const { createAgentSession, DefaultResourceLoader, getAgentDir, SessionManager } = await loadSdk4();
49057
+ const modelRuntime = await createModelRuntime();
49040
49058
  const model = requireHarnessModel(args2.model, "pi-sdk spawn");
49041
49059
  const parsed = parsePiSpawnModel(model);
49042
- const resolvedModel = resolveRequiredModel(modelRegistry, parsed.model ?? model);
49060
+ const resolvedModel = resolveRequiredModel(modelRuntime, parsed.model ?? model);
49043
49061
  const thinkingLevel = resolvePiThinkingLevel(parsed?.thinking);
49044
49062
  const agentDir = getAgentDir();
49045
49063
  const resourceLoader = new DefaultResourceLoader({
@@ -49053,8 +49071,7 @@ var init_pi_sdk_agent_service = __esm(() => {
49053
49071
  model: resolvedModel,
49054
49072
  ...thinkingLevel ? { thinkingLevel } : {},
49055
49073
  sessionManager: SessionManager.create(getPiSessionDir(args2.workingDir)),
49056
- authStorage,
49057
- modelRegistry,
49074
+ modelRuntime,
49058
49075
  resourceLoader
49059
49076
  }), SESSION_CREATE_TIMEOUT_MS2, "createAgentSession");
49060
49077
  return session2;
@@ -49201,9 +49218,7 @@ ${deferredResume}` : deferredResume;
49201
49218
  exitSignal = "SIGTERM";
49202
49219
  break;
49203
49220
  }
49204
- if (!adapter.turnCompletion.isComplete) {
49205
- adapter.completeTurn({ status: "completed", source: "pi-sdk.prompt.resolved" });
49206
- }
49221
+ adapter.settleResolvedPrompt();
49207
49222
  adapter.finish();
49208
49223
  nextPrompt = null;
49209
49224
  } catch (turnErr) {
@@ -122973,6 +122988,7 @@ class PiSdkSession {
122973
122988
  listeners = new Set;
122974
122989
  closed = false;
122975
122990
  unsubscribe;
122991
+ lastAssistantError;
122976
122992
  constructor(options) {
122977
122993
  this.session = options.session;
122978
122994
  this.opencodeSessionId = options.opencodeSessionId;
@@ -122988,14 +123004,21 @@ class PiSdkSession {
122988
123004
  const text = input.parts.map((p) => p.text).join(`
122989
123005
  `);
122990
123006
  const messageId = randomUUID14();
123007
+ this.lastAssistantError = undefined;
122991
123008
  const onSessionEvent = (event) => {
122992
123009
  if (this.closed)
122993
123010
  return;
123011
+ if (event.type === "message_end" && event.message.role === "assistant") {
123012
+ this.lastAssistantError = assistantErrorOf(event);
123013
+ }
122994
123014
  this.emitFromPiEvent(event, messageId);
122995
123015
  };
122996
123016
  this.unsubscribe?.();
122997
123017
  this.unsubscribe = this.session.subscribe(onSessionEvent);
122998
123018
  await withTimeout(this.session.prompt(text), PROMPT_TIMEOUT_MS3, "session.prompt");
123019
+ if (this.lastAssistantError !== undefined) {
123020
+ throw new Error(this.lastAssistantError);
123021
+ }
122999
123022
  this.emit({ type: "session.idle", payload: {}, timestamp: Date.now() });
123000
123023
  }
123001
123024
  onEvent(listener) {
@@ -123060,9 +123083,9 @@ async function loadSdk7() {
123060
123083
  throw err;
123061
123084
  }
123062
123085
  }
123063
- function resolveRequiredModel2(modelRegistry, model) {
123086
+ function resolveRequiredModel2(modelRuntime, model) {
123064
123087
  const slash = model.indexOf("/");
123065
- const resolved = slash === -1 ? modelRegistry.getAll().find((entry) => entry.id === model) : modelRegistry.find(model.slice(0, slash), model.slice(slash + 1));
123088
+ const resolved = slash === -1 ? modelRuntime.getModels().find((entry) => entry.id === model) : modelRuntime.getModel(model.slice(0, slash), model.slice(slash + 1));
123066
123089
  if (!resolved) {
123067
123090
  throw new Error(`Pi model not found: ${model}`);
123068
123091
  }
@@ -123075,15 +123098,13 @@ class PiSdkHarness {
123075
123098
  cwd;
123076
123099
  closed = false;
123077
123100
  sessions = new Map;
123078
- modelRegistry;
123079
- authStorage;
123080
- constructor(cwd, modelRegistry, authStorage) {
123101
+ modelRuntime;
123102
+ constructor(cwd, modelRuntime) {
123081
123103
  this.cwd = cwd;
123082
- this.modelRegistry = modelRegistry;
123083
- this.authStorage = authStorage;
123104
+ this.modelRuntime = modelRuntime;
123084
123105
  }
123085
123106
  async models() {
123086
- return this.modelRegistry.getAvailable().map((entry) => ({
123107
+ return (await this.modelRuntime.getAvailable()).map((entry) => ({
123087
123108
  id: `${entry.provider}/${entry.id}`,
123088
123109
  name: entry.id,
123089
123110
  provider: entry.provider
@@ -123094,7 +123115,7 @@ class PiSdkHarness {
123094
123115
  }
123095
123116
  async listProviders() {
123096
123117
  const byProvider = new Map;
123097
- for (const entry of this.modelRegistry.getAvailable()) {
123118
+ for (const entry of await this.modelRuntime.getAvailable()) {
123098
123119
  const models = byProvider.get(entry.provider) ?? [];
123099
123120
  models.push({ modelID: entry.id, name: entry.id });
123100
123121
  byProvider.set(entry.provider, models);
@@ -123170,7 +123191,7 @@ class PiSdkHarness {
123170
123191
  const { createAgentSession, DefaultResourceLoader, getAgentDir } = await loadSdk7();
123171
123192
  const parsed = args2.model ? parsePiSpawnModel(args2.model) : undefined;
123172
123193
  const modelSlug = parsed?.model ?? args2.model;
123173
- const resolvedModel = args2.requireModel ? resolveRequiredModel2(this.modelRegistry, requireHarnessModel(modelSlug, "pi-sdk openAgentSession")) : modelSlug ? resolveRequiredModel2(this.modelRegistry, modelSlug) : undefined;
123194
+ const resolvedModel = args2.requireModel ? resolveRequiredModel2(this.modelRuntime, requireHarnessModel(modelSlug, "pi-sdk openAgentSession")) : modelSlug ? resolveRequiredModel2(this.modelRuntime, modelSlug) : undefined;
123174
123195
  const thinkingLevel = resolvePiThinkingLevel(parsed?.thinking);
123175
123196
  if (args2.requireModel && !resolvedModel) {
123176
123197
  throw new Error("No Pi model available — configure provider credentials in ~/.pi/agent/auth.json");
@@ -123184,8 +123205,7 @@ class PiSdkHarness {
123184
123205
  const { session: session2 } = await withTimeout(createAgentSession({
123185
123206
  cwd: this.cwd,
123186
123207
  sessionManager: args2.sessionManager,
123187
- authStorage: this.authStorage,
123188
- modelRegistry: this.modelRegistry,
123208
+ modelRuntime: this.modelRuntime,
123189
123209
  resourceLoader,
123190
123210
  ...resolvedModel ? { model: resolvedModel } : {},
123191
123211
  ...thinkingLevel ? { thinkingLevel } : {}
@@ -123195,13 +123215,12 @@ class PiSdkHarness {
123195
123215
  }
123196
123216
  var SESSION_CREATE_TIMEOUT_MS3 = 60000, _sdkCache7, _sdkLoadError7, startPiSdkHarness = async (config4) => {
123197
123217
  try {
123198
- const { AuthStorage, ModelRegistry } = await loadSdk7();
123199
- const authStorage = AuthStorage.create();
123200
- const modelRegistry = ModelRegistry.create(authStorage);
123201
- if (modelRegistry.getAvailable().length === 0) {
123218
+ const sdk = await loadSdk7();
123219
+ const modelRuntime = await sdk.ModelRuntime.create();
123220
+ if ((await modelRuntime.getAvailable()).length === 0) {
123202
123221
  throw new Error("No Pi models available");
123203
123222
  }
123204
- return new PiSdkHarness(config4.workingDir, modelRegistry, authStorage);
123223
+ return new PiSdkHarness(config4.workingDir, modelRuntime);
123205
123224
  } catch (err) {
123206
123225
  throw new Error(`pi-sdk unavailable: ${formatPiSdkLoadError(err)}`);
123207
123226
  }
@@ -137899,4 +137918,4 @@ program2.hook("preAction", async (_thisCommand, actionCommand) => {
137899
137918
  });
137900
137919
  program2.parse();
137901
137920
 
137902
- //# debugId=E3A1D1E6D6D8AB0C64756E2164756E21
137921
+ //# debugId=FEC6884486B357A364756E2164756E21