@pellux/goodvibes-agent 1.8.0 → 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.
- package/CHANGELOG.md +9 -0
- package/README.md +1 -1
- package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-44ar68xs.node} +0 -0
- package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-asvc2tv1.node} +0 -0
- package/dist/package/main.js +135434 -118764
- package/dist/package/{web-tree-sitter-vmqc5d26.wasm → web-tree-sitter-jbz042ba.wasm} +0 -0
- package/docs/tools-and-commands.md +9 -0
- package/package.json +3 -2
- package/src/agent/capability-registry.ts +300 -0
- package/src/agent/email/style-reply-lane.ts +13 -4
- package/src/agent/memory-consolidation-receipts.ts +79 -0
- package/src/agent/memory-prompt.ts +3 -1
- package/src/agent/operator-gateway-call.ts +134 -0
- package/src/agent/principal-attribution.ts +97 -0
- package/src/agent/prompt-context-receipts.ts +5 -1
- package/src/agent/unified-inbox.ts +17 -1
- package/src/cli/bundle-command.ts +2 -1
- package/src/cli/channel-profiles-command.ts +168 -0
- package/src/cli/ci-command.ts +214 -0
- package/src/cli/completion.ts +5 -0
- package/src/cli/connected-host-metrics.ts +165 -0
- package/src/cli/entrypoint.ts +25 -1
- package/src/cli/fleet-command.ts +178 -0
- package/src/cli/help.ts +115 -0
- package/src/cli/import-command.ts +208 -0
- package/src/cli/index.ts +1 -0
- package/src/cli/management-commands.ts +9 -8
- package/src/cli/management.ts +42 -0
- package/src/cli/memory-command.ts +4 -3
- package/src/cli/openclaw-import.ts +382 -0
- package/src/cli/operator-command-args.ts +88 -0
- package/src/cli/parser.ts +12 -0
- package/src/cli/personas-command.ts +3 -2
- package/src/cli/principals-command.ts +230 -0
- package/src/cli/profiles-command.ts +2 -1
- package/src/cli/relay-command.ts +100 -0
- package/src/cli/routines-command.ts +4 -3
- package/src/cli/skill-bundle-command.ts +3 -2
- package/src/cli/skills-command.ts +3 -2
- package/src/cli/status.ts +114 -2
- package/src/cli/temporal-label.ts +89 -0
- package/src/cli/types.ts +7 -0
- package/src/cli/workspaces-command.ts +135 -0
- package/src/config/agent-settings-policy.ts +8 -0
- package/src/config/checkpoint-settings.ts +113 -0
- package/src/config/workspace-registration.ts +299 -0
- package/src/core/rewind-turn-anchors.ts +82 -0
- package/src/input/agent-workspace-categories.ts +1 -0
- package/src/input/agent-workspace-channel-triage.ts +27 -8
- package/src/input/agent-workspace-local-library-snapshot.ts +5 -1
- package/src/input/agent-workspace-onboarding-categories.ts +17 -1
- package/src/input/agent-workspace-snapshot.ts +25 -3
- package/src/input/agent-workspace-types.ts +5 -5
- package/src/input/commands/connected-host-admin-runtime.ts +75 -0
- package/src/input/commands.ts +2 -0
- package/src/input/settings-modal-types.ts +16 -5
- package/src/main.ts +17 -12
- package/src/permissions/approval-posture.ts +40 -5
- package/src/permissions/prompt.ts +35 -1
- package/src/renderer/settings-modal-helpers.ts +11 -0
- package/src/renderer/settings-modal.ts +21 -0
- package/src/renderer/terminal-escapes.ts +65 -12
- package/src/runtime/agent-runtime-events.ts +102 -3
- package/src/runtime/bootstrap-core.ts +111 -10
- package/src/runtime/bootstrap-external-services.ts +156 -0
- package/src/runtime/bootstrap.ts +73 -69
- package/src/runtime/context-accounting-source.ts +114 -0
- package/src/runtime/conversation-rewind-port.ts +133 -0
- package/src/runtime/index.ts +8 -28
- package/src/runtime/memory-consolidation-scheduler.ts +67 -0
- package/src/runtime/memory-consolidation-wiring.ts +56 -0
- package/src/runtime/memory-usage-wiring.ts +75 -0
- package/src/runtime/services.ts +257 -6
- package/src/runtime/tool-permission-safety.ts +18 -1
- package/src/shell/blocking-input.ts +38 -8
- package/src/shell/startup-wiring.ts +26 -1
- package/src/tools/agent-context-policy.ts +1 -1
- package/src/tools/agent-harness-cli-command-policy.ts +29 -3
- package/src/tools/agent-harness-learning-auto-promote.ts +7 -3
- package/src/tools/agent-harness-memory-posture.ts +57 -2
- package/src/tools/agent-harness-metadata.ts +12 -0
- package/src/tools/agent-harness-mode-catalog.ts +1 -1
- package/src/tools/agent-harness-personal-ops-lanes.ts +8 -6
- package/src/tools/agent-harness-prompt-context.ts +3 -1
- package/src/tools/agent-harness-tool.ts +3 -2
- package/src/tools/agent-policy-explanation.ts +40 -0
- package/src/tools/tool-definition-compaction.ts +2 -0
- package/src/version.ts +1 -1
|
@@ -173,9 +173,13 @@ function tryConsolidateNonMemoryCandidate(
|
|
|
173
173
|
// ---------------------------------------------------------------------------
|
|
174
174
|
|
|
175
175
|
/**
|
|
176
|
-
* Run the
|
|
177
|
-
*
|
|
178
|
-
*
|
|
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
|
|
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: '
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
507
|
-
policy: '
|
|
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.
|
|
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;
|