@pellux/goodvibes-agent 1.8.1 → 1.8.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 (88) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +1 -1
  3. package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-44ar68xs.node} +0 -0
  4. package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-asvc2tv1.node} +0 -0
  5. package/dist/package/main.js +135337 -118733
  6. package/dist/package/{web-tree-sitter-vmqc5d26.wasm → web-tree-sitter-jbz042ba.wasm} +0 -0
  7. package/docs/tools-and-commands.md +9 -0
  8. package/package.json +3 -2
  9. package/src/agent/capability-registry.ts +300 -0
  10. package/src/agent/email/style-reply-lane.ts +13 -4
  11. package/src/agent/memory-consolidation-receipts.ts +79 -0
  12. package/src/agent/memory-prompt.ts +3 -1
  13. package/src/agent/operator-gateway-call.ts +134 -0
  14. package/src/agent/principal-attribution.ts +97 -0
  15. package/src/agent/prompt-context-receipts.ts +5 -1
  16. package/src/agent/unified-inbox.ts +17 -1
  17. package/src/cli/bundle-command.ts +2 -1
  18. package/src/cli/channel-profiles-command.ts +168 -0
  19. package/src/cli/ci-command.ts +214 -0
  20. package/src/cli/completion.ts +5 -0
  21. package/src/cli/connected-host-metrics.ts +165 -0
  22. package/src/cli/entrypoint.ts +25 -1
  23. package/src/cli/fleet-command.ts +178 -0
  24. package/src/cli/help.ts +115 -0
  25. package/src/cli/import-command.ts +208 -0
  26. package/src/cli/index.ts +1 -0
  27. package/src/cli/management-commands.ts +9 -8
  28. package/src/cli/management.ts +42 -0
  29. package/src/cli/memory-command.ts +4 -3
  30. package/src/cli/openclaw-import.ts +382 -0
  31. package/src/cli/operator-command-args.ts +88 -0
  32. package/src/cli/parser.ts +12 -0
  33. package/src/cli/personas-command.ts +3 -2
  34. package/src/cli/principals-command.ts +230 -0
  35. package/src/cli/profiles-command.ts +2 -1
  36. package/src/cli/relay-command.ts +100 -0
  37. package/src/cli/routines-command.ts +4 -3
  38. package/src/cli/skill-bundle-command.ts +3 -2
  39. package/src/cli/skills-command.ts +3 -2
  40. package/src/cli/status.ts +114 -2
  41. package/src/cli/temporal-label.ts +89 -0
  42. package/src/cli/types.ts +7 -0
  43. package/src/cli/workspaces-command.ts +135 -0
  44. package/src/config/agent-settings-policy.ts +8 -0
  45. package/src/config/checkpoint-settings.ts +113 -0
  46. package/src/config/workspace-registration.ts +299 -0
  47. package/src/core/rewind-turn-anchors.ts +82 -0
  48. package/src/input/agent-workspace-categories.ts +1 -0
  49. package/src/input/agent-workspace-channel-triage.ts +27 -8
  50. package/src/input/agent-workspace-local-library-snapshot.ts +5 -1
  51. package/src/input/agent-workspace-onboarding-categories.ts +17 -1
  52. package/src/input/agent-workspace-snapshot.ts +25 -3
  53. package/src/input/agent-workspace-types.ts +5 -5
  54. package/src/input/commands/connected-host-admin-runtime.ts +75 -0
  55. package/src/input/commands.ts +2 -0
  56. package/src/input/settings-modal-types.ts +16 -5
  57. package/src/main.ts +17 -12
  58. package/src/permissions/approval-posture.ts +40 -5
  59. package/src/permissions/prompt.ts +35 -1
  60. package/src/renderer/settings-modal-helpers.ts +11 -0
  61. package/src/renderer/settings-modal.ts +21 -0
  62. package/src/renderer/terminal-escapes.ts +65 -12
  63. package/src/runtime/agent-runtime-events.ts +102 -3
  64. package/src/runtime/bootstrap-core.ts +111 -10
  65. package/src/runtime/bootstrap-external-services.ts +156 -0
  66. package/src/runtime/bootstrap.ts +73 -69
  67. package/src/runtime/context-accounting-source.ts +114 -0
  68. package/src/runtime/conversation-rewind-port.ts +133 -0
  69. package/src/runtime/index.ts +8 -28
  70. package/src/runtime/memory-consolidation-scheduler.ts +67 -0
  71. package/src/runtime/memory-consolidation-wiring.ts +56 -0
  72. package/src/runtime/memory-usage-wiring.ts +75 -0
  73. package/src/runtime/services.ts +250 -14
  74. package/src/runtime/tool-permission-safety.ts +18 -1
  75. package/src/shell/blocking-input.ts +38 -8
  76. package/src/shell/startup-wiring.ts +26 -1
  77. package/src/tools/agent-context-policy.ts +1 -1
  78. package/src/tools/agent-harness-cli-command-policy.ts +29 -3
  79. package/src/tools/agent-harness-learning-auto-promote.ts +7 -3
  80. package/src/tools/agent-harness-memory-posture.ts +57 -2
  81. package/src/tools/agent-harness-metadata.ts +12 -0
  82. package/src/tools/agent-harness-mode-catalog.ts +1 -1
  83. package/src/tools/agent-harness-personal-ops-lanes.ts +8 -6
  84. package/src/tools/agent-harness-prompt-context.ts +3 -1
  85. package/src/tools/agent-harness-tool.ts +3 -2
  86. package/src/tools/agent-policy-explanation.ts +40 -0
  87. package/src/tools/tool-definition-compaction.ts +2 -0
  88. package/src/version.ts +1 -1
