actoviq-agent-sdk 0.3.1 → 0.4.1
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/README-zh.md +47 -3
- package/README.md +46 -2
- package/bin/actoviq-tui.js +5 -0
- package/dist/src/cli/actoviq-react.js +256 -10
- package/dist/src/cli/actoviq-react.js.map +1 -1
- package/dist/src/cli/actoviq-tui.d.ts +3 -0
- package/dist/src/cli/actoviq-tui.d.ts.map +1 -0
- package/dist/src/cli/actoviq-tui.js +76 -0
- package/dist/src/cli/actoviq-tui.js.map +1 -0
- package/dist/src/config/actoviqSettingsStore.d.ts.map +1 -1
- package/dist/src/config/actoviqSettingsStore.js +8 -2
- package/dist/src/config/actoviqSettingsStore.js.map +1 -1
- package/dist/src/config/anthropicEnvMapping.d.ts +1 -1
- package/dist/src/config/anthropicEnvMapping.d.ts.map +1 -1
- package/dist/src/config/anthropicEnvMapping.js +17 -8
- package/dist/src/config/anthropicEnvMapping.js.map +1 -1
- package/dist/src/config/modelTiers.d.ts +12 -0
- package/dist/src/config/modelTiers.d.ts.map +1 -0
- package/dist/src/config/modelTiers.js +31 -0
- package/dist/src/config/modelTiers.js.map +1 -0
- package/dist/src/config/projectSessionDirectory.d.ts +8 -0
- package/dist/src/config/projectSessionDirectory.d.ts.map +1 -0
- package/dist/src/config/projectSessionDirectory.js +83 -0
- package/dist/src/config/projectSessionDirectory.js.map +1 -0
- package/dist/src/config/resolveRuntimeConfig.d.ts.map +1 -1
- package/dist/src/config/resolveRuntimeConfig.js +44 -16
- package/dist/src/config/resolveRuntimeConfig.js.map +1 -1
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/connectionManager.d.ts.map +1 -1
- package/dist/src/mcp/connectionManager.js +10 -1
- package/dist/src/mcp/connectionManager.js.map +1 -1
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.d.ts.map +1 -1
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.js +6 -2
- package/dist/src/parity/actoviqCleanBridgeCompatSdk.js.map +1 -1
- package/dist/src/provider/client.d.ts +2 -0
- package/dist/src/provider/client.d.ts.map +1 -1
- package/dist/src/provider/client.js +5 -2
- package/dist/src/provider/client.js.map +1 -1
- package/dist/src/provider/openai-model-api.d.ts.map +1 -1
- package/dist/src/provider/openai-model-api.js +3 -0
- package/dist/src/provider/openai-model-api.js.map +1 -1
- package/dist/src/provider/openai-types.d.ts +1 -0
- package/dist/src/provider/openai-types.d.ts.map +1 -1
- package/dist/src/runtime/actoviqAgentDefinitions.d.ts +8 -0
- package/dist/src/runtime/actoviqAgentDefinitions.d.ts.map +1 -0
- package/dist/src/runtime/actoviqAgentDefinitions.js +165 -0
- package/dist/src/runtime/actoviqAgentDefinitions.js.map +1 -0
- package/dist/src/runtime/actoviqAgents.d.ts +20 -2
- package/dist/src/runtime/actoviqAgents.d.ts.map +1 -1
- package/dist/src/runtime/actoviqAgents.js +143 -28
- package/dist/src/runtime/actoviqAgents.js.map +1 -1
- package/dist/src/runtime/actoviqBackgroundTasks.d.ts +14 -1
- package/dist/src/runtime/actoviqBackgroundTasks.d.ts.map +1 -1
- package/dist/src/runtime/actoviqBackgroundTasks.js +71 -10
- package/dist/src/runtime/actoviqBackgroundTasks.js.map +1 -1
- package/dist/src/runtime/actoviqCompact.d.ts +16 -0
- package/dist/src/runtime/actoviqCompact.d.ts.map +1 -1
- package/dist/src/runtime/actoviqCompact.js +112 -13
- package/dist/src/runtime/actoviqCompact.js.map +1 -1
- package/dist/src/runtime/actoviqModelApi.d.ts.map +1 -1
- package/dist/src/runtime/actoviqModelApi.js +20 -4
- package/dist/src/runtime/actoviqModelApi.js.map +1 -1
- package/dist/src/runtime/actoviqPermissions.d.ts +5 -2
- package/dist/src/runtime/actoviqPermissions.d.ts.map +1 -1
- package/dist/src/runtime/actoviqPermissions.js +83 -194
- package/dist/src/runtime/actoviqPermissions.js.map +1 -1
- package/dist/src/runtime/actoviqSessionPermissions.d.ts +5 -0
- package/dist/src/runtime/actoviqSessionPermissions.d.ts.map +1 -0
- package/dist/src/runtime/actoviqSessionPermissions.js +44 -0
- package/dist/src/runtime/actoviqSessionPermissions.js.map +1 -0
- package/dist/src/runtime/actoviqSkills.d.ts +6 -0
- package/dist/src/runtime/actoviqSkills.d.ts.map +1 -1
- package/dist/src/runtime/actoviqSkills.js +69 -1
- package/dist/src/runtime/actoviqSkills.js.map +1 -1
- package/dist/src/runtime/agentClient.d.ts +40 -3
- package/dist/src/runtime/agentClient.d.ts.map +1 -1
- package/dist/src/runtime/agentClient.js +907 -117
- package/dist/src/runtime/agentClient.js.map +1 -1
- package/dist/src/runtime/agentSession.d.ts +8 -5
- package/dist/src/runtime/agentSession.d.ts.map +1 -1
- package/dist/src/runtime/agentSession.js +11 -4
- package/dist/src/runtime/agentSession.js.map +1 -1
- package/dist/src/runtime/conversationEngine.d.ts +4 -0
- package/dist/src/runtime/conversationEngine.d.ts.map +1 -1
- package/dist/src/runtime/conversationEngine.js +87 -7
- package/dist/src/runtime/conversationEngine.js.map +1 -1
- package/dist/src/runtime/defaultActoviqAgents.d.ts.map +1 -1
- package/dist/src/runtime/defaultActoviqAgents.js +41 -0
- package/dist/src/runtime/defaultActoviqAgents.js.map +1 -1
- package/dist/src/storage/sessionStore.d.ts.map +1 -1
- package/dist/src/storage/sessionStore.js +25 -6
- package/dist/src/storage/sessionStore.js.map +1 -1
- package/dist/src/swarm/actoviqSwarm.d.ts.map +1 -1
- package/dist/src/swarm/actoviqSwarm.js +6 -6
- package/dist/src/swarm/actoviqSwarm.js.map +1 -1
- package/dist/src/team/agentPool.d.ts +26 -0
- package/dist/src/team/agentPool.d.ts.map +1 -0
- package/dist/src/team/agentPool.js +97 -0
- package/dist/src/team/agentPool.js.map +1 -0
- package/dist/src/team/modelTeam.d.ts +29 -0
- package/dist/src/team/modelTeam.d.ts.map +1 -0
- package/dist/src/team/modelTeam.js +879 -0
- package/dist/src/team/modelTeam.js.map +1 -0
- package/dist/src/team/pricing.d.ts +15 -0
- package/dist/src/team/pricing.d.ts.map +1 -0
- package/dist/src/team/pricing.js +80 -0
- package/dist/src/team/pricing.js.map +1 -0
- package/dist/src/team/teamDefinitions.d.ts +28 -0
- package/dist/src/team/teamDefinitions.d.ts.map +1 -0
- package/dist/src/team/teamDefinitions.js +162 -0
- package/dist/src/team/teamDefinitions.js.map +1 -0
- package/dist/src/tools/actoviqCoreTools.d.ts.map +1 -1
- package/dist/src/tools/actoviqCoreTools.js +6 -1
- package/dist/src/tools/actoviqCoreTools.js.map +1 -1
- package/dist/src/tools/bash/BashTool.d.ts.map +1 -1
- package/dist/src/tools/bash/BashTool.js +43 -10
- package/dist/src/tools/bash/BashTool.js.map +1 -1
- package/dist/src/tools/enterWorktree.d.ts +11 -0
- package/dist/src/tools/enterWorktree.d.ts.map +1 -0
- package/dist/src/tools/enterWorktree.js +79 -0
- package/dist/src/tools/enterWorktree.js.map +1 -0
- package/dist/src/tools/exitWorktree.d.ts +4 -0
- package/dist/src/tools/exitWorktree.d.ts.map +1 -0
- package/dist/src/tools/exitWorktree.js +48 -0
- package/dist/src/tools/exitWorktree.js.map +1 -0
- package/dist/src/tools/tavilySearch.d.ts +12 -0
- package/dist/src/tools/tavilySearch.d.ts.map +1 -0
- package/dist/src/tools/tavilySearch.js +139 -0
- package/dist/src/tools/tavilySearch.js.map +1 -0
- package/dist/src/tui/actoviqTui.d.ts +23 -0
- package/dist/src/tui/actoviqTui.d.ts.map +1 -0
- package/dist/src/tui/actoviqTui.js +2093 -0
- package/dist/src/tui/actoviqTui.js.map +1 -0
- package/dist/src/tui/ansi.d.ts +33 -0
- package/dist/src/tui/ansi.d.ts.map +1 -0
- package/dist/src/tui/ansi.js +127 -0
- package/dist/src/tui/ansi.js.map +1 -0
- package/dist/src/tui/editor.d.ts +58 -0
- package/dist/src/tui/editor.d.ts.map +1 -0
- package/dist/src/tui/editor.js +258 -0
- package/dist/src/tui/editor.js.map +1 -0
- package/dist/src/tui/pluginCatalog.d.ts +13 -0
- package/dist/src/tui/pluginCatalog.d.ts.map +1 -0
- package/dist/src/tui/pluginCatalog.js +78 -0
- package/dist/src/tui/pluginCatalog.js.map +1 -0
- package/dist/src/tui/screen.d.ts +28 -0
- package/dist/src/tui/screen.d.ts.map +1 -0
- package/dist/src/tui/screen.js +119 -0
- package/dist/src/tui/screen.js.map +1 -0
- package/dist/src/tui/selection.d.ts +9 -0
- package/dist/src/tui/selection.d.ts.map +1 -0
- package/dist/src/tui/selection.js +16 -0
- package/dist/src/tui/selection.js.map +1 -0
- package/dist/src/tui/transcript.d.ts +41 -0
- package/dist/src/tui/transcript.d.ts.map +1 -0
- package/dist/src/tui/transcript.js +147 -0
- package/dist/src/tui/transcript.js.map +1 -0
- package/dist/src/types.d.ts +427 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/workflow/workflowPersistence.d.ts +34 -0
- package/dist/src/workflow/workflowPersistence.d.ts.map +1 -0
- package/dist/src/workflow/workflowPersistence.js +144 -0
- package/dist/src/workflow/workflowPersistence.js.map +1 -0
- package/dist/src/workflow/workflowScriptRuntime.d.ts +22 -0
- package/dist/src/workflow/workflowScriptRuntime.d.ts.map +1 -0
- package/dist/src/workflow/workflowScriptRuntime.js +655 -0
- package/dist/src/workflow/workflowScriptRuntime.js.map +1 -0
- package/dist/src/worktree/worktreeHooks.d.ts +38 -0
- package/dist/src/worktree/worktreeHooks.d.ts.map +1 -0
- package/dist/src/worktree/worktreeHooks.js +82 -0
- package/dist/src/worktree/worktreeHooks.js.map +1 -0
- package/dist/src/worktree/worktreeInclude.d.ts +11 -0
- package/dist/src/worktree/worktreeInclude.d.ts.map +1 -0
- package/dist/src/worktree/worktreeInclude.js +65 -0
- package/dist/src/worktree/worktreeInclude.js.map +1 -0
- package/dist/src/worktree/worktreeService.d.ts +43 -0
- package/dist/src/worktree/worktreeService.d.ts.map +1 -0
- package/dist/src/worktree/worktreeService.js +356 -0
- package/dist/src/worktree/worktreeService.js.map +1 -0
- package/package.json +3 -24
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { nowIso } from './helpers.js';
|
|
2
2
|
import { checkSafety } from './safetyChecks.js';
|
|
3
|
+
const FILE_EDIT_TOOLS = new Set(['Write', 'Edit', 'NotebookEdit']);
|
|
3
4
|
function escapeRegExp(value) {
|
|
4
5
|
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
5
6
|
}
|
|
@@ -15,22 +16,24 @@ function matchesRule(rule, publicName, input) {
|
|
|
15
16
|
}
|
|
16
17
|
return wildcardToRegExp(rule.matcher).test(JSON.stringify(input ?? {}));
|
|
17
18
|
}
|
|
19
|
+
function decision(input, behavior, reason, source, timestamp, matchedRule) {
|
|
20
|
+
return {
|
|
21
|
+
toolName: input.toolName,
|
|
22
|
+
publicName: input.publicName,
|
|
23
|
+
behavior,
|
|
24
|
+
reason,
|
|
25
|
+
source,
|
|
26
|
+
matchedRule,
|
|
27
|
+
timestamp,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
18
30
|
export async function decideActoviqToolPermission(input) {
|
|
19
31
|
const timestamp = nowIso();
|
|
20
|
-
|
|
21
|
-
|
|
32
|
+
const denyRule = input.rules.find(rule => rule.behavior === 'deny' &&
|
|
33
|
+
matchesRule(rule, input.publicName, input.toolInput));
|
|
22
34
|
if (denyRule) {
|
|
23
|
-
return {
|
|
24
|
-
toolName: input.toolName,
|
|
25
|
-
publicName: input.publicName,
|
|
26
|
-
behavior: 'deny',
|
|
27
|
-
reason: `Denied by permission rule ${denyRule.toolName}.`,
|
|
28
|
-
source: 'rule',
|
|
29
|
-
matchedRule: denyRule.toolName,
|
|
30
|
-
timestamp,
|
|
31
|
-
};
|
|
35
|
+
return decision(input, 'deny', `Denied by permission rule ${denyRule.toolName}.`, 'rule', timestamp, denyRule.toolName);
|
|
32
36
|
}
|
|
33
|
-
// ── Step 2: Safety checks ─────────────────────────────────────
|
|
34
37
|
const safetyResult = checkSafety({
|
|
35
38
|
toolName: input.toolName,
|
|
36
39
|
publicName: input.publicName,
|
|
@@ -38,67 +41,47 @@ export async function decideActoviqToolPermission(input) {
|
|
|
38
41
|
workDir: input.workDir,
|
|
39
42
|
});
|
|
40
43
|
if (safetyResult.blocked) {
|
|
41
|
-
return
|
|
42
|
-
toolName: input.toolName,
|
|
43
|
-
publicName: input.publicName,
|
|
44
|
-
behavior: 'deny',
|
|
45
|
-
reason: safetyResult.reason ?? 'Blocked by safety check.',
|
|
46
|
-
source: 'mode',
|
|
47
|
-
timestamp,
|
|
48
|
-
};
|
|
44
|
+
return decision(input, 'deny', safetyResult.reason ?? 'Blocked by safety check.', 'mode', timestamp);
|
|
49
45
|
}
|
|
50
|
-
// ── Step 3: Tool-specific checkPermissions ────────────────────
|
|
51
46
|
if (input.adapter?.checkPermissions) {
|
|
52
|
-
const
|
|
47
|
+
const toolDecision = await input.adapter.checkPermissions({
|
|
53
48
|
mode: input.mode,
|
|
54
49
|
runId: input.runId,
|
|
55
50
|
sessionId: input.sessionId,
|
|
56
51
|
});
|
|
57
|
-
if (
|
|
58
|
-
return {
|
|
59
|
-
toolName: input.toolName,
|
|
60
|
-
publicName: input.publicName,
|
|
61
|
-
behavior: 'deny',
|
|
62
|
-
reason: `Tool ${input.publicName} denied via checkPermissions.`,
|
|
63
|
-
source: 'mode',
|
|
64
|
-
timestamp,
|
|
65
|
-
};
|
|
52
|
+
if (toolDecision === 'deny') {
|
|
53
|
+
return decision(input, 'deny', `Tool ${input.publicName} denied via checkPermissions.`, 'mode', timestamp);
|
|
66
54
|
}
|
|
67
|
-
if (
|
|
68
|
-
return {
|
|
69
|
-
toolName: input.toolName,
|
|
70
|
-
publicName: input.publicName,
|
|
71
|
-
behavior: 'allow',
|
|
72
|
-
reason: `Tool ${input.publicName} allowed via checkPermissions.`,
|
|
73
|
-
source: 'mode',
|
|
74
|
-
timestamp,
|
|
75
|
-
};
|
|
55
|
+
if (toolDecision === 'allow') {
|
|
56
|
+
return decision(input, 'allow', `Tool ${input.publicName} allowed via checkPermissions.`, 'mode', timestamp);
|
|
76
57
|
}
|
|
77
|
-
if (
|
|
78
|
-
return resolveActoviqAskPermission(input, {
|
|
79
|
-
toolName: input.toolName,
|
|
80
|
-
publicName: input.publicName,
|
|
81
|
-
behavior: 'deny',
|
|
82
|
-
reason: `Tool ${input.publicName} requires approval via checkPermissions.`,
|
|
83
|
-
source: 'mode',
|
|
84
|
-
timestamp,
|
|
85
|
-
}, timestamp);
|
|
58
|
+
if (toolDecision === 'ask') {
|
|
59
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', `Tool ${input.publicName} requires approval via checkPermissions.`, 'mode', timestamp), timestamp);
|
|
86
60
|
}
|
|
87
61
|
}
|
|
88
|
-
|
|
89
|
-
|
|
62
|
+
const askRule = input.rules.find(rule => rule.behavior === 'ask' &&
|
|
63
|
+
matchesRule(rule, input.publicName, input.toolInput));
|
|
90
64
|
if (askRule) {
|
|
91
|
-
return resolveActoviqAskPermission(input, {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
65
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', `Tool ${input.publicName} requires approval before execution.`, 'rule', timestamp, askRule.toolName), timestamp);
|
|
66
|
+
}
|
|
67
|
+
if (input.adapter?.requiresUserInteraction?.()) {
|
|
68
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', `Tool ${input.publicName} requires interactive approval.`, 'mode', timestamp), timestamp);
|
|
69
|
+
}
|
|
70
|
+
if (input.mode === 'bypassPermissions') {
|
|
71
|
+
return decision(input, 'allow', 'Bypass-permissions mode allows tool execution.', 'mode', timestamp);
|
|
72
|
+
}
|
|
73
|
+
const allowRule = input.rules.find(rule => rule.behavior === 'allow' &&
|
|
74
|
+
matchesRule(rule, input.publicName, input.toolInput));
|
|
75
|
+
if (allowRule) {
|
|
76
|
+
return decision(input, 'allow', `Allowed by permission rule ${allowRule.toolName}.`, 'rule', timestamp, allowRule.toolName);
|
|
77
|
+
}
|
|
78
|
+
const readOnly = input.adapter?.isReadOnly?.(input.toolInput) ?? false;
|
|
79
|
+
if (readOnly) {
|
|
80
|
+
return decision(input, 'allow', `${input.mode} mode allows read-only tool execution.`, 'mode', timestamp);
|
|
81
|
+
}
|
|
82
|
+
if (input.mode === 'acceptEdits' && FILE_EDIT_TOOLS.has(input.publicName)) {
|
|
83
|
+
return decision(input, 'allow', 'acceptEdits mode allows workspace file edits.', 'mode', timestamp);
|
|
100
84
|
}
|
|
101
|
-
// ── Step 5: Classifier ────────────────────────────────────────
|
|
102
85
|
if (input.classifier) {
|
|
103
86
|
const outcome = await input.classifier({
|
|
104
87
|
runId: input.runId,
|
|
@@ -110,40 +93,16 @@ export async function decideActoviqToolPermission(input) {
|
|
|
110
93
|
prompt: input.prompt,
|
|
111
94
|
iteration: input.iteration,
|
|
112
95
|
});
|
|
113
|
-
if (outcome) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
timestamp,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
if (outcome.behavior === 'ask') {
|
|
125
|
-
return resolveActoviqAskPermission(input, {
|
|
126
|
-
toolName: input.toolName,
|
|
127
|
-
publicName: input.publicName,
|
|
128
|
-
behavior: 'deny',
|
|
129
|
-
reason: outcome.reason,
|
|
130
|
-
source: 'classifier',
|
|
131
|
-
timestamp,
|
|
132
|
-
}, timestamp);
|
|
133
|
-
}
|
|
134
|
-
if (outcome.behavior === 'allow') {
|
|
135
|
-
return {
|
|
136
|
-
toolName: input.toolName,
|
|
137
|
-
publicName: input.publicName,
|
|
138
|
-
behavior: 'allow',
|
|
139
|
-
reason: outcome.reason,
|
|
140
|
-
source: 'classifier',
|
|
141
|
-
timestamp,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
96
|
+
if (outcome?.behavior === 'allow') {
|
|
97
|
+
return decision(input, 'allow', outcome.reason, 'classifier', timestamp);
|
|
98
|
+
}
|
|
99
|
+
if (outcome?.behavior === 'deny') {
|
|
100
|
+
return decision(input, 'deny', outcome.reason, 'classifier', timestamp);
|
|
101
|
+
}
|
|
102
|
+
if (outcome?.behavior === 'ask') {
|
|
103
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', outcome.reason, 'classifier', timestamp), timestamp);
|
|
144
104
|
}
|
|
145
105
|
}
|
|
146
|
-
// ── Step 6: canUseTool callback ────────────────────────────────
|
|
147
106
|
if (input.canUseTool) {
|
|
148
107
|
const outcome = await input.canUseTool({
|
|
149
108
|
runId: input.runId,
|
|
@@ -155,106 +114,44 @@ export async function decideActoviqToolPermission(input) {
|
|
|
155
114
|
prompt: input.prompt,
|
|
156
115
|
iteration: input.iteration,
|
|
157
116
|
});
|
|
158
|
-
if (outcome) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
timestamp,
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
if (outcome.behavior === 'ask') {
|
|
170
|
-
return resolveActoviqAskPermission(input, {
|
|
171
|
-
toolName: input.toolName,
|
|
172
|
-
publicName: input.publicName,
|
|
173
|
-
behavior: 'deny',
|
|
174
|
-
reason: outcome.reason ?? `Tool ${input.publicName} requires approval.`,
|
|
175
|
-
source: 'canUseTool',
|
|
176
|
-
timestamp,
|
|
177
|
-
}, timestamp);
|
|
178
|
-
}
|
|
179
|
-
return {
|
|
180
|
-
toolName: input.toolName,
|
|
181
|
-
publicName: input.publicName,
|
|
182
|
-
behavior: 'allow',
|
|
183
|
-
reason: outcome.reason ?? `Allowed by canUseTool.`,
|
|
184
|
-
source: 'canUseTool',
|
|
185
|
-
timestamp,
|
|
186
|
-
};
|
|
117
|
+
if (outcome?.behavior === 'allow') {
|
|
118
|
+
return decision(input, 'allow', outcome.reason ?? 'Allowed by canUseTool.', 'canUseTool', timestamp);
|
|
119
|
+
}
|
|
120
|
+
if (outcome?.behavior === 'deny') {
|
|
121
|
+
return decision(input, 'deny', outcome.reason ?? 'Denied by canUseTool.', 'canUseTool', timestamp);
|
|
122
|
+
}
|
|
123
|
+
if (outcome?.behavior === 'ask') {
|
|
124
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', outcome.reason ?? `Tool ${input.publicName} requires approval.`, 'canUseTool', timestamp), timestamp);
|
|
187
125
|
}
|
|
188
126
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
if (
|
|
192
|
-
return
|
|
193
|
-
toolName: input.toolName,
|
|
194
|
-
publicName: input.publicName,
|
|
195
|
-
behavior: 'allow',
|
|
196
|
-
reason: `Allowed by permission rule ${allowRule.toolName}.`,
|
|
197
|
-
source: 'rule',
|
|
198
|
-
matchedRule: allowRule.toolName,
|
|
199
|
-
timestamp,
|
|
200
|
-
};
|
|
127
|
+
const destructive = input.adapter?.isDestructive?.(input.toolInput) ??
|
|
128
|
+
(input.adapter?.isReadOnly ? !readOnly : false);
|
|
129
|
+
if (input.mode === 'plan' && destructive) {
|
|
130
|
+
return decision(input, 'deny', 'Plan mode blocks mutating tools until the plan is approved.', 'mode', timestamp);
|
|
201
131
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
return {
|
|
206
|
-
toolName: input.toolName,
|
|
207
|
-
publicName: input.publicName,
|
|
208
|
-
behavior: 'allow',
|
|
209
|
-
reason: 'Bypass-permissions mode allows tool execution.',
|
|
210
|
-
source: 'mode',
|
|
211
|
-
timestamp,
|
|
212
|
-
};
|
|
213
|
-
case 'plan': {
|
|
214
|
-
const readOnly = input.adapter?.isReadOnly?.(input.toolInput) ?? false;
|
|
215
|
-
return {
|
|
216
|
-
toolName: input.toolName,
|
|
217
|
-
publicName: input.publicName,
|
|
218
|
-
behavior: readOnly ? 'allow' : 'deny',
|
|
219
|
-
reason: readOnly
|
|
220
|
-
? 'Plan mode allows read-only tool execution.'
|
|
221
|
-
: 'Plan mode blocks mutating tools until the plan is approved.',
|
|
222
|
-
source: 'mode',
|
|
223
|
-
timestamp,
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
case 'acceptEdits': {
|
|
227
|
-
const classified = input.adapter?.isReadOnly !== undefined;
|
|
228
|
-
return {
|
|
229
|
-
toolName: input.toolName,
|
|
230
|
-
publicName: input.publicName,
|
|
231
|
-
behavior: classified ? 'allow' : 'deny',
|
|
232
|
-
reason: classified
|
|
233
|
-
? 'acceptEdits mode allows classified tools.'
|
|
234
|
-
: 'acceptEdits mode blocks unsupported high-risk tools.',
|
|
235
|
-
source: 'mode',
|
|
236
|
-
timestamp,
|
|
237
|
-
};
|
|
132
|
+
if (destructive) {
|
|
133
|
+
if (!input.approver) {
|
|
134
|
+
return decision(input, 'deny', `${input.mode} mode requires approval for mutating tools, but no approver is available.`, 'mode', timestamp);
|
|
238
135
|
}
|
|
239
|
-
|
|
240
|
-
case 'default':
|
|
241
|
-
default:
|
|
242
|
-
return {
|
|
243
|
-
toolName: input.toolName,
|
|
244
|
-
publicName: input.publicName,
|
|
245
|
-
behavior: 'allow',
|
|
246
|
-
reason: `${input.mode} mode allows tool execution by default.`,
|
|
247
|
-
source: 'mode',
|
|
248
|
-
timestamp,
|
|
249
|
-
};
|
|
136
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', `${input.mode} mode requires approval for mutating tools.`, 'mode', timestamp), timestamp);
|
|
250
137
|
}
|
|
138
|
+
if (input.mode !== 'plan' && input.adapter?.isReadOnly === undefined) {
|
|
139
|
+
return decision(input, 'allow', `${input.mode} mode allows tools that do not declare a mutation classification.`, 'mode', timestamp);
|
|
140
|
+
}
|
|
141
|
+
if (input.mode === 'plan') {
|
|
142
|
+
return decision(input, 'deny', 'Plan mode blocks mutating tools until the plan is approved.', 'mode', timestamp);
|
|
143
|
+
}
|
|
144
|
+
if (!input.approver) {
|
|
145
|
+
return decision(input, 'allow', `${input.mode} mode allows unclassified tools when no interactive approver is configured.`, 'mode', timestamp);
|
|
146
|
+
}
|
|
147
|
+
return resolveActoviqAskPermission(input, decision(input, 'deny', `${input.mode} mode requires approval for mutating or unclassified tools.`, 'mode', timestamp), timestamp);
|
|
251
148
|
}
|
|
252
149
|
async function resolveActoviqAskPermission(input, baseDecision, timestamp) {
|
|
253
150
|
if (!input.approver) {
|
|
254
151
|
return {
|
|
255
152
|
...baseDecision,
|
|
256
153
|
behavior: 'deny',
|
|
257
|
-
reason: `${baseDecision.reason} Approval is required, but
|
|
154
|
+
reason: `${baseDecision.reason} Approval is required, but no approver is available.`,
|
|
258
155
|
timestamp,
|
|
259
156
|
};
|
|
260
157
|
}
|
|
@@ -273,17 +170,9 @@ async function resolveActoviqAskPermission(input, baseDecision, timestamp) {
|
|
|
273
170
|
source: baseDecision.source === 'rule' ? 'rule' : 'classifier',
|
|
274
171
|
matchedRule: baseDecision.matchedRule,
|
|
275
172
|
});
|
|
276
|
-
return
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
reason: approval?.reason ??
|
|
281
|
-
(approval?.behavior === 'allow'
|
|
282
|
-
? `Approved ${baseDecision.publicName} for execution.`
|
|
283
|
-
: `${baseDecision.reason} Approval was denied.`),
|
|
284
|
-
source: 'approver',
|
|
285
|
-
matchedRule: baseDecision.matchedRule,
|
|
286
|
-
timestamp,
|
|
287
|
-
};
|
|
173
|
+
return decision(input, approval?.behavior === 'allow' ? 'allow' : 'deny', approval?.reason ??
|
|
174
|
+
(approval?.behavior === 'allow'
|
|
175
|
+
? `Approved ${baseDecision.publicName} for execution.`
|
|
176
|
+
: `${baseDecision.reason} Approval was denied.`), 'approver', timestamp, baseDecision.matchedRule);
|
|
288
177
|
}
|
|
289
178
|
//# sourceMappingURL=actoviqPermissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actoviqPermissions.js","sourceRoot":"","sources":["../../../src/runtime/actoviqPermissions.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,IAAI,MAAM,CACf,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAC1E,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,IAA2B,EAC3B,UAAkB,EAClB,KAAc;IAEd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,
|
|
1
|
+
{"version":3,"file":"actoviqPermissions.js","sourceRoot":"","sources":["../../../src/runtime/actoviqPermissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ActoviqSessionPermissionState } from '../types.js';
|
|
2
|
+
export declare const ACTOVIQ_SESSION_PERMISSION_STATE_KEY = "__actoviqPermissionState";
|
|
3
|
+
export declare function getPersistedActoviqSessionPermissionState(metadata: Record<string, unknown> | undefined): ActoviqSessionPermissionState;
|
|
4
|
+
export declare function serializeActoviqSessionPermissionState(state: ActoviqSessionPermissionState): Record<string, unknown>;
|
|
5
|
+
//# sourceMappingURL=actoviqSessionPermissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actoviqSessionPermissions.d.ts","sourceRoot":"","sources":["../../../src/runtime/actoviqSessionPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,oCAAoC,6BAA6B,CAAC;AAU/E,wBAAgB,yCAAyC,CACvD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC5C,6BAA6B,CAiC/B;AAED,wBAAgB,sCAAsC,CACpD,KAAK,EAAE,6BAA6B,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const ACTOVIQ_SESSION_PERMISSION_STATE_KEY = '__actoviqPermissionState';
|
|
2
|
+
const PERMISSION_MODES = new Set([
|
|
3
|
+
'default',
|
|
4
|
+
'acceptEdits',
|
|
5
|
+
'bypassPermissions',
|
|
6
|
+
'plan',
|
|
7
|
+
'auto',
|
|
8
|
+
]);
|
|
9
|
+
export function getPersistedActoviqSessionPermissionState(metadata) {
|
|
10
|
+
const raw = metadata?.[ACTOVIQ_SESSION_PERMISSION_STATE_KEY];
|
|
11
|
+
if (!raw || typeof raw !== 'object') {
|
|
12
|
+
return { permissions: [] };
|
|
13
|
+
}
|
|
14
|
+
const record = raw;
|
|
15
|
+
const mode = typeof record.mode === 'string' && PERMISSION_MODES.has(record.mode)
|
|
16
|
+
? record.mode
|
|
17
|
+
: undefined;
|
|
18
|
+
const permissions = Array.isArray(record.permissions)
|
|
19
|
+
? record.permissions.flatMap((entry) => {
|
|
20
|
+
if (!entry || typeof entry !== 'object') {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const rule = entry;
|
|
24
|
+
if (typeof rule.toolName !== 'string' ||
|
|
25
|
+
(rule.behavior !== 'allow' && rule.behavior !== 'deny' && rule.behavior !== 'ask')) {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
return [{
|
|
29
|
+
toolName: rule.toolName,
|
|
30
|
+
behavior: rule.behavior,
|
|
31
|
+
matcher: typeof rule.matcher === 'string' ? rule.matcher : undefined,
|
|
32
|
+
source: typeof rule.source === 'string' ? rule.source : undefined,
|
|
33
|
+
}];
|
|
34
|
+
})
|
|
35
|
+
: [];
|
|
36
|
+
return { mode, permissions };
|
|
37
|
+
}
|
|
38
|
+
export function serializeActoviqSessionPermissionState(state) {
|
|
39
|
+
return {
|
|
40
|
+
mode: state.mode,
|
|
41
|
+
permissions: state.permissions.map(rule => ({ ...rule })),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=actoviqSessionPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actoviqSessionPermissions.js","sourceRoot":"","sources":["../../../src/runtime/actoviqSessionPermissions.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,oCAAoC,GAAG,0BAA0B,CAAC;AAE/E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAwB;IACtD,SAAS;IACT,aAAa;IACb,mBAAmB;IACnB,MAAM;IACN,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,yCAAyC,CACvD,QAA6C;IAE7C,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC,oCAAoC,CAAC,CAAC;IAC7D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,IAAI,GACR,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAA6B,CAAC;QAC3F,CAAC,CAAE,MAAM,CAAC,IAA8B;QACxC,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;QACnD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAA2B,EAAE;YAC5D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,IAAI,GAAG,KAAgC,CAAC;YAC9C,IACE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;gBACjC,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,EAClF,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,CAAC;oBACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,OAAO,EAAE,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;oBACpE,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;iBAClE,CAAC,CAAC;QACL,CAAC,CAAC;QACJ,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,sCAAsC,CACpD,KAAoC;IAEpC,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -44,5 +44,11 @@ export declare function loadActoviqSkillDefinitions(options: {
|
|
|
44
44
|
loadDefaultSkillDirectories?: boolean;
|
|
45
45
|
}): Promise<ActoviqSkillDefinition[]>;
|
|
46
46
|
export declare function resolveActoviqSkillPrompt(definition: ActoviqSkillDefinition, args: string, context: ActoviqSkillPromptContext): Promise<ActoviqSkillPromptBuildResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Returns true if `relativePath` (cwd-relative, forward slashes) matches any of
|
|
49
|
+
* the gitignore-style `patterns`. Supports `dir/**` prefixes and `*` / `**`
|
|
50
|
+
* globs — enough for skill `paths:` frontmatter without a new dependency.
|
|
51
|
+
*/
|
|
52
|
+
export declare function skillPathsMatch(patterns: string[], relativePath: string): boolean;
|
|
47
53
|
export {};
|
|
48
54
|
//# sourceMappingURL=actoviqSkills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actoviqSkills.d.ts","sourceRoot":"","sources":["../../../src/runtime/actoviqSkills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"actoviqSkills.d.ts","sourceRoot":"","sources":["../../../src/runtime/actoviqSkills.ts"],"names":[],"mappings":"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"}
|
|
@@ -136,6 +136,30 @@ const DEFAULT_BUNDLED_SKILLS = [
|
|
|
136
136
|
source: 'bundled',
|
|
137
137
|
loadedFrom: 'bundled',
|
|
138
138
|
},
|
|
139
|
+
{
|
|
140
|
+
name: 'tavily',
|
|
141
|
+
description: 'AI-optimized web search via Tavily API. Use for research, fact-checking, current events, and gathering authoritative sources.',
|
|
142
|
+
whenToUse: 'Use when you need comprehensive web research, current events lookup, domain-specific search, or AI-generated answer summaries. Best for research tasks, news queries, fact-checking, and gathering authoritative sources.',
|
|
143
|
+
prompt: [
|
|
144
|
+
'You are executing the /tavily skill for web research.',
|
|
145
|
+
'',
|
|
146
|
+
'Research protocol:',
|
|
147
|
+
'1. Use TavilySearch tool to find authoritative sources.',
|
|
148
|
+
'2. Start with depth="basic" for most queries (faster, cheaper).',
|
|
149
|
+
'3. Use depth="advanced" for complex or nuanced topics.',
|
|
150
|
+
'4. Use topic="news" ONLY for current events (last 7 days).',
|
|
151
|
+
'5. Filter domains when you know trusted sources for the topic.',
|
|
152
|
+
'6. Start with max_results=5, increase only if needed.',
|
|
153
|
+
'',
|
|
154
|
+
'Always cite sources in your response with markdown hyperlinks.',
|
|
155
|
+
'',
|
|
156
|
+
'Task:',
|
|
157
|
+
'$ARGUMENTS',
|
|
158
|
+
].join('\n'),
|
|
159
|
+
source: 'bundled',
|
|
160
|
+
loadedFrom: 'bundled',
|
|
161
|
+
tools: [], // will use globally available TavilySearch tool
|
|
162
|
+
},
|
|
139
163
|
];
|
|
140
164
|
export function skill(definition) {
|
|
141
165
|
return normalizeActoviqSkillDefinition(definition);
|
|
@@ -149,6 +173,9 @@ export function summarizeActoviqSkillDefinition(definition) {
|
|
|
149
173
|
argumentHint: normalized.argumentHint,
|
|
150
174
|
argNames: [...(normalized.argNames ?? [])],
|
|
151
175
|
model: normalized.model,
|
|
176
|
+
effort: normalized.effort,
|
|
177
|
+
version: normalized.version,
|
|
178
|
+
displayName: normalized.displayName,
|
|
152
179
|
source: normalized.source ?? 'custom',
|
|
153
180
|
loadedFrom: normalized.loadedFrom ?? 'custom',
|
|
154
181
|
context: normalized.context ?? 'inline',
|
|
@@ -424,7 +451,9 @@ async function loadActoviqSkillsDirectory(rootDir, source) {
|
|
|
424
451
|
return [];
|
|
425
452
|
}
|
|
426
453
|
const loaded = await Promise.all(entries.map(async (entry) => {
|
|
427
|
-
|
|
454
|
+
// Accept real directories AND symlinks to directories — skill managers
|
|
455
|
+
// commonly install skills via symlink. readFile() below follows the link.
|
|
456
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink()) {
|
|
428
457
|
return null;
|
|
429
458
|
}
|
|
430
459
|
const skillRoot = path.join(rootDir, entry.name);
|
|
@@ -542,6 +571,9 @@ function createDiskSkillDefinition(input) {
|
|
|
542
571
|
argNames: argNames.length > 0 ? argNames : undefined,
|
|
543
572
|
prompt,
|
|
544
573
|
model: input.frontmatter.model?.trim() || undefined,
|
|
574
|
+
effort: parseEffortField(input.frontmatter.effort),
|
|
575
|
+
version: input.frontmatter.version?.trim() || undefined,
|
|
576
|
+
displayName: input.frontmatter.name?.trim() || undefined,
|
|
545
577
|
disableModelInvocation: parseBooleanField(input.frontmatter['disable-model-invocation']),
|
|
546
578
|
userInvocable: input.frontmatter['user-invocable'] == null
|
|
547
579
|
? true
|
|
@@ -601,6 +633,42 @@ function parseBooleanField(value) {
|
|
|
601
633
|
}
|
|
602
634
|
return /^(1|true|yes|on)$/iu.test(value.trim());
|
|
603
635
|
}
|
|
636
|
+
const EFFORT_VALUES = ['low', 'medium', 'high', 'max'];
|
|
637
|
+
function parseEffortField(value) {
|
|
638
|
+
if (!value) {
|
|
639
|
+
return undefined;
|
|
640
|
+
}
|
|
641
|
+
const normalized = value.trim().toLowerCase();
|
|
642
|
+
return EFFORT_VALUES.includes(normalized)
|
|
643
|
+
? normalized
|
|
644
|
+
: undefined;
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Returns true if `relativePath` (cwd-relative, forward slashes) matches any of
|
|
648
|
+
* the gitignore-style `patterns`. Supports `dir/**` prefixes and `*` / `**`
|
|
649
|
+
* globs — enough for skill `paths:` frontmatter without a new dependency.
|
|
650
|
+
*/
|
|
651
|
+
export function skillPathsMatch(patterns, relativePath) {
|
|
652
|
+
const target = relativePath.replace(/\\/gu, '/');
|
|
653
|
+
for (const raw of patterns) {
|
|
654
|
+
const pattern = raw.replace(/\\/gu, '/').replace(/\/\*\*$/u, '');
|
|
655
|
+
if (!pattern || pattern === '**') {
|
|
656
|
+
continue;
|
|
657
|
+
}
|
|
658
|
+
if (target === pattern || target.startsWith(`${pattern}/`)) {
|
|
659
|
+
return true;
|
|
660
|
+
}
|
|
661
|
+
const body = pattern
|
|
662
|
+
.replace(/[.+^${}()|[\]\\]/gu, '\\$&')
|
|
663
|
+
.replace(/\*\*/gu, '')
|
|
664
|
+
.replace(/\*/gu, '[^/]*')
|
|
665
|
+
.replace(//gu, '.*');
|
|
666
|
+
if (new RegExp(`^${body}$`, 'u').test(target)) {
|
|
667
|
+
return true;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
return false;
|
|
671
|
+
}
|
|
604
672
|
function extractDescriptionFromMarkdown(content) {
|
|
605
673
|
const lines = content
|
|
606
674
|
.split(/\r?\n/iu)
|