codebase-cli 2.0.0-pre.4 → 2.0.0-pre.41

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 (111) hide show
  1. package/dist/agent/agent.js +43 -15
  2. package/dist/agent/agent.js.map +1 -1
  3. package/dist/agent/config.js +61 -20
  4. package/dist/agent/config.js.map +1 -1
  5. package/dist/agent/events.bench.js +84 -0
  6. package/dist/agent/events.bench.js.map +1 -0
  7. package/dist/agent/prompt-suggestion.js +141 -0
  8. package/dist/agent/prompt-suggestion.js.map +1 -0
  9. package/dist/agent/system-prompt.js +15 -0
  10. package/dist/agent/system-prompt.js.map +1 -1
  11. package/dist/app-server/protocol.js +7 -0
  12. package/dist/app-server/protocol.js.map +1 -0
  13. package/dist/app-server/server.js +241 -0
  14. package/dist/app-server/server.js.map +1 -0
  15. package/dist/auth/cli.js +1 -1
  16. package/dist/auth/cli.js.map +1 -1
  17. package/dist/auth/credentials.js +33 -2
  18. package/dist/auth/credentials.js.map +1 -1
  19. package/dist/auth/flow.js +145 -24
  20. package/dist/auth/flow.js.map +1 -1
  21. package/dist/auth/token-manager.js +122 -0
  22. package/dist/auth/token-manager.js.map +1 -0
  23. package/dist/cli.js +56 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/builtins.js +160 -14
  26. package/dist/commands/builtins.js.map +1 -1
  27. package/dist/commands/registry.js +46 -1
  28. package/dist/commands/registry.js.map +1 -1
  29. package/dist/compaction/monitor.js +38 -0
  30. package/dist/compaction/monitor.js.map +1 -0
  31. package/dist/config/types.js.map +1 -1
  32. package/dist/glue/client.js +12 -2
  33. package/dist/glue/client.js.map +1 -1
  34. package/dist/hooks/manager.js +8 -2
  35. package/dist/hooks/manager.js.map +1 -1
  36. package/dist/memory/store.js +2 -3
  37. package/dist/memory/store.js.map +1 -1
  38. package/dist/plan/run-flow.js +89 -0
  39. package/dist/plan/run-flow.js.map +1 -0
  40. package/dist/projects/cli.js +92 -0
  41. package/dist/projects/cli.js.map +1 -0
  42. package/dist/projects/client.js +120 -0
  43. package/dist/projects/client.js.map +1 -0
  44. package/dist/projects/types.js +2 -0
  45. package/dist/projects/types.js.map +1 -0
  46. package/dist/skills/platform-loader.js +133 -38
  47. package/dist/skills/platform-loader.js.map +1 -1
  48. package/dist/tools/__test__/mock-tool-context.js +31 -0
  49. package/dist/tools/__test__/mock-tool-context.js.map +1 -0
  50. package/dist/tools/file-state-cache.js.map +1 -1
  51. package/dist/tools/read-file.js +7 -2
  52. package/dist/tools/read-file.js.map +1 -1
  53. package/dist/ui/App.js +109 -110
  54. package/dist/ui/App.js.map +1 -1
  55. package/dist/ui/CompactionBanner.js +23 -0
  56. package/dist/ui/CompactionBanner.js.map +1 -0
  57. package/dist/ui/FirstRunSetup.js +66 -14
  58. package/dist/ui/FirstRunSetup.js.map +1 -1
  59. package/dist/ui/Input.js +370 -20
  60. package/dist/ui/Input.js.map +1 -1
  61. package/dist/ui/Markdown.js +286 -0
  62. package/dist/ui/Markdown.js.map +1 -0
  63. package/dist/ui/Message.js +110 -48
  64. package/dist/ui/Message.js.map +1 -1
  65. package/dist/ui/MessageList.js +100 -3
  66. package/dist/ui/MessageList.js.map +1 -1
  67. package/dist/ui/Permission.js +43 -20
  68. package/dist/ui/Permission.js.map +1 -1
  69. package/dist/ui/PixelC.js +25 -0
  70. package/dist/ui/PixelC.js.map +1 -0
  71. package/dist/ui/Status.js +267 -7
  72. package/dist/ui/Status.js.map +1 -1
  73. package/dist/ui/Throbber.js +11 -7
  74. package/dist/ui/Throbber.js.map +1 -1
  75. package/dist/ui/Welcome.js +59 -0
  76. package/dist/ui/Welcome.js.map +1 -0
  77. package/dist/ui/attachments.js +68 -0
  78. package/dist/ui/attachments.js.map +1 -0
  79. package/dist/ui/debug-input.js +44 -0
  80. package/dist/ui/debug-input.js.map +1 -0
  81. package/dist/ui/diff-summary.js +171 -0
  82. package/dist/ui/diff-summary.js.map +1 -0
  83. package/dist/ui/highlight.js +324 -0
  84. package/dist/ui/highlight.js.map +1 -0
  85. package/dist/ui/history-store.js +60 -0
  86. package/dist/ui/history-store.js.map +1 -0
  87. package/dist/ui/input-state.js +125 -1
  88. package/dist/ui/input-state.js.map +1 -1
  89. package/dist/ui/path-complete.js +102 -0
  90. package/dist/ui/path-complete.js.map +1 -0
  91. package/dist/ui/paths.js +41 -0
  92. package/dist/ui/paths.js.map +1 -0
  93. package/dist/ui/shell-escape.js +42 -0
  94. package/dist/ui/shell-escape.js.map +1 -0
  95. package/dist/ui/terminal-restore.js +83 -0
  96. package/dist/ui/terminal-restore.js.map +1 -0
  97. package/dist/ui/terminal-title.js +21 -0
  98. package/dist/ui/terminal-title.js.map +1 -0
  99. package/dist/ui/tool-call-line.js +83 -0
  100. package/dist/ui/tool-call-line.js.map +1 -0
  101. package/dist/ui/tool-labels.js +194 -0
  102. package/dist/ui/tool-labels.js.map +1 -0
  103. package/dist/ui/truncated-output.js +42 -0
  104. package/dist/ui/truncated-output.js.map +1 -0
  105. package/dist/ui/use-coalesced-agent-events.js +70 -0
  106. package/dist/ui/use-coalesced-agent-events.js.map +1 -0
  107. package/dist/ui/use-prompt-suggestion.js +52 -0
  108. package/dist/ui/use-prompt-suggestion.js.map +1 -0
  109. package/dist/ui/wrapped-lines.js +18 -0
  110. package/dist/ui/wrapped-lines.js.map +1 -0
  111. package/package.json +6 -1
