@pellux/goodvibes-agent 1.1.7 → 1.2.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/CHANGELOG.md +170 -0
- package/README.md +46 -30
- package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
- package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
- package/dist/package/main.js +132577 -91483
- package/docs/README.md +14 -7
- package/docs/channels-remote-and-api.md +8 -5
- package/docs/connected-host.md +14 -12
- package/docs/getting-started.md +56 -30
- package/docs/knowledge-artifacts-and-multimodal.md +7 -5
- package/docs/project-planning.md +2 -2
- package/docs/providers-and-routing.md +11 -3
- package/docs/tools-and-commands.md +114 -45
- package/docs/voice-and-live-tts.md +3 -1
- package/package.json +3 -2
- package/release/release-notes.md +130 -5
- package/release/release-readiness.json +120 -90
- package/src/agent/assistant-cockpit.ts +247 -0
- package/src/agent/autonomy-schedule-format.ts +96 -0
- package/src/agent/autonomy-schedule.ts +514 -0
- package/src/agent/channel-delivery-receipts.ts +292 -0
- package/src/agent/competitive-feature-inventory.ts +296 -0
- package/src/agent/document-registry-types.ts +106 -0
- package/src/agent/document-registry.ts +734 -0
- package/src/agent/harness-control.ts +2 -2
- package/src/agent/memory-prompt.ts +2 -2
- package/src/agent/operator-actions.ts +50 -6
- package/src/agent/persona-registry.ts +8 -0
- package/src/agent/project-context-files.ts +273 -0
- package/src/agent/prompt-context-receipts.ts +502 -0
- package/src/agent/reminder-schedule-format.ts +16 -2
- package/src/agent/research-run-registry.ts +582 -0
- package/src/agent/research-source-registry.ts +441 -0
- package/src/agent/routine-registry.ts +19 -3
- package/src/agent/routine-schedule-format.ts +27 -2
- package/src/agent/runtime-profile-starters.ts +7 -0
- package/src/agent/runtime-profile.ts +106 -4
- package/src/agent/schedule-edit-format.ts +129 -0
- package/src/agent/schedule-edit.ts +496 -0
- package/src/agent/schedule-next-routes.ts +42 -0
- package/src/agent/setup-wizard-checkpoint.ts +140 -0
- package/src/agent/setup-wizard.ts +447 -0
- package/src/agent/skill-registry-types.ts +102 -0
- package/src/agent/skill-registry.ts +81 -107
- package/src/agent/vibe-confirmation-routes.ts +62 -0
- package/src/agent/vibe-file.ts +285 -0
- package/src/cli/agent-knowledge-command.ts +45 -2
- package/src/cli/help.ts +3 -0
- package/src/cli/profiles-command.ts +25 -11
- package/src/config/agent-settings-policy.ts +1 -18
- package/src/input/agent-workspace-activation.ts +53 -0
- package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
- package/src/input/agent-workspace-artifact-metadata.ts +17 -0
- package/src/input/agent-workspace-basic-command-editors.ts +5 -1
- package/src/input/agent-workspace-categories.ts +153 -155
- package/src/input/agent-workspace-channel-triage.ts +481 -0
- package/src/input/agent-workspace-channels.ts +263 -0
- package/src/input/agent-workspace-command-editor.ts +152 -0
- package/src/input/agent-workspace-context-snapshot.ts +349 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
- package/src/input/agent-workspace-document-editor.ts +502 -0
- package/src/input/agent-workspace-document-ops-editor.ts +523 -0
- package/src/input/agent-workspace-host-category.ts +1 -1
- package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
- package/src/input/agent-workspace-model-compare-editor.ts +376 -0
- package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
- package/src/input/agent-workspace-model-compare-types.ts +82 -0
- package/src/input/agent-workspace-model-compare-utils.ts +35 -0
- package/src/input/agent-workspace-onboarding-categories.ts +141 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
- package/src/input/agent-workspace-operations-command-editors.ts +22 -0
- package/src/input/agent-workspace-research-report-editor.ts +212 -0
- package/src/input/agent-workspace-research-run-editor.ts +144 -0
- package/src/input/agent-workspace-research-source-editor.ts +167 -0
- package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
- package/src/input/agent-workspace-review-packet-utils.ts +265 -0
- package/src/input/agent-workspace-settings.ts +262 -30
- package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
- package/src/input/agent-workspace-setup-snapshot.ts +198 -0
- package/src/input/agent-workspace-setup.ts +34 -1
- package/src/input/agent-workspace-snapshot.ts +162 -147
- package/src/input/agent-workspace-types.ts +287 -2
- package/src/input/agent-workspace.ts +18 -0
- package/src/input/command-registry.ts +9 -2
- package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
- package/src/input/commands/channels-runtime.ts +102 -114
- package/src/input/commands/delegation-runtime.ts +87 -24
- package/src/input/commands/knowledge-browser-flags.ts +12 -0
- package/src/input/commands/knowledge.ts +28 -14
- package/src/input/commands/operator-actions-runtime.ts +6 -3
- package/src/input/commands/schedule-runtime.ts +71 -14
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/shell-core.ts +2 -0
- package/src/input/commands/vibe-runtime.ts +140 -0
- package/src/input/commands.ts +2 -0
- package/src/input/connected-host-routes.ts +123 -0
- package/src/input/settings-modal-types.ts +14 -0
- package/src/main.ts +15 -15
- package/src/panels/qr-panel.ts +2 -2
- package/src/renderer/agent-workspace-context-lines.ts +686 -0
- package/src/renderer/agent-workspace.ts +30 -419
- package/src/renderer/settings-modal-helpers.ts +12 -0
- package/src/renderer/settings-modal.ts +12 -0
- package/src/runtime/bootstrap-command-context.ts +11 -1
- package/src/runtime/bootstrap-command-parts.ts +14 -3
- package/src/runtime/bootstrap-core.ts +39 -1
- package/src/runtime/bootstrap-shell.ts +6 -0
- package/src/runtime/bootstrap.ts +113 -30
- package/src/runtime/connected-host-auth.ts +3 -2
- package/src/runtime/execution-ledger.ts +231 -0
- package/src/runtime/services.ts +88 -10
- package/src/runtime/tool-permission-safety.ts +199 -5
- package/src/shell/session-continuity-hints.ts +39 -0
- package/src/tools/agent-artifacts-tool.ts +606 -0
- package/src/tools/agent-audit-tool.ts +155 -0
- package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
- package/src/tools/agent-autonomy-tool.ts +140 -0
- package/src/tools/agent-channel-send-tool.ts +24 -2
- package/src/tools/agent-channels-tool.ts +140 -0
- package/src/tools/agent-computer-tool.ts +168 -0
- package/src/tools/agent-context-policy.ts +137 -7
- package/src/tools/agent-context-tool.ts +143 -0
- package/src/tools/agent-delegation-tool.ts +128 -0
- package/src/tools/agent-device-tool.ts +240 -0
- package/src/tools/agent-documents-tool.ts +684 -0
- package/src/tools/agent-execution-tool.ts +230 -0
- package/src/tools/agent-harness-agent-orchestration.ts +703 -0
- package/src/tools/agent-harness-autonomy-intake.ts +785 -0
- package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
- package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
- package/src/tools/agent-harness-autonomy-queue.ts +560 -0
- package/src/tools/agent-harness-background-processes-types.ts +35 -0
- package/src/tools/agent-harness-background-processes.ts +794 -0
- package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
- package/src/tools/agent-harness-browser-control.ts +338 -0
- package/src/tools/agent-harness-channel-metadata.ts +168 -10
- package/src/tools/agent-harness-cli-command-policy.ts +110 -0
- package/src/tools/agent-harness-command-catalog.ts +4 -2
- package/src/tools/agent-harness-command-runner.ts +42 -0
- package/src/tools/agent-harness-connected-host-status.ts +7 -4
- package/src/tools/agent-harness-delegation-posture.ts +234 -19
- package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
- package/src/tools/agent-harness-document-ops-types.ts +72 -0
- package/src/tools/agent-harness-document-ops.ts +671 -0
- package/src/tools/agent-harness-execution-history.ts +489 -0
- package/src/tools/agent-harness-execution-posture.ts +382 -0
- package/src/tools/agent-harness-file-recovery.ts +135 -0
- package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
- package/src/tools/agent-harness-learning-curator-common.ts +102 -0
- package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
- package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
- package/src/tools/agent-harness-learning-curator-types.ts +151 -0
- package/src/tools/agent-harness-learning-curator.ts +417 -0
- package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
- package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
- package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
- package/src/tools/agent-harness-media-posture.ts +208 -2
- package/src/tools/agent-harness-memory-posture.ts +556 -0
- package/src/tools/agent-harness-metadata.ts +100 -168
- package/src/tools/agent-harness-mode-catalog.ts +84 -33
- package/src/tools/agent-harness-model-catalog.ts +162 -0
- package/src/tools/agent-harness-model-provider-health.ts +186 -0
- package/src/tools/agent-harness-model-readiness.ts +406 -0
- package/src/tools/agent-harness-model-routing-types.ts +266 -0
- package/src/tools/agent-harness-model-routing-utils.ts +30 -0
- package/src/tools/agent-harness-model-routing.ts +137 -190
- package/src/tools/agent-harness-operator-methods.ts +115 -133
- package/src/tools/agent-harness-pairing-posture.ts +431 -18
- package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
- package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
- package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
- package/src/tools/agent-harness-personal-ops-records.ts +732 -0
- package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
- package/src/tools/agent-harness-personal-ops-types.ts +222 -0
- package/src/tools/agent-harness-personal-ops.ts +606 -0
- package/src/tools/agent-harness-project-context.ts +144 -0
- package/src/tools/agent-harness-prompt-context.ts +589 -0
- package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
- package/src/tools/agent-harness-release-evidence.ts +9 -7
- package/src/tools/agent-harness-release-readiness.ts +9 -7
- package/src/tools/agent-harness-research-briefing.ts +427 -0
- package/src/tools/agent-harness-research-queue.ts +250 -0
- package/src/tools/agent-harness-research-runs.ts +295 -0
- package/src/tools/agent-harness-research-workflow.ts +322 -0
- package/src/tools/agent-harness-security-posture.ts +2 -2
- package/src/tools/agent-harness-service-posture.ts +9 -9
- package/src/tools/agent-harness-session-metadata.ts +3 -3
- package/src/tools/agent-harness-setup-connected-host.ts +501 -0
- package/src/tools/agent-harness-setup-describe.ts +557 -0
- package/src/tools/agent-harness-setup-handoffs.ts +502 -0
- package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
- package/src/tools/agent-harness-setup-plan.ts +253 -0
- package/src/tools/agent-harness-setup-posture-types.ts +218 -0
- package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
- package/src/tools/agent-harness-setup-posture.ts +449 -221
- package/src/tools/agent-harness-setup-smoke.ts +508 -0
- package/src/tools/agent-harness-sudo-posture.ts +114 -0
- package/src/tools/agent-harness-tool-schema.ts +120 -7
- package/src/tools/agent-harness-tool-types.ts +78 -0
- package/src/tools/agent-harness-tool-utils.ts +43 -0
- package/src/tools/agent-harness-tool.ts +311 -370
- package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
- package/src/tools/agent-harness-ui-surface-types.ts +46 -0
- package/src/tools/agent-harness-vibe-health.ts +105 -0
- package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
- package/src/tools/agent-harness-workspace-actions.ts +114 -8
- package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
- package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
- package/src/tools/agent-host-tool.ts +159 -0
- package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
- package/src/tools/agent-learning-consolidation-core.ts +327 -0
- package/src/tools/agent-learning-consolidation-tool.ts +758 -0
- package/src/tools/agent-memory-tool.ts +214 -0
- package/src/tools/agent-model-compare-export.ts +315 -0
- package/src/tools/agent-model-compare-handoff.ts +592 -0
- package/src/tools/agent-model-compare-judgment.ts +633 -0
- package/src/tools/agent-model-compare-run.ts +722 -0
- package/src/tools/agent-model-compare-tool.ts +698 -0
- package/src/tools/agent-model-compare-types.ts +191 -0
- package/src/tools/agent-model-compare-utils.ts +93 -0
- package/src/tools/agent-models-tool.ts +208 -0
- package/src/tools/agent-operator-action-tool.ts +1 -1
- package/src/tools/agent-operator-method-tool.ts +643 -0
- package/src/tools/agent-personal-ops-tool.ts +197 -0
- package/src/tools/agent-policy-explanation.ts +415 -0
- package/src/tools/agent-research-report-tool.ts +608 -0
- package/src/tools/agent-research-runs-tool.ts +434 -0
- package/src/tools/agent-research-sources-tool.ts +443 -0
- package/src/tools/agent-research-tool.ts +687 -0
- package/src/tools/agent-review-packet-presets-core.ts +757 -0
- package/src/tools/agent-review-packet-presets-tool.ts +466 -0
- package/src/tools/agent-review-packet-share-tool.ts +305 -0
- package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
- package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
- package/src/tools/agent-route-planner-candidates-work.ts +251 -0
- package/src/tools/agent-route-planner-helpers.ts +667 -0
- package/src/tools/agent-route-planner.ts +185 -0
- package/src/tools/agent-route-tool.ts +105 -0
- package/src/tools/agent-schedule-edit-tool.ts +210 -0
- package/src/tools/agent-schedule-tool.ts +282 -0
- package/src/tools/agent-security-tool.ts +145 -0
- package/src/tools/agent-sessions-tool.ts +122 -0
- package/src/tools/agent-settings-import-tool.ts +104 -0
- package/src/tools/agent-settings-tool.ts +176 -0
- package/src/tools/agent-setup-tool.ts +226 -0
- package/src/tools/agent-support-tool.ts +122 -0
- package/src/tools/agent-terminal-process-tools.ts +167 -0
- package/src/tools/agent-tool-policy-guard-types.ts +77 -0
- package/src/tools/agent-tool-policy-guard.ts +106 -85
- package/src/tools/agent-vibe-tool.ts +297 -0
- package/src/tools/agent-work-plan-tool.ts +265 -6
- package/src/tools/agent-workspace-tool.ts +305 -0
- package/src/tools/artifact-archive.ts +169 -0
- package/src/tools/tool-definition-compaction.ts +36 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,667 @@
|
|
|
1
|
+
import { previewHarnessText } from './agent-harness-text.ts';
|
|
2
|
+
export function hasAny(lower: string, tokens: readonly string[]): boolean {
|
|
3
|
+
return tokens.some((token) => lower.includes(token));
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export function hasAll(lower: string, tokens: readonly string[]): boolean {
|
|
7
|
+
return tokens.every((token) => lower.includes(token));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function quote(value: string, limit = 96): string {
|
|
11
|
+
return JSON.stringify(previewHarnessText(value, limit));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const MODE_SEARCH_STOPWORDS = new Set(['a', 'an', 'and', 'for', 'from', 'in', 'my', 'of', 'on', 'or', 'please', 'the', 'this', 'to', 'with']);
|
|
15
|
+
|
|
16
|
+
export function simplifiedModeQuery(input: string): string {
|
|
17
|
+
return input
|
|
18
|
+
.toLowerCase()
|
|
19
|
+
.split(/[^a-z0-9_.-]+/)
|
|
20
|
+
.filter((token) => token.length > 0 && !MODE_SEARCH_STOPWORDS.has(token))
|
|
21
|
+
.map((token) => (token.endsWith('s') && token.length > 4 ? token.slice(0, -1) : token))
|
|
22
|
+
.join(' ');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function scheduleLike(lower: string): boolean {
|
|
26
|
+
return hasAny(lower, [
|
|
27
|
+
'schedule',
|
|
28
|
+
'scheduled',
|
|
29
|
+
'recurring',
|
|
30
|
+
'repeat',
|
|
31
|
+
'remind',
|
|
32
|
+
'reminder',
|
|
33
|
+
'cron',
|
|
34
|
+
'every ',
|
|
35
|
+
'daily',
|
|
36
|
+
'weekly',
|
|
37
|
+
'monthly',
|
|
38
|
+
'tomorrow',
|
|
39
|
+
'next week',
|
|
40
|
+
'follow up',
|
|
41
|
+
'follow-up',
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function autonomousLike(lower: string): boolean {
|
|
46
|
+
return scheduleLike(lower) || hasAny(lower, [
|
|
47
|
+
'autonomous',
|
|
48
|
+
'ongoing',
|
|
49
|
+
'long-running',
|
|
50
|
+
'background',
|
|
51
|
+
'monitor',
|
|
52
|
+
'watcher',
|
|
53
|
+
'webhook',
|
|
54
|
+
'trigger',
|
|
55
|
+
'when a ',
|
|
56
|
+
'when an ',
|
|
57
|
+
'wake up',
|
|
58
|
+
'wake-up',
|
|
59
|
+
]);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function directScheduleLike(lower: string): boolean {
|
|
63
|
+
if (hasAny(lower, ['remind me', 'reminder', 'create reminder', 'schedule reminder'])) return true;
|
|
64
|
+
if (hasAny(lower, ['schedule ', 'scheduled task', 'scheduled work', 'cron'])) return true;
|
|
65
|
+
return hasAny(lower, ['pause schedule', 'resume schedule', 'run schedule', 'edit schedule', 'delete schedule', 'cancel schedule', 'enable schedule', 'disable schedule']);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function hostDiagnosticsLike(lower: string): boolean {
|
|
69
|
+
if (hasAny(lower, ['daemon health', 'daemon status', 'daemon doctor', 'host health', 'host status', 'host doctor', 'service health', 'service status', 'health check'])) return true;
|
|
70
|
+
const runtimeTarget = hasAny(lower, ['daemon', 'host', 'connected host', 'service', 'control plane', 'operator api', 'goodvibes runtime']);
|
|
71
|
+
const diagnosticIntent = hasAny(lower, ['health', 'status', 'doctor', 'diagnose', 'diagnostic', 'readiness', 'compat', 'compatibility']);
|
|
72
|
+
return runtimeTarget && diagnosticIntent;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function mediaGenerationLike(lower: string): boolean {
|
|
76
|
+
const generationIntent = hasAny(lower, ['generate', 'create', 'make', 'render', 'draw', 'produce']);
|
|
77
|
+
if (!generationIntent) return false;
|
|
78
|
+
return hasAny(lower, ['image', 'video', 'media', 'picture', 'thumbnail', 'logo', 'illustration', 'graphic', 'artwork']);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function browserControlLike(lower: string): boolean {
|
|
82
|
+
return hasAny(lower, [
|
|
83
|
+
'browser control',
|
|
84
|
+
'desktop control',
|
|
85
|
+
'computer use',
|
|
86
|
+
'take screenshot',
|
|
87
|
+
'take a screenshot',
|
|
88
|
+
'screenshot',
|
|
89
|
+
'screen recording',
|
|
90
|
+
'record screen',
|
|
91
|
+
'record the screen',
|
|
92
|
+
'observe screen',
|
|
93
|
+
'observe the screen',
|
|
94
|
+
'capture screen',
|
|
95
|
+
'capture the screen',
|
|
96
|
+
'use the browser',
|
|
97
|
+
'use browser',
|
|
98
|
+
'navigate browser',
|
|
99
|
+
'click in browser',
|
|
100
|
+
'click the page',
|
|
101
|
+
'fill form',
|
|
102
|
+
'fill out form',
|
|
103
|
+
'logged-in page',
|
|
104
|
+
'logged in page',
|
|
105
|
+
'move mouse',
|
|
106
|
+
'type into',
|
|
107
|
+
'control desktop',
|
|
108
|
+
'control the desktop',
|
|
109
|
+
]);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export const EXTERNAL_MEMORY_PROVIDER_IDS = [
|
|
113
|
+
'honcho',
|
|
114
|
+
'openviking',
|
|
115
|
+
'mem0',
|
|
116
|
+
'hindsight',
|
|
117
|
+
'holographic',
|
|
118
|
+
'retaindb',
|
|
119
|
+
'byterover',
|
|
120
|
+
'supermemory',
|
|
121
|
+
] as const;
|
|
122
|
+
|
|
123
|
+
export function externalMemoryProviderId(lower: string): string | null {
|
|
124
|
+
return EXTERNAL_MEMORY_PROVIDER_IDS.find((provider) => lower.includes(provider)) ?? null;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export function externalMemoryProviderLike(lower: string): boolean {
|
|
128
|
+
if (externalMemoryProviderId(lower)) return true;
|
|
129
|
+
return hasAny(lower, [
|
|
130
|
+
'external memory',
|
|
131
|
+
'memory provider',
|
|
132
|
+
'memory backend',
|
|
133
|
+
'cross-session memory',
|
|
134
|
+
'memory sync',
|
|
135
|
+
'memory import',
|
|
136
|
+
'memory export',
|
|
137
|
+
]);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export function processLifecycleLike(lower: string): boolean {
|
|
141
|
+
if (lower.includes('background') && hasAny(lower, [
|
|
142
|
+
'build',
|
|
143
|
+
'bun ',
|
|
144
|
+
'command',
|
|
145
|
+
'dev server',
|
|
146
|
+
'execute',
|
|
147
|
+
'launch',
|
|
148
|
+
'npm ',
|
|
149
|
+
'pnpm ',
|
|
150
|
+
'process',
|
|
151
|
+
'pytest',
|
|
152
|
+
'server',
|
|
153
|
+
'start ',
|
|
154
|
+
'terminal',
|
|
155
|
+
'test',
|
|
156
|
+
'yarn ',
|
|
157
|
+
])) return true;
|
|
158
|
+
return hasAny(lower, [
|
|
159
|
+
'background process',
|
|
160
|
+
'background command',
|
|
161
|
+
'background:true',
|
|
162
|
+
'run in background',
|
|
163
|
+
'run it in the background',
|
|
164
|
+
'start in background',
|
|
165
|
+
'terminal background',
|
|
166
|
+
'terminal command',
|
|
167
|
+
'process action',
|
|
168
|
+
'process list',
|
|
169
|
+
'process poll',
|
|
170
|
+
'process log',
|
|
171
|
+
'process wait',
|
|
172
|
+
'process kill',
|
|
173
|
+
'process write',
|
|
174
|
+
'poll process',
|
|
175
|
+
'log process',
|
|
176
|
+
'wait process',
|
|
177
|
+
'kill process',
|
|
178
|
+
'stop process',
|
|
179
|
+
'stdin',
|
|
180
|
+
'pty',
|
|
181
|
+
]);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function interactiveProcessCapabilityLike(lower: string): boolean {
|
|
185
|
+
if (hasAny(lower, [
|
|
186
|
+
'pty',
|
|
187
|
+
'interactive cli',
|
|
188
|
+
'interactive command',
|
|
189
|
+
'interactive shell',
|
|
190
|
+
'interactive terminal',
|
|
191
|
+
'terminal input',
|
|
192
|
+
'process input',
|
|
193
|
+
'process write',
|
|
194
|
+
'stdin',
|
|
195
|
+
'send input',
|
|
196
|
+
'write to process',
|
|
197
|
+
'password prompt',
|
|
198
|
+
'sudo',
|
|
199
|
+
'sudo_password',
|
|
200
|
+
'privilege escalation',
|
|
201
|
+
'claude code',
|
|
202
|
+
'codex cli',
|
|
203
|
+
])) return true;
|
|
204
|
+
return hasAll(lower, ['terminal', 'input']);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export function fileRecoveryLike(lower: string): boolean {
|
|
208
|
+
const recoveryWord = hasAny(lower, ['undo', 'redo', 'recover', 'recovery', 'restore', 'revert', 'roll back', 'rollback']);
|
|
209
|
+
if (!recoveryWord) return false;
|
|
210
|
+
return hasAny(lower, ['file', 'edit', 'write', 'patch', 'diff', 'change', 'snapshot', 'workspace']);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function researchRunnerLike(lower: string): boolean {
|
|
214
|
+
if (hasAny(lower, [
|
|
215
|
+
'browser-backed research',
|
|
216
|
+
'browser backed research',
|
|
217
|
+
'browser-backed runner',
|
|
218
|
+
'browser backed runner',
|
|
219
|
+
'browser research runner',
|
|
220
|
+
'research runner',
|
|
221
|
+
'deep research runner',
|
|
222
|
+
'live research runner',
|
|
223
|
+
])) return true;
|
|
224
|
+
return lower.includes('runner readiness') && hasAny(lower, ['research', 'browser']);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export function visualResearchReportLike(lower: string): boolean {
|
|
228
|
+
return hasAny(lower, [
|
|
229
|
+
'visual report',
|
|
230
|
+
'visual-report',
|
|
231
|
+
'visual research report',
|
|
232
|
+
'research report packet',
|
|
233
|
+
'visual report packet',
|
|
234
|
+
'report packet',
|
|
235
|
+
'browser report rendering',
|
|
236
|
+
'browser/pwa report',
|
|
237
|
+
'render visual report',
|
|
238
|
+
'render the visual report',
|
|
239
|
+
'render research report',
|
|
240
|
+
]);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export function voiceWorkflowLike(lower: string): boolean {
|
|
244
|
+
return hasAny(lower, [
|
|
245
|
+
'voice workflow',
|
|
246
|
+
'voice memo',
|
|
247
|
+
'voice transcription',
|
|
248
|
+
'transcribe voice',
|
|
249
|
+
'transcribe audio',
|
|
250
|
+
'push-to-talk',
|
|
251
|
+
'push to talk',
|
|
252
|
+
'wake word',
|
|
253
|
+
'wake-word',
|
|
254
|
+
'spoken response',
|
|
255
|
+
'spoken responses',
|
|
256
|
+
'talk to the assistant',
|
|
257
|
+
'talk to agent',
|
|
258
|
+
]);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function ttsProviderLike(lower: string): boolean {
|
|
262
|
+
return hasAny(lower, [
|
|
263
|
+
'tts provider',
|
|
264
|
+
'tts voice',
|
|
265
|
+
'tts picker',
|
|
266
|
+
'text to speech',
|
|
267
|
+
'text-to-speech',
|
|
268
|
+
'speech synthesis',
|
|
269
|
+
'spoken provider',
|
|
270
|
+
'voice provider',
|
|
271
|
+
]);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function browserCockpitLike(lower: string): boolean {
|
|
275
|
+
return hasAny(lower, [
|
|
276
|
+
'browser cockpit',
|
|
277
|
+
'connected browser',
|
|
278
|
+
'browser dashboard',
|
|
279
|
+
'web dashboard',
|
|
280
|
+
'pwa',
|
|
281
|
+
'open browser dashboard',
|
|
282
|
+
'open browser cockpit',
|
|
283
|
+
'mobile pwa',
|
|
284
|
+
]);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export type PersonalOpsLaneId = 'inbox' | 'calendar' | 'notes' | 'tasks' | 'reminders' | 'routines' | 'delivery';
|
|
288
|
+
|
|
289
|
+
export function personalOpsLike(lower: string): boolean {
|
|
290
|
+
return hasAny(lower, [
|
|
291
|
+
'personal ops',
|
|
292
|
+
'daily brief',
|
|
293
|
+
'daily briefing',
|
|
294
|
+
'morning brief',
|
|
295
|
+
'morning briefing',
|
|
296
|
+
'inbox',
|
|
297
|
+
'email',
|
|
298
|
+
'gmail',
|
|
299
|
+
'imap',
|
|
300
|
+
'smtp',
|
|
301
|
+
'calendar',
|
|
302
|
+
'caldav',
|
|
303
|
+
'agenda',
|
|
304
|
+
'rsvp',
|
|
305
|
+
'draft reply',
|
|
306
|
+
'reply to',
|
|
307
|
+
'tasks',
|
|
308
|
+
'todo',
|
|
309
|
+
'to-do',
|
|
310
|
+
'note',
|
|
311
|
+
'routine',
|
|
312
|
+
'review queue',
|
|
313
|
+
'saved review',
|
|
314
|
+
]);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export function personalOpsLaneFromText(lower: string): PersonalOpsLaneId | null {
|
|
318
|
+
if (hasAny(lower, ['inbox', 'email', 'mail', 'gmail', 'imap', 'smtp', 'message', 'thread', 'draft reply', 'reply to'])) return 'inbox';
|
|
319
|
+
if (hasAny(lower, ['calendar', 'caldav', 'agenda', 'meeting', 'event', 'availability', 'freebusy', 'free busy', 'rsvp'])) return 'calendar';
|
|
320
|
+
if (hasAny(lower, ['note', 'scratchpad', 'jot down'])) return 'notes';
|
|
321
|
+
if (hasAny(lower, ['task', 'tasks', 'todo', 'to-do', 'work item', 'work plan'])) return 'tasks';
|
|
322
|
+
if (hasAny(lower, ['reminder', 'reminders', 'follow up', 'follow-up', 'ping me'])) return 'reminders';
|
|
323
|
+
if (hasAny(lower, ['routine', 'checklist', 'repeatable'])) return 'routines';
|
|
324
|
+
if (hasAny(lower, ['delivery', 'deliver', 'send summary', 'send briefing'])) return 'delivery';
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export function personalOpsBriefingLike(lower: string): boolean {
|
|
329
|
+
if (hasAny(lower, ['daily brief', 'daily briefing', 'morning brief', 'morning briefing', 'brief me', 'brief my', 'briefing'])) return true;
|
|
330
|
+
return hasAny(lower, ['what is on my calendar', "what's on my calendar", 'today agenda', "today's agenda", 'agenda today']);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export function personalOpsQueueLike(lower: string): boolean {
|
|
334
|
+
return hasAny(lower, [
|
|
335
|
+
'review queue',
|
|
336
|
+
'saved review',
|
|
337
|
+
'saved inbox',
|
|
338
|
+
'saved calendar',
|
|
339
|
+
'saved thread',
|
|
340
|
+
'saved event',
|
|
341
|
+
'queued inbox',
|
|
342
|
+
'queued calendar',
|
|
343
|
+
]);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
export function personalOpsConnectorSetupLike(lower: string): boolean {
|
|
347
|
+
const connector = hasAny(lower, ['gmail', 'imap', 'smtp', 'email connector', 'mail connector', 'calendar connector', 'caldav', 'mcp connector']);
|
|
348
|
+
const setup = hasAny(lower, ['set up', 'setup', 'connect', 'configure', 'enable', 'repair', 'provider']);
|
|
349
|
+
return connector && setup;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export function personalOpsFreshReadLike(lower: string): boolean {
|
|
353
|
+
return hasAny(lower, [
|
|
354
|
+
'read live',
|
|
355
|
+
'refresh',
|
|
356
|
+
'fresh read',
|
|
357
|
+
'fetch',
|
|
358
|
+
'sync',
|
|
359
|
+
'pull latest',
|
|
360
|
+
'latest email',
|
|
361
|
+
'new email',
|
|
362
|
+
'unread',
|
|
363
|
+
'upcoming event',
|
|
364
|
+
'upcoming meeting',
|
|
365
|
+
'calendar today',
|
|
366
|
+
'today calendar',
|
|
367
|
+
]);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export function personalOpsMutationLike(lower: string): boolean {
|
|
371
|
+
return hasAny(lower, ['send', 'reply', 'archive', 'label', 'edit', 'rsvp', 'delete', 'move', 'create event', 'reschedule']);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export function externalChannelLike(lower: string): boolean {
|
|
375
|
+
return hasAny(lower, ['slack', 'discord', 'telegram', 'whatsapp', 'signal', 'matrix', 'teams', 'ntfy', 'webhook', 'notification', 'notify', 'send message', 'channel', 'delivery receipt']);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export function channelTargetFromText(lower: string): string | null {
|
|
379
|
+
return ['slack', 'discord', 'telegram', 'whatsapp', 'signal', 'matrix', 'teams', 'ntfy', 'webhook'].find((target) => lower.includes(target)) ?? null;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export function channelSetupLike(lower: string): boolean {
|
|
383
|
+
return hasAny(lower, ['set up', 'setup', 'connect', 'configure', 'enable', 'repair']) && externalChannelLike(lower);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export function channelTriageLike(lower: string): boolean {
|
|
387
|
+
return hasAny(lower, ['triage', 'blocker', 'blockers', 'retry', 'retries', 'failed', 'failure', 'error', 'pending message', 'pending delivery', 'doctor']) && externalChannelLike(lower);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
export function channelDeliveriesLike(lower: string): boolean {
|
|
391
|
+
return hasAny(lower, ['delivery receipt', 'delivery receipts', 'delivery history', 'send history', 'sent messages', 'send outcomes', 'recent deliveries']);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
export function channelSendLike(lower: string): boolean {
|
|
395
|
+
return hasAny(lower, ['send', 'notify', 'deliver', 'test send', 'test notification', 'ping']);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export const MODEL_PROVIDER_IDS = [
|
|
399
|
+
'openrouter',
|
|
400
|
+
'openai',
|
|
401
|
+
'anthropic',
|
|
402
|
+
'claude',
|
|
403
|
+
'ollama',
|
|
404
|
+
'llama.cpp',
|
|
405
|
+
'llamacpp',
|
|
406
|
+
'vllm',
|
|
407
|
+
'lm studio',
|
|
408
|
+
] as const;
|
|
409
|
+
|
|
410
|
+
export function modelProviderId(lower: string): string | null {
|
|
411
|
+
const provider = MODEL_PROVIDER_IDS.find((candidate) => lower.includes(candidate));
|
|
412
|
+
if (!provider) return null;
|
|
413
|
+
if (provider === 'llama.cpp' || provider === 'llamacpp') return 'llama.cpp';
|
|
414
|
+
if (provider === 'lm studio') return 'lm-studio';
|
|
415
|
+
return provider;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
export function localModelLike(lower: string): boolean {
|
|
419
|
+
return hasAny(lower, [
|
|
420
|
+
'local model',
|
|
421
|
+
'local server',
|
|
422
|
+
'local endpoint',
|
|
423
|
+
'local ai',
|
|
424
|
+
'ollama',
|
|
425
|
+
'llama.cpp',
|
|
426
|
+
'llamacpp',
|
|
427
|
+
'vllm',
|
|
428
|
+
'lm studio',
|
|
429
|
+
'cookbook',
|
|
430
|
+
'model recipe',
|
|
431
|
+
'hardware fit',
|
|
432
|
+
'serve model',
|
|
433
|
+
'download model',
|
|
434
|
+
]);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export function localModelSmokeLike(lower: string): boolean {
|
|
438
|
+
return hasAny(lower, [
|
|
439
|
+
'local model smoke',
|
|
440
|
+
'model smoke',
|
|
441
|
+
'check local model',
|
|
442
|
+
'check local servers',
|
|
443
|
+
'local server health',
|
|
444
|
+
'server health',
|
|
445
|
+
'model-list smoke',
|
|
446
|
+
'test ollama',
|
|
447
|
+
'smoke ollama',
|
|
448
|
+
]);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export function providerAccountLike(lower: string): boolean {
|
|
452
|
+
return hasAny(lower, [
|
|
453
|
+
'provider account',
|
|
454
|
+
'provider auth',
|
|
455
|
+
'subscription',
|
|
456
|
+
'api key',
|
|
457
|
+
'apikey',
|
|
458
|
+
'openrouter',
|
|
459
|
+
'openai',
|
|
460
|
+
'anthropic',
|
|
461
|
+
'claude',
|
|
462
|
+
'login',
|
|
463
|
+
'billing',
|
|
464
|
+
]);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
export function modelRouteReadinessLike(lower: string): boolean {
|
|
468
|
+
return hasAny(lower, [
|
|
469
|
+
'model route',
|
|
470
|
+
'route readiness',
|
|
471
|
+
'best model',
|
|
472
|
+
'choose model',
|
|
473
|
+
'pick model',
|
|
474
|
+
'compare route',
|
|
475
|
+
'context window',
|
|
476
|
+
'long context',
|
|
477
|
+
'tool support',
|
|
478
|
+
'vision model',
|
|
479
|
+
'latency',
|
|
480
|
+
'model cost',
|
|
481
|
+
'privacy',
|
|
482
|
+
]);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
export function securityPermissionLike(lower: string): boolean {
|
|
486
|
+
return hasAny(lower, [
|
|
487
|
+
'security',
|
|
488
|
+
'permission',
|
|
489
|
+
'permissions',
|
|
490
|
+
'policy',
|
|
491
|
+
'policies',
|
|
492
|
+
'approval',
|
|
493
|
+
'approvals',
|
|
494
|
+
'approve',
|
|
495
|
+
'approved',
|
|
496
|
+
'deny',
|
|
497
|
+
'denied',
|
|
498
|
+
'blocked',
|
|
499
|
+
'allowed',
|
|
500
|
+
'confirmation',
|
|
501
|
+
'requires confirmation',
|
|
502
|
+
'guardrail',
|
|
503
|
+
'safety',
|
|
504
|
+
'risky action',
|
|
505
|
+
'unsafe action',
|
|
506
|
+
]);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
export function securityStatusLike(lower: string): boolean {
|
|
510
|
+
if (hasAny(lower, [
|
|
511
|
+
'security status',
|
|
512
|
+
'security posture',
|
|
513
|
+
'permission status',
|
|
514
|
+
'permissions status',
|
|
515
|
+
'current permissions',
|
|
516
|
+
'active permissions',
|
|
517
|
+
'permission mode',
|
|
518
|
+
'approval mode',
|
|
519
|
+
'approval settings',
|
|
520
|
+
'tool permissions',
|
|
521
|
+
'security dashboard',
|
|
522
|
+
'safety status',
|
|
523
|
+
'current policy',
|
|
524
|
+
'policy status',
|
|
525
|
+
'policy settings',
|
|
526
|
+
])) return true;
|
|
527
|
+
return hasAny(lower, ['show', 'list', 'what are', 'what is', 'which']) && hasAny(lower, ['permissions', 'approvals', 'policy', 'allowed tools']);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
export function securityFindingLike(lower: string): boolean {
|
|
531
|
+
const finding = hasAny(lower, [
|
|
532
|
+
'finding',
|
|
533
|
+
'findings',
|
|
534
|
+
'incident',
|
|
535
|
+
'security issue',
|
|
536
|
+
'vulnerability',
|
|
537
|
+
'leaked secret',
|
|
538
|
+
'secret leak',
|
|
539
|
+
'exposed token',
|
|
540
|
+
'exposed secret',
|
|
541
|
+
'mcp trust',
|
|
542
|
+
'quarantine',
|
|
543
|
+
]);
|
|
544
|
+
if (!finding) return false;
|
|
545
|
+
return hasAny(lower, ['security', 'policy', 'permission', 'mcp', 'secret', 'token', 'incident', 'vulnerability', 'finding']);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
export function securityPolicyExplainLike(lower: string): boolean {
|
|
549
|
+
if (hasAny(lower, [
|
|
550
|
+
'why denied',
|
|
551
|
+
'why was denied',
|
|
552
|
+
'why blocked',
|
|
553
|
+
'why was blocked',
|
|
554
|
+
'why allowed',
|
|
555
|
+
'why did you block',
|
|
556
|
+
'why would',
|
|
557
|
+
'why does',
|
|
558
|
+
'explain policy',
|
|
559
|
+
'explain permission',
|
|
560
|
+
'explain approval',
|
|
561
|
+
'explain confirmation',
|
|
562
|
+
'need confirmation',
|
|
563
|
+
'needs confirmation',
|
|
564
|
+
'requires confirmation',
|
|
565
|
+
'would be blocked',
|
|
566
|
+
'will be blocked',
|
|
567
|
+
'risky action',
|
|
568
|
+
'unsafe action',
|
|
569
|
+
'can you run',
|
|
570
|
+
'can you use',
|
|
571
|
+
'am i allowed',
|
|
572
|
+
])) return true;
|
|
573
|
+
return hasAny(lower, ['blocked', 'denied', 'allowed', 'approval', 'confirmation']) && hasAny(lower, ['tool', 'action', 'route', 'command', 'call', 'execute', 'run', 'write', 'send', 'setting']);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
export function securityPolicyToolTarget(lower: string): string | null {
|
|
577
|
+
if (lower.includes('agent_harness')) return 'agent_harness';
|
|
578
|
+
if (lower.includes('settings action') || lower.includes('setting')) return 'settings';
|
|
579
|
+
if (lower.includes('terminal')) return 'terminal';
|
|
580
|
+
if (lower.includes('process')) return 'process';
|
|
581
|
+
if (lower.includes('exec')) return 'exec';
|
|
582
|
+
if (lower.includes('channel')) return 'channels';
|
|
583
|
+
if (lower.includes('schedule')) return 'schedule';
|
|
584
|
+
if (lower.includes('personal_ops') || lower.includes('personal ops')) return 'personal_ops';
|
|
585
|
+
if (lower.includes('model')) return 'models';
|
|
586
|
+
if (lower.includes('memory')) return 'memory';
|
|
587
|
+
if (lower.includes('computer') || lower.includes('browser') || lower.includes('screenshot')) return 'computer';
|
|
588
|
+
if (lower.includes('device') || lower.includes('voice') || lower.includes('tts')) return 'device';
|
|
589
|
+
if (lower.includes('workspace')) return 'workspace';
|
|
590
|
+
if (lower.includes('host') || lower.includes('daemon')) return 'host';
|
|
591
|
+
if (lower.includes('command')) return 'terminal';
|
|
592
|
+
return null;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
export function supportBundleLike(lower: string): boolean {
|
|
596
|
+
if (hasAny(lower, ['support bundle', 'support packet', 'diagnostic bundle', 'diagnostics bundle', 'forensic bundle', 'forensics bundle'])) return true;
|
|
597
|
+
return lower.includes('bundle') && hasAny(lower, ['support', 'diagnostic', 'diagnostics', 'forensic', 'forensics', 'auth', 'trust', 'subscription', 'security']);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export function supportBundleEffectLike(lower: string): boolean {
|
|
601
|
+
return hasAny(lower, ['export', 'import', 'create', 'generate', 'save', 'write', 'share', 'attach', 'send']);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
export function sessionWorkspaceLike(lower: string): boolean {
|
|
605
|
+
if (hasAny(lower, [
|
|
606
|
+
'saved session',
|
|
607
|
+
'saved sessions',
|
|
608
|
+
'session search',
|
|
609
|
+
'search sessions',
|
|
610
|
+
'session export',
|
|
611
|
+
'export session',
|
|
612
|
+
'session resume',
|
|
613
|
+
'resume session',
|
|
614
|
+
'session load',
|
|
615
|
+
'load session',
|
|
616
|
+
'session save',
|
|
617
|
+
'save session',
|
|
618
|
+
'session delete',
|
|
619
|
+
'delete session',
|
|
620
|
+
'session rename',
|
|
621
|
+
'rename session',
|
|
622
|
+
'session fork',
|
|
623
|
+
'fork session',
|
|
624
|
+
'session graph',
|
|
625
|
+
'session bookmark',
|
|
626
|
+
'bookmarked session',
|
|
627
|
+
'bookmarks',
|
|
628
|
+
'conversation restore',
|
|
629
|
+
'restore conversation',
|
|
630
|
+
'previous conversation',
|
|
631
|
+
'past conversation',
|
|
632
|
+
'transcript export',
|
|
633
|
+
'export transcript',
|
|
634
|
+
'return context',
|
|
635
|
+
'session continuity',
|
|
636
|
+
])) return true;
|
|
637
|
+
return lower.includes('session') && hasAny(lower, ['browse', 'find', 'search', 'show', 'inspect', 'resume', 'load', 'save', 'export', 'delete', 'rename', 'fork', 'bookmark']);
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
export function sessionMutationLike(lower: string): boolean {
|
|
641
|
+
if (hasAny(lower, ['resume', 'load', 'rename', 'fork', 'delete', 'remove', 'restore', 'export', 'unbookmark'])) return true;
|
|
642
|
+
return hasAny(lower, ['save session', 'session save', 'bookmark session', 'session bookmark']);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
export function releaseAuditLike(lower: string): boolean {
|
|
646
|
+
return hasAny(lower, [
|
|
647
|
+
'release evidence',
|
|
648
|
+
'release artifact',
|
|
649
|
+
'release artifacts',
|
|
650
|
+
'release readiness',
|
|
651
|
+
'release quality',
|
|
652
|
+
'readiness inventory',
|
|
653
|
+
'release inventory',
|
|
654
|
+
'release gate',
|
|
655
|
+
'release gates',
|
|
656
|
+
'verification ledger',
|
|
657
|
+
'operator audit',
|
|
658
|
+
'audit evidence',
|
|
659
|
+
'audit artifact',
|
|
660
|
+
'audit artifacts',
|
|
661
|
+
'package evidence',
|
|
662
|
+
]);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
export function releaseEvidenceLike(lower: string): boolean {
|
|
666
|
+
return hasAny(lower, ['release evidence', 'release artifact', 'release artifacts', 'audit evidence', 'audit artifact', 'audit artifacts', 'verification ledger', 'package evidence']);
|
|
667
|
+
}
|