@@ -173,9 +173,13 @@ function tryConsolidateNonMemoryCandidate(
173
173
  // ---------------------------------------------------------------------------
174
174
 
175
175
  /**
176
- * Run the autonomous promotion pass. Promotes `ready-to-promote` candidates
177
- * and resolves `needs-consolidation` duplicates (non-memory domains) without
178
- * requiring confirm:true / explicitUserRequest.
176
+ * Run the promotion pass. Promotes `ready-to-promote` candidates and resolves
177
+ * `needs-consolidation` duplicates (non-memory domains).
178
+ *
179
+ * The caller (agent_harness mode:"learning_auto_promote") gates this pass behind
180
+ * an explicit user request plus confirm:true, because it creates and deletes
181
+ * memory records, personas, and routines. This function assumes that gate has
182
+ * already been cleared.
179
183
  *
180
184
  * Secret scanning is enforced by each registry's create() method — this
181
185
  * function does NOT bypass it.
@@ -1,6 +1,13 @@
1
- import type { MemoryDoctorReport, MemoryEmbeddingProviderStatus, MemoryVectorStats } from '@pellux/goodvibes-sdk/platform/state';
1
+ import {
2
+ MemoryUsageStatsStore,
3
+ type MemoryDoctorReport,
4
+ type MemoryEmbeddingProviderStatus,
5
+ type MemoryVectorStats,
6
+ type MemoryUsageSummary,
7
+ } from '@pellux/goodvibes-sdk/platform/state';
2
8
  import type { CommandContext } from '../input/command-registry.ts';
3
9
  import { buildAgentWorkspaceRuntimeSnapshot } from '../input/agent-workspace-snapshot.ts';
10
+ import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
4
11
  import { previewHarnessText } from './agent-harness-text.ts';
5
12
  import { EXTERNAL_MEMORY_RECEIPT_FIELDS, EXTERNAL_MEMORY_REQUIRED_CONTRACTS, aggregateExternalProviderLiveRecord, aggregateExternalProviderSetupStatus, externalMemoryLiveProviderRecords, externalMemoryProviderCatalog, externalMemoryReceiptEvidence, externalProviderLiveReady, liveRecordForProvider, receiptEvidenceForProvider, setupStatusFromLiveRecord } from './agent-harness-memory-external-providers.ts';
6
13
  import type { ExternalMemoryProviderCatalogEntry, MemoryExternalProviderContractCheck, MemoryExternalProviderContractStatus, MemoryExternalProviderLiveRecord, MemoryExternalProviderReceiptContract, MemoryExternalProviderReceiptEvidence, MemoryExternalProviderRoute, MemoryExternalProviderSetupGuide, MemoryExternalProviderStatus, MemoryPostureProvider, MemoryProviderResolution } from './agent-harness-memory-external-providers.ts';
@@ -32,6 +39,40 @@ function memoryApi(context: CommandContext): {
32
39
  return context.clients?.agentKnowledgeApi?.memory ?? null;
33
40
  }
34
41
 
42
+ /**
43
+ * Per-memory usage counters (injected/referenced) from the honest usage-outcome
44
+ * instrumentation. Read-only view built from the same durable sidecar the runtime
45
+ * writes; null when there is no active workspace to resolve the path from.
46
+ */
47
+ function readMemoryUsageSummary(context: CommandContext): MemoryUsageSummary | null {
48
+ const shellPaths = context.workspace?.shellPaths;
49
+ if (!shellPaths) return null;
50
+ try {
51
+ const store = new MemoryUsageStatsStore(shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, 'learning', 'memory-usage.json'));
52
+ return store.summary();
53
+ } catch {
54
+ return null;
55
+ }
56
+ }
57
+
58
+ function buildUsageSection(summary: MemoryUsageSummary | null): Record<string, unknown> {
59
+ if (!summary) {
60
+ return { status: 'unavailable', signal: 'heuristic-overlap', note: 'No usage instrumentation available in this runtime.' };
61
+ }
62
+ return {
63
+ status: summary.everInjected > 0 ? 'tracked' : 'empty',
64
+ signal: 'heuristic-overlap',
65
+ signalNote: summary.signalNote,
66
+ totalTracked: summary.totalTracked,
67
+ everInjected: summary.everInjected,
68
+ everReferenced: summary.everReferenced,
69
+ neverReferenced: summary.neverReferenced,
70
+ mostReferenced: summary.mostReferenced.map((entry) => ({ id: entry.id, injectedCount: entry.injectedCount, referencedCount: entry.referencedCount, lastReferencedAt: entry.lastReferencedAt })),
71
+ neverReferencedSample: summary.neverReferencedSample.map((entry) => ({ id: entry.id, injectedCount: entry.injectedCount, lastInjectedAt: entry.lastInjectedAt })),
72
+ policy: 'Referenced means the model output overlapped this memory\'s distinctive content (heuristic, not ground truth). Never-referenced injected memories decay first during idle consolidation.',
73
+ };
74
+ }
75
+
35
76
  async function readMemoryDoctor(context: CommandContext): Promise<MemoryDoctorReport | null> {
36
77
  const memory = memoryApi(context);
37
78
  if (!memory || typeof memory.doctor !== 'function') return null;
@@ -532,13 +573,21 @@ export async function memoryPostureCatalogStatus(context: CommandContext): Promi
532
573
  const liveRecords = await externalMemoryLiveProviderRecords(context);
533
574
  const status = memoryStatus(snapshot, Boolean(memoryApi(context)));
534
575
  const vectorState = vectorStatus(vector);
576
+ const usageSummary = readMemoryUsageSummary(context);
535
577
  return {
536
578
  modes: ['memory_posture', 'memory_provider'],
579
+ usageTracked: usageSummary?.everInjected ?? 0,
580
+ usageReferenced: usageSummary?.everReferenced ?? 0,
581
+ usageNeverReferenced: usageSummary?.neverReferenced ?? 0,
537
582
  modelRoute: 'memory action:"status"',
538
583
  status,
539
584
  localMemories: snapshot.localMemoryCount,
540
585
  reviewQueue: snapshot.localMemoryReviewQueueCount,
541
586
  promptActive: snapshot.localMemoryPromptActiveCount,
587
+ // Visible expiry: still stored (counted in localMemories), never deleted,
588
+ // but outside their temporal validity window so not prompt-injected.
589
+ temporallyPending: snapshot.localMemoryTemporallyPendingCount,
590
+ temporallyExpired: snapshot.localMemoryTemporallyExpiredCount,
542
591
  vector: vectorState,
543
592
  embeddingProviders: doctor?.embeddings.providers.length ?? 0,
544
593
  externalProviders: externalMemoryProviderCatalog(liveRecords, receiptEvidence).length,
@@ -569,8 +618,13 @@ export async function memoryPostureSummary(context: CommandContext, args: AgentH
569
618
  total: snapshot.localMemoryCount,
570
619
  reviewQueue: snapshot.localMemoryReviewQueueCount,
571
620
  promptActive: snapshot.localMemoryPromptActiveCount,
621
+ // Visible expiry (temporal validity window): still stored and counted in
622
+ // `total`, never deleted, but outside [validFrom, validUntil) so not
623
+ // prompt-injected — see memoryRecordTemporalStatus.
624
+ temporallyPending: snapshot.localMemoryTemporallyPendingCount,
625
+ temporallyExpired: snapshot.localMemoryTemporallyExpiredCount,
572
626
  sessionMemory: snapshot.sessionMemoryCount,
573
- policy: 'Only reviewed, high-confidence Agent-local memories are prompt-active. Fresh/stale/setup-blocked behavior stays visible for review.',
627
+ policy: 'Only reviewed, high-confidence, temporally-active Agent-local memories are prompt-active. Fresh/stale/setup-blocked/pending/expired behavior stays visible for review.',
574
628
  routes: {
575
629
  list: 'memory action:"list"',
576
630
  search: 'memory action:"search" query:"..."',
@@ -579,6 +633,7 @@ export async function memoryPostureSummary(context: CommandContext, args: AgentH
579
633
  curator: 'memory action:"curator"',
580
634
  },
581
635
  },
636
+ usage: buildUsageSection(readMemoryUsageSummary(context)),
582
637
  vector: compactVector(vector),
583
638
  embeddings: {
584
639
  activeProviderId: doctor?.embeddings.activeProviderId ?? vector?.embeddingProviderId ?? snapshot.embeddingProvider,
@@ -204,6 +204,18 @@ export function describeCommandPolicy(commandName: string): CommandExecutionPoli
204
204
  boundary: 'Only explicit allowlisted approval and automation operator actions should be performed from the model.',
205
205
  };
206
206
  }
207
+ if (root === 'ci' || root === 'principals' || root === 'principal' || root === 'channel-profiles' || root === 'channel-profile') {
208
+ return {
209
+ effect: 'connected-host-state',
210
+ confirmation,
211
+ // agent_operator_method, NOT agent_operator_action: the action tool's
212
+ // allowlist covers only approvals.* and automation.* and cannot invoke
213
+ // ci.*/principals.*/channels.profiles.* — pointing the model there would
214
+ // dead-end in "unknown action".
215
+ preferredModelTool: 'agent_operator_method (methodId "ci.status", "ci.watches.*", "principals.*", "channels.profiles.*")',
216
+ boundary: 'CI status/watches, principal identity mappings, and per-channel profile defaults live on the connected host. Reads run through agent_operator_method without confirmation; writes require confirm + explicitUserRequest there, and mutating slash/CLI subcommands require --yes.',
217
+ };
218
+ }
207
219
  if (root === 'schedule' || root === 'remind' || root === 'reminder') {
208
220
  return {
209
221
  effect: 'connected-host-state',
@@ -100,7 +100,7 @@ export const HARNESS_MODE_DESCRIPTORS: readonly HarnessModeDescriptor[] = [
100
100
  { id: 'autonomy_queue_item', kind: 'inspect', family: 'personal-ops', summary: 'Inspect one autonomy card, live records, tails, and routes.', next: 'Prefer autonomy action:"item".', parameters: ['queueItemId', 'target', 'query'] },
101
101
  { id: 'learning_curator', kind: 'discover', family: 'personal-ops', summary: 'Rank memory, notes, personas, skills, routines review/proposals.', next: 'Prefer memory action:"curator"; use action:"candidate" for one card.', parameters: ['query', 'limit', 'includeParameters'] },
102
102
  { id: 'learning_candidate', kind: 'inspect', family: 'personal-ops', summary: 'Inspect one local-learning candidate and safe existing routes.', parameters: ['candidateId', 'target', 'query'] },
103
- { id: 'learning_auto_promote', kind: 'effect', family: 'personal-ops', summary: 'Auto-promote ready-to-promote; consolidate duplicates autonomously.', next: 'Use memory action:"curator" to see eligible items, then invoke.', keywords: ['auto promote', 'autonomous promotion', 'consolidate duplicates', 'learning loop', 'auto learning'] },
103
+ { id: 'learning_auto_promote', kind: 'effect', family: 'personal-ops', summary: 'Promote ready-to-promote; consolidate duplicates on confirmation.', next: 'Use memory action:"curator" to see eligible items, then confirm.', requiresConfirmation: true, keywords: ['auto promote', 'promotion', 'consolidate duplicates', 'learning loop', 'auto learning'], parameters: ['confirm', 'explicitUserRequest'] },
104
104
  { id: 'research_briefing', kind: 'discover', family: 'research', summary: 'Show one next-action queue for research runs, sources, reports.', next: 'Use research action:"briefing".', keywords: ['deep research', 'research cockpit', 'research next actions', 'research queue', 'source review', 'report queue'], parameters: ['query', 'target', 'limit', 'includeParameters'] },
105
105
  { id: 'research_workflow', kind: 'discover', family: 'research', summary: 'Plan research routes across run, source, report, browser, Knowledge.', next: 'Use research action:"plan"; runner checks browser readiness only.', parameters: ['query', 'target', 'runId', 'includeParameters'] },
106
106
  { id: 'research_runs', kind: 'discover', family: 'research', summary: 'List deep-research runs, phase, log tails, and controls.', next: 'Use research_run for one run.', parameters: ['query', 'limit', 'includeParameters'] },
@@ -5,7 +5,13 @@ import { providerBackedQueueRecords } from './agent-harness-personal-ops-provide
5
5
  import { providerBackedReminderRecords, providerBackedTaskRecords } from './agent-harness-personal-ops-provider-task-records.ts';
6
6
  import { channelRecords, connectorRecords, localRecord, refreshableSavedRecordCount, reminderOperationRecords, routineReceiptRecord, savedProviderEffectReceiptRecords, savedReviewArtifactRecords, savedReviewQueueRecords, taskOperationRecords } from './agent-harness-personal-ops-records.ts';
7
7
  import type { McpToolRecord, McpToolSchema, PersonalOpsLane, PersonalOpsLiveRecord } from './agent-harness-personal-ops-types.ts';
8
- import { buildStyleReplyLaneAdditions } from '../agent/email/style-reply-lane.ts';
8
+ // Capability-honesty note: the writing-style-matched draft-reply composer
9
+ // (src/agent/email/style-reply.ts + style-reply-lane.ts) is NOT wired into the
10
+ // advertised inbox lane. The Agent has no reader for the user's own sent-message
11
+ // corpus, so it cannot honestly claim a style match, and competitive-feature-
12
+ // inventory.ts records writing-style-matched draft replies as "not yet shipped".
13
+ // The composer stays as tested internal code; do not re-advertise it here until
14
+ // the sent-corpus input and a real compose route ship together.
9
15
 
10
16
  export function buildLanes(
11
17
  context: CommandContext,
@@ -51,9 +57,6 @@ export function buildLanes(
51
57
  && routine.reviewState === 'reviewed'
52
58
  && (routine.missingRequirementCount ?? 0) === 0
53
59
  )).length;
54
- const hasEmailCapability = emailMethods.length > 0 || emailConnectors.length > 0;
55
- const styleReplyAdditions = buildStyleReplyLaneAdditions(hasEmailCapability);
56
-
57
60
  return [
58
61
  {
59
62
  id: 'inbox',
@@ -101,14 +104,13 @@ export function buildLanes(
101
104
  ],
102
105
  methodIds: emailMethods,
103
106
  connectorSignals: emailConnectors,
104
- workflows: [...inboxWorkflows(emailMethods, emailConnectors, unavailableEmailMethods), styleReplyAdditions.workflow],
107
+ workflows: inboxWorkflows(emailMethods, emailConnectors, unavailableEmailMethods),
105
108
  liveRecords: [
106
109
  ...inboxProviderRecords,
107
110
  ...inboxReviewQueueRecords,
108
111
  ...inboxArtifactRecords,
109
112
  ...inboxEffectReceiptRecords,
110
113
  ...connectorRecords(emailConnectors, 'Inbox', 'inbox'),
111
- styleReplyAdditions.liveRecord,
112
114
  ],
113
115
  },
114
116
  {
@@ -190,7 +190,9 @@ function formatMemoryLine(record: MemoryRecord): string {
190
190
 
191
191
  function promptMemoryRecords(memory: PromptMemoryApi | undefined): readonly MemoryRecord[] {
192
192
  if (!memory) return [];
193
- return memory.getAll().filter(isPromptActiveMemory).sort(memorySort).slice(0, 10);
193
+ // Bound to one arg — see prompt-context-receipts.ts for why a bare
194
+ // `.filter(isPromptActiveMemory)` leaks the array index in as `now`.
195
+ return memory.getAll().filter((record) => isPromptActiveMemory(record)).sort(memorySort).slice(0, 10);
194
196
  }
195
197
 
196
198
  function buildMemoryPromptFromRecords(records: readonly MemoryRecord[]): string {
@@ -493,6 +493,7 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
493
493
  }
494
494
  if (args.mode === 'learning_curator') return output(learningCuratorSummary(deps.commandContext, args));
495
495
  if (args.mode === 'learning_auto_promote') {
496
+ const confirmationError = requireConfirmedAction(args, 'Learning promotion'); if (confirmationError) return error(confirmationError);
496
497
  const shellPaths = deps.commandContext.workspace?.shellPaths;
497
498
  if (!shellPaths) return error('learning_auto_promote requires an active workspace.');
498
499
  const memoryApi = deps.commandContext.clients?.agentKnowledgeApi?.memory;
@@ -503,8 +504,8 @@ export function createAgentHarnessTool(deps: AgentHarnessToolDeps): Tool {
503
504
  ...result,
504
505
  message: result.promoted > 0
505
506
  ? `Promoted ${result.promoted} item(s); consolidated ${result.consolidated} duplicate(s).`
506
- : 'No items eligible for autonomous promotion this pass.',
507
- policy: 'Autonomous promotion. Skills are created via the skill-draft runner. Memory, persona, routine creates call registry directly. Consolidation runs the full merge-stale-delete pipeline. Secret scanning enforced by each registry create().',
507
+ : 'No items eligible for promotion this pass.',
508
+ policy: 'Confirmed promotion. Skills are created via the skill-draft runner. Memory, persona, routine creates call registry directly. Consolidation runs the full merge-stale-delete pipeline. Secret scanning enforced by each registry create().',
508
509
  });
509
510
  }
510
511
  if (args.mode === 'learning_candidate') {
@@ -233,6 +233,46 @@ function predictPermission(context: CommandContext, toolName: string, category:
233
233
  };
234
234
  }
235
235
 
236
+ if (mode === 'plan') {
237
+ if (category === 'read') {
238
+ return {
239
+ outcome: 'allowed',
240
+ sourceLayer: 'runtime_mode',
241
+ reasonCode: 'mode_allow_all',
242
+ mode,
243
+ reason: 'Plan mode auto-allows read-only actions.',
244
+ };
245
+ }
246
+ return {
247
+ outcome: 'denied',
248
+ sourceLayer: 'runtime_mode',
249
+ reasonCode: 'plan_mode',
250
+ mode,
251
+ reason: `Plan mode refuses ${category} actions outright — it never asks; the model presents a plan instead of acting.`,
252
+ };
253
+ }
254
+
255
+ if (mode === 'accept-edits') {
256
+ if (category === 'read' || category === 'write') {
257
+ return {
258
+ outcome: 'allowed',
259
+ sourceLayer: 'runtime_mode',
260
+ reasonCode: category === 'write' ? 'mode_accept_edits' : 'mode_allow_all',
261
+ mode,
262
+ reason: category === 'write'
263
+ ? 'Accept-edits mode auto-approves file write/edit actions.'
264
+ : 'Accept-edits mode auto-allows read-only actions.',
265
+ };
266
+ }
267
+ return {
268
+ outcome: 'prompt',
269
+ sourceLayer: 'user_prompt_pending',
270
+ reasonCode: 'prompt_required',
271
+ mode,
272
+ reason: `Accept-edits mode still asks before ${category} actions.`,
273
+ };
274
+ }
275
+
236
276
  if (mode === 'custom') {
237
277
  const toolConfigKey = TOOL_CONFIG_KEYS[toolName];
238
278
  if (!toolConfigKey) {
@@ -13,6 +13,7 @@ const TOOL_DESCRIPTION_OVERRIDES: Readonly<Record<string, string>> = {
13
13
  computer: 'Inspect/open browser, desktop, and computer routes.',
14
14
  context: 'Inspect project instructions and prompt context.',
15
15
  delegation: 'Inspect build delegation routes and policy.',
16
+ context_accounting: 'Report live session context: usage and compaction.',
16
17
  control: 'Inspect commands, panels, and runtime posture.',
17
18
  device: 'Inspect/open device, voice, and browser routes.',
18
19
  execution: 'Inspect local work routes, history, and recovery.',
@@ -36,6 +37,7 @@ const TOOL_DESCRIPTION_OVERRIDES: Readonly<Record<string, string>> = {
36
37
  registry: 'Discover local skills, agents, tools, and templates.',
37
38
  remote: 'Manage remote runner pools and artifacts.',
38
39
  repl: 'Evaluate bounded JS, TS, Python, SQL, or GraphQL.',
40
+ repo_map: 'Return a token-budgeted map of the repository.',
39
41
  route: 'Choose the best visible route for a user task.',
40
42
  schedule: 'List, create, edit, run, pause, resume schedules.',
41
43
  security: 'Read security posture, findings, and policy decisions.',
package/src/version.ts CHANGED
@@ -6,7 +6,7 @@ import { join } from 'node:path';
6
6
  // The prebuild script updates the fallback value before compilation.
7
7
  // Uses import.meta.dir (Bun) to locate package.json relative to this file,
8
8
  // which is correct regardless of the process working directory.
9
- let _version = '1.8.1';
9
+ let _version = '1.8.2';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
12
12
  readonly version?: unknown;