@@ -1,7 +1,11 @@
1
1
  import { homedir } from "node:os";
2
2
  import { isAbsolute, join, resolve } from "node:path";
3
3
  import { Agent } from "@earendil-works/pi-agent-core";
4
+ import { defaultOAuthConfig } from "../auth/cli.js";
5
+ import { CredentialsStore } from "../auth/credentials.js";
6
+ import { TokenManager } from "../auth/token-manager.js";
4
7
  import { CompactionEngine } from "../compaction/engine.js";
8
+ import { CompactionMonitor } from "../compaction/monitor.js";
5
9
  import { ConfigStore } from "../config/store.js";
6
10
  import { DiagnosticsEngine, formatDiagnostics } from "../diagnostics/engine.js";
7
11
  import { GlueClient, resolveGlueModels } from "../glue/client.js";
@@ -36,9 +40,16 @@ const PLAN_MODE_BLOCKED = new Set([
36
40
  "exit_worktree",
37
41
  ]);
38
42
  export function createAgent(opts = {}) {
39
- const { model, apiKey, source } = resolveConfig();
43
+ const { model, apiKey, source } = opts.configOverride ?? resolveConfig();
40
44
  const cwd = opts.cwd ?? process.cwd();
41
45
  const systemPrompt = opts.systemPrompt ?? buildSystemPrompt(cwd);
46
+ // OAuth-sourced credentials rotate ~hourly; build a refresh-aware getter
47
+ // so the agent never sends a stale access token after the first refresh
48
+ // window. BYOK / explicit / auto sources use the static key passed in.
49
+ const tokenManager = source === "proxy"
50
+ ? new TokenManager({ store: new CredentialsStore(), oauthConfig: defaultOAuthConfig() })
51
+ : null;
52
+ const getApiKey = tokenManager ? () => tokenManager.getAccessToken() : () => apiKey;
42
53
  const config = new ConfigStore({ cwd });
43
54
  const permissions = new PermissionStore({
44
55
  allowPatterns: config.allowPatterns(),
@@ -55,9 +66,10 @@ export function createAgent(opts = {}) {
55
66
  const glue = new GlueClient({
56
67
  fastModel: glueModels.fast,
57
68
  smartModel: glueModels.smart,
58
- apiKey: glueModels.apiKey,
69
+ getApiKey,
59
70
  });
60
71
  const compaction = new CompactionEngine({ glue, modelId: model.id });
72
+ const compactionMonitor = new CompactionMonitor();
61
73
  const sessions = new SessionStore({ cwd });
62
74
  const resumed = opts.resume ? sessions.load(model.id) : null;
63
75
  const toolContext = {
@@ -70,7 +82,7 @@ export function createAgent(opts = {}) {
70
82
  hooks,
71
83
  spawnSubagent: ({ systemPrompt: subPrompt, tools: subTools }) => new Agent({
72
84
  initialState: { model, systemPrompt: subPrompt, tools: subTools },
73
- getApiKey: () => apiKey,
85
+ getApiKey,
74
86
  }),
75
87
  };
76
88
  // MEMORY.md gets concatenated onto the system prompt at agent creation.
@@ -87,16 +99,24 @@ export function createAgent(opts = {}) {
87
99
  transformContext: async (messages, signal) => {
88
100
  if (!compaction.needsCompaction(messages))
89
101
  return messages;
90
- await hooks.dispatch("PreCompact", { event: "PreCompact", workingDir: cwd, messageCount: messages.length }, signal);
91
- const result = await compaction.compact(messages, signal);
92
- await hooks.dispatch("PostCompact", {
93
- event: "PostCompact",
94
- workingDir: cwd,
95
- messageCount: result.messages.length,
96
- collapsedMessageCount: result.details.collapsedMessageCount,
97
- truncatedTokens: result.details.truncatedTokens,
98
- }, signal);
99
- return result.messages;
102
+ compactionMonitor.start(messages.length);
103
+ try {
104
+ await hooks.dispatch("PreCompact", { event: "PreCompact", workingDir: cwd, messageCount: messages.length }, signal);
105
+ const result = await compaction.compact(messages, signal);
106
+ await hooks.dispatch("PostCompact", {
107
+ event: "PostCompact",
108
+ workingDir: cwd,
109
+ messageCount: result.messages.length,
110
+ collapsedMessageCount: result.details.collapsedMessageCount,
111
+ truncatedTokens: result.details.truncatedTokens,
112
+ }, signal);
113
+ return result.messages;
114
+ }
115
+ finally {
116
+ // Always clear — even if compact() threw, the user shouldn't
117
+ // see a stuck "Compacting…" banner forever.
118
+ compactionMonitor.end();
119
+ }
100
120
  },
101
121
  beforeToolCall: async (ctx, signal) => {
102
122
  // 1. Plan mode gate: block destructive tools entirely while planning.
@@ -152,8 +172,14 @@ export function createAgent(opts = {}) {
152
172
  timestamp: Date.now(),
153
173
  });
154
174
  })
155
- .catch(() => {
156
- // Diagnostics failures are non-fatal — surface nothing.
175
+ .catch((err) => {
176
+ // Diagnostics failures are non-fatal — surface only when the
177
+ // user opted into debug. Silent before; that buried a real
178
+ // bug where a checker hung and the user thought the tool
179
+ // itself was slow.
180
+ if (process.env.CODEBASE_DEBUG === "1") {
181
+ process.stderr.write(`[diagnostics] ${absPath}: ${err instanceof Error ? err.message : String(err)}\n`);
182
+ }
157
183
  });
158
184
  }
159
185
  return undefined;
@@ -204,10 +230,12 @@ export function createAgent(opts = {}) {
204
230
  memory,
205
231
  glue,
206
232
  compaction,
233
+ compactionMonitor,
207
234
  sessions,
208
235
  hooks,
209
236
  diagnostics,
210
237
  subscribe,
238
+ resumedFrom: resumed ? { updatedAt: resumed.updatedAt, messageCount: resumed.messages.length } : undefined,
211
239
  };
212
240
  }
213
241
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,KAAK,EAAmB,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAuB,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;AAElH;;;;;GAKG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACtD,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,eAAe;IACf,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,eAAe;CACf,CAAC,CAAC;AAkCH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE;IACxD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACvC,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;KAC7B,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAChC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;QAC3B,SAAS,EAAE,UAAU,CAAC,IAAI;QAC1B,UAAU,EAAE,UAAU,CAAC,KAAK;QAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;KACzB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,MAAM,WAAW,GAAgB;QAChC,GAAG;QACH,cAAc,EAAE,IAAI,cAAc,EAAE;QACpC,KAAK,EAAE,IAAI,SAAS,EAAE;QACtB,WAAW;QACX,QAAQ;QACR,MAAM;QACN,KAAK;QACL,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC/D,IAAI,KAAK,CAAC;YACT,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;YACjE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;SACvB,CAAC;KACH,CAAC;IAEF,wEAAwE;IACxE,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACvB,YAAY,EAAE;YACb,KAAK;YACL,YAAY,EAAE,gBAAgB;YAC9B,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;YAC9B,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE;SACjC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;QACvB,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC5C,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC3D,MAAM,KAAK,CAAC,QAAQ,CACnB,YAAY,EACZ,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,EACvE,MAAM,CACN,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC1D,MAAM,KAAK,CAAC,QAAQ,CACnB,aAAa,EACb;gBACC,KAAK,EAAE,aAAa;gBACpB,UAAU,EAAE,GAAG;gBACf,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;gBACpC,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,qBAAqB;gBAC3D,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe;aAC/C,EACD,MAAM,CACN,CAAC;YACF,OAAO,MAAM,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;YACrC,sEAAsE;YACtE,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,OAAO;oBACN,KAAK,EAAE,IAAI;oBACX,MAAM,EACL,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,yCAAyC;wBAC7D,uEAAuE;iBACxE,CAAC;YACH,CAAC;YACD,gEAAgE;YAChE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACzE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;YAC9D,CAAC;YACD,iEAAiE;YACjE,MAAM,QAAQ,GAAI,GAAG,CAAC,IAAsC,EAAE,IAAI,CAAC;YACnE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CACnC,YAAY,EACZ;gBACC,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;gBAC3B,QAAQ,EAAE,GAAG,CAAC,IAAI;gBAClB,QAAQ;gBACR,UAAU,EAAE,GAAG;aACf,EACD,MAAM,CACN,CAAC;YACF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACtE,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAI,GAAG,CAAC,IAAsC,EAAE,IAAI,CAAC;YACnE,MAAM,KAAK,CAAC,QAAQ,CACnB,aAAa,EACb;gBACC,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;gBAC3B,QAAQ,EAAE,GAAG,CAAC,IAAI;gBAClB,QAAQ;gBACR,UAAU,EAAE,GAAG;aACf,EACD,MAAM,CACN,CAAC;YAEF,sEAAsE;YACtE,kEAAkE;YAClE,yDAAyD;YACzD,IAAI,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACzE,WAAW;qBACT,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;qBAC3B,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO;oBAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBACtC,QAAQ,EAAE,KAAK,CAAC;wBACf,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,sBAAsB,IAAI,sBAAsB;wBACzD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC,CAAC;gBACJ,CAAC,CAAC;qBACD,KAAK,CAAC,GAAG,EAAE;oBACX,wDAAwD;gBACzD,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC;KACD,CAAC,CAAC;IAEH,sEAAsE;IACtE,sEAAsE;IACtE,yEAAyE;IACzE,MAAM,QAAQ,GAAU,KAAK,CAAC;IAE9B,MAAM,SAAS,GAAG,CAAC,QAAqC,EAAgB,EAAE,CACzE,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEJ,0EAA0E;IAC1E,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QACvC,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClC,QAAQ,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;gBAC7B,QAAQ;gBACR,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI;oBACxB,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,CAAC;oBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;iBACpE;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,2EAA2E;QAC5E,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,KAAK,QAAQ,CAAC;IACd,OAAO;QACN,KAAK;QACL,KAAK;QACL,MAAM;QACN,WAAW;QACX,WAAW;QACX,WAAW;QACX,QAAQ;QACR,MAAM;QACN,IAAI;QACJ,UAAU;QACV,QAAQ;QACR,KAAK;QACL,WAAW;QACX,SAAS;KACT,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
@@ -95,17 +95,31 @@ export function resolveConfig(envOrOpts = process.env) {
95
95
  }
96
96
  return { model, apiKey, source: "explicit" };
97
97
  }
98
- for (const provider of AUTO_DETECT_ORDER) {
99
- const apiKey = getEnvApiKey(provider);
100
- if (!apiKey)
101
- continue;
102
- const modelId = DEFAULT_MODELS[provider];
103
- if (!modelId)
104
- continue;
105
- const model = getModel(provider, modelId);
106
- if (!model)
107
- continue;
108
- return { model, apiKey, source: "auto" };
98
+ // Env-var auto-detect is the legacy power-user path. We only honor it
99
+ // for users who have already onboarded — otherwise a stray
100
+ // ANTHROPIC_API_KEY or OPENAI_API_KEY in the shell would silently
101
+ // skip the OAuth wizard the first time a new user runs `codebase`,
102
+ // even though they almost certainly want the in-house default model
103
+ // with free credits rather than spending their own API key budget.
104
+ //
105
+ // "Already onboarded" = credentials.json exists on disk, even if it's
106
+ // now expired or empty. The wizard creates that file on first
107
+ // sign-in, so its presence is a reliable "this user knows what
108
+ // they're doing" signal.
109
+ const hasOnboarded = credentials.exists();
110
+ if (hasOnboarded) {
111
+ for (const provider of AUTO_DETECT_ORDER) {
112
+ const apiKey = getEnvApiKey(provider);
113
+ if (!apiKey)
114
+ continue;
115
+ const modelId = DEFAULT_MODELS[provider];
116
+ if (!modelId)
117
+ continue;
118
+ const model = getModel(provider, modelId);
119
+ if (!model)
120
+ continue;
121
+ return { model, apiKey, source: "auto" };
122
+ }
109
123
  }
110
124
  throw new ConfigError("No usable LLM provider found. Sign in with `codebase auth login`, paste an API key with " +
111
125
  "`codebase auth <key>`, or set one of: ANTHROPIC_API_KEY, OPENAI_API_KEY, GROQ_API_KEY, " +
@@ -113,23 +127,50 @@ export function resolveConfig(envOrOpts = process.env) {
113
127
  "Or set CODEBASE_PROVIDER + CODEBASE_MODEL explicitly.");
114
128
  }
115
129
  /**
116
- * Build a model whose baseUrl points at the codebase.foundation
117
- * inference proxy. The proxy MUST mimic the chosen provider's wire
118
- * protocol (Anthropic Messages, OpenAI Responses, etc.)what we send
119
- * here is identical to a direct call, the bearer token is the only
120
- * thing that changes.
130
+ * Build a model that routes through codebase.design's inference proxy.
131
+ *
132
+ * Default when signed in via OAuth: "Codebase Auto" the in-house
133
+ * MiniMax-M2.7 served via the openai-compat protocol. This matches
134
+ * what the web app calls the same model (`codebase` provider in
135
+ * web/backend/providers/registry.js).
136
+ *
137
+ * Override via env: CODEBASE_PROVIDER + CODEBASE_MODEL still pick a
138
+ * specific upstream from pi-ai's registry, also routed through the
139
+ * proxy. The proxy dispatches by the model id in the request body +
140
+ * the bearer scope on the token, so this works for any model the
141
+ * user's account has access to.
121
142
  */
122
143
  function buildProxiedConfig(env, accessToken) {
123
144
  const explicitProvider = env.CODEBASE_PROVIDER;
124
145
  const explicitModel = env.CODEBASE_MODEL;
125
- const provider = explicitProvider ?? "anthropic";
126
- const modelId = explicitModel ?? DEFAULT_MODELS[provider];
146
+ const proxyBase = (env.CODEBASE_PROXY_BASE_URL ?? DEFAULT_PROXY_BASE).replace(/\/+$/, "");
147
+ // Default: "Codebase Auto" synthesized openai-compat model.
148
+ // Can't use pi-ai's registry here because "codebase" isn't a
149
+ // KnownProvider; clone a known chat-completions model and override.
150
+ if (!explicitProvider) {
151
+ const template = getModel("groq", "llama-3.3-70b-versatile");
152
+ if (!template)
153
+ return null;
154
+ const model = {
155
+ ...template,
156
+ id: "MiniMax-M2.7",
157
+ name: "Codebase Auto",
158
+ baseUrl: proxyBase,
159
+ // Override provider so the status bar and /model don't lie about
160
+ // where this is served from. pi-ai uses `provider` mainly for
161
+ // display + a few baseUrl heuristics; the request body sends
162
+ // `model.id` only, so this cast is safe.
163
+ provider: "codebase",
164
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
165
+ };
166
+ return { model, apiKey: accessToken, source: "proxy" };
167
+ }
168
+ const modelId = explicitModel ?? DEFAULT_MODELS[explicitProvider];
127
169
  if (!modelId)
128
170
  return null;
129
- const baseModel = getModel(provider, modelId);
171
+ const baseModel = getModel(explicitProvider, modelId);
130
172
  if (!baseModel)
131
173
  return null;
132
- const proxyBase = (env.CODEBASE_PROXY_BASE_URL ?? DEFAULT_PROXY_BASE).replace(/\/+$/, "");
133
174
  const proxiedModel = { ...baseModel, baseUrl: proxyBase };
134
175
  return { model: proxiedModel, apiKey: accessToken, source: "proxy" };
135
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { bench, describe } from "vitest";
2
+ import { EMPTY_USAGE } from "../types.js";
3
+ import { initialState, reducer } from "./events.js";
4
+ const MODEL = { provider: "test", id: "test-model", name: "Test" };
5
+ /**
6
+ * Microbenchmarks for the reducer's hot paths. The streaming pipeline
7
+ * funnels every assistant token and every tool stdout chunk through
8
+ * this reducer — a 10ms regression here turns into perceptible
9
+ * scroll/render jank in the TUI. Baselines printed by `npm run bench:micro`
10
+ * are the contract; if these numbers degrade noticeably on a future PR,
11
+ * something in the reducer needs investigation.
12
+ */
13
+ function streamingMessage(text) {
14
+ return {
15
+ type: "message_update",
16
+ message: {
17
+ role: "assistant",
18
+ content: [{ type: "text", text }],
19
+ },
20
+ };
21
+ }
22
+ function toolStart(id) {
23
+ return {
24
+ type: "tool_execution_start",
25
+ toolCallId: id,
26
+ toolName: "read_file",
27
+ args: { path: "src/x.ts" },
28
+ };
29
+ }
30
+ function toolUpdate(id, n) {
31
+ return {
32
+ type: "tool_execution_update",
33
+ toolCallId: id,
34
+ partialResult: `chunk ${n}`,
35
+ };
36
+ }
37
+ describe("reducer hot paths", () => {
38
+ bench("apply 1000 message_update events (assistant token stream)", () => {
39
+ let s = initialState(MODEL);
40
+ // Seed a streaming message so message_update has something to overwrite.
41
+ s = reducer(s, {
42
+ type: "agent-event",
43
+ event: {
44
+ type: "message_start",
45
+ message: { role: "assistant", content: [] },
46
+ },
47
+ });
48
+ for (let i = 0; i < 1000; i++) {
49
+ s = reducer(s, { type: "agent-event", event: streamingMessage(`token-${i}`) });
50
+ }
51
+ });
52
+ bench("apply 1000 tool_execution_update events on a single tool (shell stdout)", () => {
53
+ let s = initialState(MODEL);
54
+ s = reducer(s, { type: "agent-event", event: toolStart("t1") });
55
+ for (let i = 0; i < 1000; i++) {
56
+ s = reducer(s, { type: "agent-event", event: toolUpdate("t1", i) });
57
+ }
58
+ });
59
+ bench("interleave 50 tools × 20 updates each (parallel tool burst)", () => {
60
+ let s = initialState(MODEL);
61
+ for (let i = 0; i < 50; i++) {
62
+ s = reducer(s, { type: "agent-event", event: toolStart(`t${i}`) });
63
+ }
64
+ for (let round = 0; round < 20; round++) {
65
+ for (let i = 0; i < 50; i++) {
66
+ s = reducer(s, { type: "agent-event", event: toolUpdate(`t${i}`, round) });
67
+ }
68
+ }
69
+ });
70
+ bench("user-prompt → agent-event sequence × 100 (full turn replay)", () => {
71
+ let s = initialState(MODEL);
72
+ for (let turn = 0; turn < 100; turn++) {
73
+ s = reducer(s, { type: "user-prompt", text: `prompt ${turn}` });
74
+ s = reducer(s, {
75
+ type: "agent-event",
76
+ event: {
77
+ type: "message_end",
78
+ message: { role: "assistant", content: [], usage: EMPTY_USAGE },
79
+ },
80
+ });
81
+ }
82
+ });
83
+ });
84
+ //# sourceMappingURL=events.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.bench.js","sourceRoot":"","sources":["../../src/agent/events.bench.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import { completeSimple } from "@earendil-works/pi-ai";
2
+ /**
3
+ * Prompt-suggestion ghost-text generation. After the agent goes idle,
4
+ * we issue a one-shot side call on the user's main model that reuses
5
+ * the parent's system prompt + conversation prefix and asks the model
6
+ * to predict the user's next input as a short string. The matching
7
+ * prefix lets the upstream's prompt cache reuse the parent's work, so
8
+ * the marginal cost is approximately the suggestion's own output
9
+ * tokens.
10
+ *
11
+ * Cost notes by provider:
12
+ * - Codebase Auto: zero marginal cost (in-house inference).
13
+ * - Anthropic / OpenAI: small (native prompt caching hits the prefix).
14
+ * - Other BYOK upstreams (Groq, Mistral, …): a small uncached call
15
+ * per suggestion. Disable via CODEBASE_NO_SUGGESTIONS=1.
16
+ */
17
+ /**
18
+ * Instructions appended as a final user message. Meta-prompts the model
19
+ * to predict the user's next input rather than respond as the assistant.
20
+ */
21
+ const SUGGESTION_PROMPT = `Switching to autocomplete mode for one reply.
22
+
23
+ Reread the conversation so far and forecast the user's next message — the words they themselves would type into the input box, not advice about what they should do.
24
+
25
+ Calibration: if the user would read your reply and think "yeah, I was about to send that," you nailed it. If they'd read it and think "the assistant is talking to me," you missed.
26
+
27
+ Guideline patterns:
28
+ - After a job that finished cleanly, the next ask is usually the obvious follow-through: run the tests, push the commit, open the PR, ship it.
29
+ - When you (the assistant) listed options, prefer the one the user clearly wants given the thread above.
30
+ - When you asked a yes/no, pick the answer their tone implies.
31
+ - When the last assistant turn was a stack trace, a clarifying question, or anything where the user needs a beat to react: produce nothing.
32
+
33
+ Things that disqualify a suggestion:
34
+ - Anything in your own voice ("I'll handle it", "Let me check", "Here's a plan").
35
+ - Praise or filler the user would never type to drive forward ("nice", "looks great", "thanks").
36
+ - Open-ended questions thrown back at you ("what do you think?").
37
+ - A pivot to a new topic the user didn't ask about.
38
+ - More than one sentence; more than about a dozen words.
39
+
40
+ Output: just the predicted user message, no quotes, no preamble, no trailing punctuation flourish. If nothing fits, return an empty reply.`;
41
+ /** Don't suggest before this many assistant turns — needs context to predict from. */
42
+ const MIN_ASSISTANT_TURNS = 2;
43
+ /** Cap output so a runaway model can't burn tokens. 60 ≈ 12 words × 5 token/word, with slack. */
44
+ const MAX_SUGGESTION_TOKENS = 60;
45
+ /**
46
+ * Try to produce a suggestion for the current conversation. Returns null
47
+ * when we shouldn't suggest (early turn, last response was an error,
48
+ * abort fired, model returned empty or filtered text).
49
+ */
50
+ export async function generateSuggestion(bundle, options = {}) {
51
+ const agentState = bundle.agent.state;
52
+ const messages = agentState.messages;
53
+ // Need at least a couple assistant turns to predict from — anything
54
+ // less and the suggestion is guessing into the void.
55
+ const assistantTurnCount = messages.reduce((n, m) => n + (m.role === "assistant" ? 1 : 0), 0);
56
+ if (assistantTurnCount < MIN_ASSISTANT_TURNS)
57
+ return null;
58
+ // If the latest assistant message errored, the user should read/react,
59
+ // not be nudged to type more.
60
+ const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant");
61
+ if (lastAssistant && "errorMessage" in lastAssistant && lastAssistant.errorMessage)
62
+ return null;
63
+ const suggestionMessages = [
64
+ ...messages,
65
+ {
66
+ role: "user",
67
+ content: SUGGESTION_PROMPT,
68
+ timestamp: Date.now(),
69
+ },
70
+ ];
71
+ let assistantMessage;
72
+ try {
73
+ assistantMessage = await completeSimple(agentState.model, {
74
+ systemPrompt: agentState.systemPrompt,
75
+ messages: suggestionMessages,
76
+ }, {
77
+ signal: options.signal,
78
+ maxTokens: MAX_SUGGESTION_TOKENS,
79
+ temperature: 0.7,
80
+ // `cacheRetention: "short"` is pi-ai's default — keeps the
81
+ // suggestion fork from extending the parent's cache TTL,
82
+ // which the agent loop manages on its own.
83
+ });
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ const text = extractText(assistantMessage).trim();
89
+ if (!text)
90
+ return null;
91
+ if (shouldFilterSuggestion(text))
92
+ return null;
93
+ return text;
94
+ }
95
+ function extractText(message) {
96
+ if (typeof message.content === "string")
97
+ return message.content;
98
+ if (!Array.isArray(message.content))
99
+ return "";
100
+ const parts = [];
101
+ for (const block of message.content) {
102
+ if (block.type === "text" && typeof block.text === "string") {
103
+ parts.push(block.text);
104
+ }
105
+ }
106
+ return parts.join("");
107
+ }
108
+ /**
109
+ * Filter out suggestions that don't look like real user input. Catches
110
+ * the things the model emits when it doesn't know what to suggest but
111
+ * isn't willing to stay silent.
112
+ */
113
+ function shouldFilterSuggestion(text) {
114
+ const lower = text.toLowerCase();
115
+ if (lower === "done" || lower === "done.")
116
+ return true;
117
+ if (lower === "nothing found" || lower === "nothing found.")
118
+ return true;
119
+ if (lower.startsWith("nothing to suggest") || lower.startsWith("no suggestion"))
120
+ return true;
121
+ if (/\bstay(s|ing)? silent\b|\bsilence is\b/.test(lower))
122
+ return true;
123
+ if (/^\W*silence\W*$/.test(lower))
124
+ return true;
125
+ // Assistant-voice slippage — model addresses the user as if it were
126
+ // replying in-character instead of predicting their input.
127
+ if (/^(let me|i('|\s)ll|here('|\s)s|i can|i('|\s)d)\b/i.test(text))
128
+ return true;
129
+ // Evaluative one-liners — these aren't actions, they're chitchat the
130
+ // user wouldn't typically type to drive forward.
131
+ if (/^(looks good|thanks|nice|great|ok|okay|yes)\.?$/i.test(text.trim()))
132
+ return true;
133
+ // Too long — keep ghost-text legible in the input row.
134
+ if (text.split(/\s+/).length > 12)
135
+ return true;
136
+ // Multi-sentence — pick a single utterance.
137
+ if (/[.!?]\s+\S/.test(text))
138
+ return true;
139
+ return false;
140
+ }
141
+ //# sourceMappingURL=prompt-suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-suggestion.js","sourceRoot":"","sources":["../../src/agent/prompt-suggestion.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,21 @@ export function buildSystemPrompt(cwd = process.cwd()) {
10
10
  "",
11
11
  "Be concise. Prefer code over prose. When you don't have a tool to act, say what you would do.",
12
12
  "",
13
+ "Task checklist (create_task / update_task):",
14
+ " Use the task tools to keep a visible checklist whenever the user's request needs more than 2-3 steps,",
15
+ " spans multiple files or commands, or the user gave you a numbered/bulleted list. The user sees this",
16
+ " list update in real time and judges progress from it.",
17
+ " Skip it for single trivial actions, pure Q&A, and one-off shell commands.",
18
+ " Rules:",
19
+ " - Create the full plan at the start of the work, one task per intended step.",
20
+ " - Provide both an imperative title ('Add OAuth refresh') and an active_form ('Adding OAuth refresh').",
21
+ " - Exactly ONE task is in_progress at any time. Flip the next one to in_progress BEFORE starting it,",
22
+ " and mark it completed IMMEDIATELY after it finishes — never batch completions.",
23
+ " - Never mark a task completed if it errored, tests are failing, or you couldn't finish.",
24
+ " Keep it in_progress and create a follow-up task for whatever's blocking.",
25
+ " - If you discover work mid-task that wasn't planned, append new tasks to the list.",
26
+ " - Cancel tasks that turned out to be unnecessary; don't leave stale 'pending' items.",
27
+ "",
13
28
  "Environment:",
14
29
  ` cwd: ${cwd}`,
15
30
  ` platform: ${platform()}`,
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,KAAK,GAAG;QACb,wGAAwG;QACxG,EAAE;QACF,+FAA+F;QAC/F,EAAE;QACF,cAAc;QACd,UAAU,GAAG,EAAE;QACf,eAAe,QAAQ,EAAE,EAAE;QAC3B,WAAW,QAAQ,EAAE,EAAE;QACvB,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;KAClD,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,KAAK,GAAG;QACb,wGAAwG;QACxG,EAAE;QACF,+FAA+F;QAC/F,EAAE;QACF,6CAA6C;QAC7C,yGAAyG;QACzG,uGAAuG;QACvG,yDAAyD;QACzD,6EAA6E;QAC7E,UAAU;QACV,kFAAkF;QAClF,2GAA2G;QAC3G,yGAAyG;QACzG,sFAAsF;QACtF,6FAA6F;QAC7F,gFAAgF;QAChF,wFAAwF;QACxF,0FAA0F;QAC1F,EAAE;QACF,cAAc;QACd,UAAU,GAAG,EAAE;QACf,eAAe,QAAQ,EAAE,EAAE;QAC3B,WAAW,QAAQ,EAAE,EAAE;QACvB,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;KAClD,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export function isCommand(value) {
2
+ return typeof value === "object" && value !== null && typeof value.type === "string";
3
+ }
4
+ export function buildErrorResponse(id, command, error) {
5
+ return { id, type: "response", command, success: false, error };
6
+ }
7
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/app-server/protocol.ts"],"names":[],"mappings":"AA4HA,MAAM,UAAU,SAAS,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAsB,EAAE,OAAe,EAAE,KAAa;IACxF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjE,CAAC"}