@caupulican/pi-adaptative 0.90.12 → 0.91.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 +39 -0
- package/README.md +8 -10
- package/dist/bundled-resources/skills/icm-architect/LICENSE +21 -0
- package/dist/bundled-resources/skills/icm-architect/SKILL.md +112 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/CLAUDE.md +27 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/CONTEXT.md +14 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/node.md +29 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/object.md +43 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/process.md +38 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/questionnaire.md +9 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/schema.md +24 -0
- package/dist/bundled-resources/skills/icm-architect/assets/templates/stage-CONTEXT.md +21 -0
- package/dist/bundled-resources/skills/icm-architect/references/core.md +92 -0
- package/dist/bundled-resources/skills/icm-architect/references/forms.md +182 -0
- package/dist/bundled-resources/skills/icm-architect/references/system-map.md +122 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-paths.d.ts +2 -2
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +1 -0
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +40 -10
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +2 -0
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +9 -0
- package/dist/core/background-tool-task-controller.d.ts.map +1 -1
- package/dist/core/background-tool-task-controller.js +23 -0
- package/dist/core/background-tool-task-controller.js.map +1 -1
- package/dist/core/bash-executor.js +3 -3
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/context/local-graph-memory-provider.d.ts +9 -0
- package/dist/core/context/local-graph-memory-provider.d.ts.map +1 -0
- package/dist/core/context/local-graph-memory-provider.js +122 -0
- package/dist/core/context/local-graph-memory-provider.js.map +1 -0
- package/dist/core/context/tool-output-packer.d.ts +2 -2
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js +3 -3
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +2 -0
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/default-tool-surface.d.ts.map +1 -1
- package/dist/core/default-tool-surface.js +5 -0
- package/dist/core/default-tool-surface.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +1 -0
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +16 -8
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +2 -0
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-context-inheritance-policy.d.ts +3 -3
- package/dist/core/delegation/worker-context-inheritance-policy.js +4 -4
- package/dist/core/delegation/worker-context-inheritance-policy.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +1 -5
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +19 -9
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +2 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.js +6 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts +0 -1
- package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
- package/dist/core/foreground-terminal-handoff-controller.js +1 -2
- package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
- package/dist/core/goals/goal-continuation-controller.d.ts +7 -1
- package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-controller.js +16 -0
- package/dist/core/goals/goal-continuation-controller.js.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.d.ts +3 -0
- package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.js +8 -1
- package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +2 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +1 -0
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts +18 -0
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js +62 -0
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/goals/natural-language-goal.d.ts.map +1 -1
- package/dist/core/goals/natural-language-goal.js +4 -2
- package/dist/core/goals/natural-language-goal.js.map +1 -1
- package/dist/core/human-input-controller.d.ts +3 -34
- package/dist/core/human-input-controller.d.ts.map +1 -1
- package/dist/core/human-input-controller.js +3 -161
- package/dist/core/human-input-controller.js.map +1 -1
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/learning/reflection-turn-analysis.d.ts.map +1 -1
- package/dist/core/learning/reflection-turn-analysis.js +10 -1
- package/dist/core/learning/reflection-turn-analysis.js.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +4 -0
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory-controller.d.ts +3 -0
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +18 -0
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js +1 -0
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/orchestration/work-state-projection.d.ts +4 -0
- package/dist/core/orchestration/work-state-projection.d.ts.map +1 -1
- package/dist/core/orchestration/work-state-projection.js +11 -0
- package/dist/core/orchestration/work-state-projection.js.map +1 -1
- package/dist/core/pipelines/context.d.ts +6 -0
- package/dist/core/pipelines/context.d.ts.map +1 -0
- package/dist/core/pipelines/context.js +102 -0
- package/dist/core/pipelines/context.js.map +1 -0
- package/dist/core/pipelines/discover.d.ts +11 -0
- package/dist/core/pipelines/discover.d.ts.map +1 -0
- package/dist/core/pipelines/discover.js +147 -0
- package/dist/core/pipelines/discover.js.map +1 -0
- package/dist/core/pipelines/increment.d.ts +24 -0
- package/dist/core/pipelines/increment.d.ts.map +1 -0
- package/dist/core/pipelines/increment.js +121 -0
- package/dist/core/pipelines/increment.js.map +1 -0
- package/dist/core/pipelines/index.d.ts +8 -0
- package/dist/core/pipelines/index.d.ts.map +1 -0
- package/dist/core/pipelines/index.js +8 -0
- package/dist/core/pipelines/index.js.map +1 -0
- package/dist/core/pipelines/parse-contract.d.ts +10 -0
- package/dist/core/pipelines/parse-contract.d.ts.map +1 -0
- package/dist/core/pipelines/parse-contract.js +105 -0
- package/dist/core/pipelines/parse-contract.js.map +1 -0
- package/dist/core/pipelines/run-state.d.ts +26 -0
- package/dist/core/pipelines/run-state.d.ts.map +1 -0
- package/dist/core/pipelines/run-state.js +135 -0
- package/dist/core/pipelines/run-state.js.map +1 -0
- package/dist/core/pipelines/session-pipeline-run.d.ts +6 -0
- package/dist/core/pipelines/session-pipeline-run.d.ts.map +1 -0
- package/dist/core/pipelines/session-pipeline-run.js +18 -0
- package/dist/core/pipelines/session-pipeline-run.js.map +1 -0
- package/dist/core/pipelines/types.d.ts +91 -0
- package/dist/core/pipelines/types.d.ts.map +1 -0
- package/dist/core/pipelines/types.js +44 -0
- package/dist/core/pipelines/types.js.map +1 -0
- package/dist/core/reflection-controller.d.ts +2 -0
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +53 -30
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/resource-loader.d.ts +21 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +45 -18
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +3 -0
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +49 -1
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js +2 -0
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +43 -9
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt-builder.js +1 -1
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +30 -22
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/task-projection.d.ts +2 -0
- package/dist/core/tasks/task-projection.d.ts.map +1 -1
- package/dist/core/tasks/task-projection.js +1 -0
- package/dist/core/tasks/task-projection.js.map +1 -1
- package/dist/core/tasks/task-state.d.ts.map +1 -1
- package/dist/core/tasks/task-state.js +6 -1
- package/dist/core/tasks/task-state.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +11 -3
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +9 -3
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +47 -5
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/goal.d.ts +16 -1
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +14 -2
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +5 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +33 -2
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/pipeline.d.ts +35 -0
- package/dist/core/tools/pipeline.d.ts.map +1 -0
- package/dist/core/tools/pipeline.js +203 -0
- package/dist/core/tools/pipeline.js.map +1 -0
- package/dist/core/tools/skill-audit.d.ts.map +1 -1
- package/dist/core/tools/skill-audit.js +2 -1
- package/dist/core/tools/skill-audit.js.map +1 -1
- package/dist/core/tools/skill.d.ts.map +1 -1
- package/dist/core/tools/skill.js +2 -1
- package/dist/core/tools/skill.js.map +1 -1
- package/dist/core/tools/skillify.d.ts.map +1 -1
- package/dist/core/tools/skillify.js +3 -1
- package/dist/core/tools/skillify.js.map +1 -1
- package/dist/core/tools/task-steps.d.ts +1 -1
- package/dist/core/tools/task-steps.d.ts.map +1 -1
- package/dist/core/tools/task-steps.js +9 -0
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tool-task.d.ts.map +1 -1
- package/dist/core/tools/tool-task.js +5 -1
- package/dist/core/tools/tool-task.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +1 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +66 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +6 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +20 -1
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts +4 -0
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +96 -7
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +8 -10
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/key-handlers.d.ts +1 -0
- package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/key-handlers.js +2 -1
- package/dist/modes/interactive/key-handlers.js.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.js +12 -0
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
- package/docs/extensions.md +7 -5
- package/docs/harness-architecture.md +3 -4
- package/docs/keybindings.md +3 -2
- package/docs/quickstart.md +4 -4
- package/docs/sdk.md +3 -1
- package/docs/settings.md +16 -2
- package/docs/task-steps.md +1 -0
- package/docs/usage.md +6 -7
- package/docs/worker-profiles.md +1 -1
- package/docs/worktree-sync.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/07-context-files.ts +5 -2
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Static, Type } from "typebox";
|
|
2
|
+
import type { BackgroundToolTaskRef } from "../background-tool-task-controller.ts";
|
|
3
|
+
import type { ToolDefinition } from "../extensions/types.ts";
|
|
4
|
+
import type { GoalState } from "../goals/goal-state.ts";
|
|
5
|
+
import type { OpenTaskStepRef } from "../goals/goal-tool-core.ts";
|
|
6
|
+
import { type PipelineRun } from "../pipelines/index.ts";
|
|
7
|
+
declare const pipelineSchema: Type.TObject<{
|
|
8
|
+
action: Type.TUnion<[Type.TLiteral<"list">, Type.TLiteral<"start">, Type.TLiteral<"status">, Type.TLiteral<"increment">, Type.TLiteral<"abandon">]>;
|
|
9
|
+
name: Type.TOptional<Type.TString>;
|
|
10
|
+
runId: Type.TOptional<Type.TString>;
|
|
11
|
+
goalId: Type.TOptional<Type.TString>;
|
|
12
|
+
}>;
|
|
13
|
+
export type PipelineToolInput = Static<typeof pipelineSchema>;
|
|
14
|
+
export type PipelineToolAction = PipelineToolInput["action"];
|
|
15
|
+
export interface PipelineToolDetails {
|
|
16
|
+
action: PipelineToolAction;
|
|
17
|
+
applied: boolean;
|
|
18
|
+
error?: string;
|
|
19
|
+
run?: PipelineRun;
|
|
20
|
+
definitionName?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PipelineToolDependencies {
|
|
23
|
+
cwd: () => string;
|
|
24
|
+
agentPipelinesDir: () => string;
|
|
25
|
+
getPipelineRun: () => PipelineRun | undefined;
|
|
26
|
+
savePipelineRun: (run: PipelineRun) => void;
|
|
27
|
+
getGoalState?: () => GoalState | undefined;
|
|
28
|
+
getOpenTaskSteps?: () => readonly OpenTaskStepRef[];
|
|
29
|
+
getBackgroundToolTasks?: () => readonly BackgroundToolTaskRef[];
|
|
30
|
+
now?: () => string;
|
|
31
|
+
createRunId?: () => string;
|
|
32
|
+
}
|
|
33
|
+
export declare function createPipelineToolDefinition(deps: PipelineToolDependencies): ToolDefinition;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/core/tools/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAcN,KAAK,WAAW,EAEhB,MAAM,uBAAuB,CAAC;AAO/B,QAAA,MAAM,cAAc;;;;;EAqBnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACxC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,cAAc,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;IAC9C,eAAe,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,SAAS,GAAG,SAAS,CAAC;IAC3C,gBAAgB,CAAC,EAAE,MAAM,SAAS,eAAe,EAAE,CAAC;IACpD,sBAAsB,CAAC,EAAE,MAAM,SAAS,qBAAqB,EAAE,CAAC;IAChE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B;AAwED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,wBAAwB,GAAG,cAAc,CAuI3F"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { createWorkRunId } from "../../utils/work-directory.js";
|
|
3
|
+
import { abandonPipelineRun, assembleStageContext, createPipelineRunRoot, discoverPipelineDefinitions, findActivePipelineRun, findPipelineDefinition, formatPipelineContext, incrementPipelineRun, instantiatePipelineRun, isPipelineRunActive, loadPipelineDefinition, loadPipelineRunById, scanPipelineRun, } from "../pipelines/index.js";
|
|
4
|
+
import { emptyOrchestrationCall, renderOrchestrationToolResult, } from "./orchestration-panel.js";
|
|
5
|
+
const pipelineSchema = Type.Object({
|
|
6
|
+
action: Type.Union([
|
|
7
|
+
Type.Literal("list"),
|
|
8
|
+
Type.Literal("start"),
|
|
9
|
+
Type.Literal("status"),
|
|
10
|
+
Type.Literal("increment"),
|
|
11
|
+
Type.Literal("abandon"),
|
|
12
|
+
], { description: "list definitions; start a run; status from output/; increment current; abandon." }),
|
|
13
|
+
name: Type.Optional(Type.String({ minLength: 1, maxLength: 64, description: "Definition name for start." })),
|
|
14
|
+
runId: Type.Optional(Type.String({ minLength: 1, maxLength: 128, description: "Run id. Defaults to the active run." })),
|
|
15
|
+
goalId: Type.Optional(Type.String({ minLength: 1, maxLength: 128, description: "Optional goal to join on start." })),
|
|
16
|
+
}, { additionalProperties: false });
|
|
17
|
+
function errorResult(action, error, run) {
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: "text", text: `pipeline ${action} failed: ${error}` }],
|
|
20
|
+
details: { action, applied: false, error, run },
|
|
21
|
+
isError: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function resolveRun(deps, runId) {
|
|
25
|
+
if (runId?.trim())
|
|
26
|
+
return loadPipelineRunById(deps.cwd(), runId.trim());
|
|
27
|
+
return deps.getPipelineRun() ?? findActivePipelineRun(deps.cwd());
|
|
28
|
+
}
|
|
29
|
+
function resolveDefinition(deps, run) {
|
|
30
|
+
return (loadPipelineDefinition(run.definitionPath) ??
|
|
31
|
+
findPipelineDefinition({ agentPipelinesDir: deps.agentPipelinesDir(), cwd: deps.cwd() }, run.pipelineName));
|
|
32
|
+
}
|
|
33
|
+
function formatDefinitionList(definitions, active) {
|
|
34
|
+
if (definitions.length === 0) {
|
|
35
|
+
return "No pipeline definitions. Put a numbered-stage workspace in .pi/pipelines/ or ~/.pi/agent/pipelines/.";
|
|
36
|
+
}
|
|
37
|
+
const lines = definitions.map((definition) => {
|
|
38
|
+
const stages = definition.stages.map((stage) => stage.id).join(", ");
|
|
39
|
+
return `- ${definition.name} (${definition.form}, ${definition.stages.length} stages: ${stages})`;
|
|
40
|
+
});
|
|
41
|
+
if (active) {
|
|
42
|
+
lines.unshift(`Active run ${active.runId}: ${active.pipelineName} @ ${active.currentStageId} (${active.status}).`);
|
|
43
|
+
}
|
|
44
|
+
return `Pipelines:\n${lines.join("\n")}`;
|
|
45
|
+
}
|
|
46
|
+
function formatStatus(definition, run) {
|
|
47
|
+
const scans = scanPipelineRun(definition, run);
|
|
48
|
+
const lines = [
|
|
49
|
+
`Pipeline '${definition.name}' run ${run.runId} ${run.status}. Current stage: ${run.currentStageId}.`,
|
|
50
|
+
...scans.map((scan) => {
|
|
51
|
+
const mark = scan.status === "complete" ? "x" : " ";
|
|
52
|
+
const files = scan.outputFiles.length > 0 ? ` (${scan.outputFiles.join(", ")})` : "";
|
|
53
|
+
return `- [${mark}] ${scan.stageId}${files}`;
|
|
54
|
+
}),
|
|
55
|
+
];
|
|
56
|
+
if (run.goalId)
|
|
57
|
+
lines.push(`Joined goal: ${run.goalId}.`);
|
|
58
|
+
return lines.join("\n");
|
|
59
|
+
}
|
|
60
|
+
function pipelinePanel(details) {
|
|
61
|
+
const run = details?.run;
|
|
62
|
+
if (!run) {
|
|
63
|
+
return {
|
|
64
|
+
label: "pipeline",
|
|
65
|
+
action: details?.action,
|
|
66
|
+
status: details?.error ? "error" : "idle",
|
|
67
|
+
emptyText: details?.error ?? "No pipeline run.",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
label: "pipeline",
|
|
72
|
+
action: details.action,
|
|
73
|
+
status: run.status === "completed" ? "success" : run.status === "abandoned" || details.error ? "warning" : "running",
|
|
74
|
+
summary: [`${run.pipelineName}`, run.currentStageId, run.status],
|
|
75
|
+
emptyText: details.error,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function createPipelineToolDefinition(deps) {
|
|
79
|
+
const now = deps.now ?? (() => new Date().toISOString());
|
|
80
|
+
return {
|
|
81
|
+
name: "pipeline",
|
|
82
|
+
label: "Pipeline",
|
|
83
|
+
description: "Run an ICM folder pipeline: numbered stages, load only the current contract, increment when output/ has files.",
|
|
84
|
+
promptSnippet: "Walk a folder pipeline one stage at a time.",
|
|
85
|
+
promptGuidelines: [
|
|
86
|
+
"Use for repeating sequential workflows with stage folders. Status is output/ files, not chat memory.",
|
|
87
|
+
"increment completes the current stage then starts the next. Write outputs first. No Review-now latch.",
|
|
88
|
+
"Use task_steps advance for checklists, goal increment for requirements, delegate for concurrent work.",
|
|
89
|
+
],
|
|
90
|
+
parameters: pipelineSchema,
|
|
91
|
+
renderShell: "self",
|
|
92
|
+
renderCall() {
|
|
93
|
+
return emptyOrchestrationCall();
|
|
94
|
+
},
|
|
95
|
+
renderResult(result, { expanded, isPartial }, theme) {
|
|
96
|
+
const details = result.details;
|
|
97
|
+
return renderOrchestrationToolResult(theme, pipelinePanel(details), {
|
|
98
|
+
isPartial,
|
|
99
|
+
collapse: !expanded && details?.applied === true,
|
|
100
|
+
expanded: true,
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
async execute(_toolCallId, input) {
|
|
104
|
+
const timestamp = now();
|
|
105
|
+
const discoverOpts = { agentPipelinesDir: deps.agentPipelinesDir(), cwd: deps.cwd() };
|
|
106
|
+
try {
|
|
107
|
+
if (input.action === "list") {
|
|
108
|
+
const definitions = discoverPipelineDefinitions(discoverOpts);
|
|
109
|
+
const active = resolveRun(deps, input.runId);
|
|
110
|
+
return {
|
|
111
|
+
content: [{ type: "text", text: formatDefinitionList(definitions, active) }],
|
|
112
|
+
details: { action: "list", applied: false, run: active },
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (input.action === "start") {
|
|
116
|
+
if (!input.name?.trim())
|
|
117
|
+
return errorResult("start", "start requires name.");
|
|
118
|
+
const definition = findPipelineDefinition(discoverOpts, input.name);
|
|
119
|
+
if (!definition) {
|
|
120
|
+
return errorResult("start", `No pipeline definition named '${input.name.trim()}'.`);
|
|
121
|
+
}
|
|
122
|
+
const existing = deps.getPipelineRun();
|
|
123
|
+
if (existing && isPipelineRunActive(existing)) {
|
|
124
|
+
return errorResult("start", `An active run '${existing.runId}' already exists. Increment or abandon it first.`, existing);
|
|
125
|
+
}
|
|
126
|
+
const runId = deps.createRunId?.() ?? createWorkRunId();
|
|
127
|
+
const run = instantiatePipelineRun({
|
|
128
|
+
definition,
|
|
129
|
+
runId,
|
|
130
|
+
runRoot: createPipelineRunRoot(deps.cwd(), runId),
|
|
131
|
+
goalId: input.goalId?.trim() || deps.getGoalState?.()?.goalId,
|
|
132
|
+
now: timestamp,
|
|
133
|
+
});
|
|
134
|
+
deps.savePipelineRun(run);
|
|
135
|
+
const stage = definition.stages[0];
|
|
136
|
+
const assembled = assembleStageContext(definition, run, stage);
|
|
137
|
+
const text = [
|
|
138
|
+
`pipeline start recorded. Run ${run.runId} at ${stage.id}.`,
|
|
139
|
+
formatPipelineContext(definition, run, assembled),
|
|
140
|
+
].join("\n");
|
|
141
|
+
return {
|
|
142
|
+
content: [{ type: "text", text }],
|
|
143
|
+
details: {
|
|
144
|
+
action: "start",
|
|
145
|
+
applied: true,
|
|
146
|
+
run,
|
|
147
|
+
definitionName: definition.name,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const current = resolveRun(deps, input.runId);
|
|
152
|
+
if (!current)
|
|
153
|
+
return errorResult(input.action, "No active pipeline run. Use start first.");
|
|
154
|
+
const definition = resolveDefinition(deps, current);
|
|
155
|
+
if (!definition) {
|
|
156
|
+
return errorResult(input.action, `Pipeline definition '${current.pipelineName}' is missing.`, current);
|
|
157
|
+
}
|
|
158
|
+
if (input.action === "status") {
|
|
159
|
+
const assembled = assembleStageContext(definition, current);
|
|
160
|
+
return {
|
|
161
|
+
content: [
|
|
162
|
+
{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: `${formatStatus(definition, current)}\n${formatPipelineContext(definition, current, assembled)}`,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
details: { action: "status", applied: false, run: current },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (input.action === "abandon") {
|
|
171
|
+
const run = abandonPipelineRun(current, timestamp);
|
|
172
|
+
deps.savePipelineRun(run);
|
|
173
|
+
return {
|
|
174
|
+
content: [
|
|
175
|
+
{ type: "text", text: `pipeline abandon recorded. Run ${run.runId} is abandoned.` },
|
|
176
|
+
],
|
|
177
|
+
details: { action: "abandon", applied: true, run },
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const advanced = incrementPipelineRun(definition, current, timestamp, {
|
|
181
|
+
goal: deps.getGoalState?.(),
|
|
182
|
+
openTaskSteps: deps.getOpenTaskSteps?.(),
|
|
183
|
+
backgroundToolTasks: deps.getBackgroundToolTasks?.(),
|
|
184
|
+
});
|
|
185
|
+
deps.savePipelineRun(advanced.run);
|
|
186
|
+
const assembled = assembleStageContext(definition, advanced.run);
|
|
187
|
+
return {
|
|
188
|
+
content: [
|
|
189
|
+
{
|
|
190
|
+
type: "text",
|
|
191
|
+
text: `pipeline increment recorded. ${advanced.result.detail}\n${formatPipelineContext(definition, advanced.run, assembled)}`,
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
details: { action: "increment", applied: true, run: advanced.run },
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return errorResult(input.action, error instanceof Error ? error.message : String(error), deps.getPipelineRun());
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/core/tools/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAKhE,OAAO,EACN,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EAGnB,eAAe,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACN,sBAAsB,EAEtB,6BAA6B,GAC7B,MAAM,0BAA0B,CAAC;AAElC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CACjC;IACC,MAAM,EAAE,IAAI,CAAC,KAAK,CACjB;QACC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;KACvB,EACD,EAAE,WAAW,EAAE,iFAAiF,EAAE,CAClG;IACD,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAC;IAC5G,KAAK,EAAE,IAAI,CAAC,QAAQ,CACnB,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC,CACjG;IACD,MAAM,EAAE,IAAI,CAAC,QAAQ,CACpB,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC,CAC7F;CACD,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AAyBF,SAAS,WAAW,CAAC,MAA0B,EAAE,KAAa,EAAE,GAAiB;IAChF,OAAO;QACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,MAAM,YAAY,KAAK,EAAE,EAAE,CAAC;QACjF,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAgC;QAC7E,OAAO,EAAE,IAAa;KACtB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAA8B,EAAE,KAAyB;IAC5E,IAAI,KAAK,EAAE,IAAI,EAAE;QAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,cAAc,EAAE,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA8B,EAAE,GAAgB;IAC1E,OAAO,CACN,sBAAsB,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,sBAAsB,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,YAAY,CAAC,CAC1G,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,WAA0C,EAAE,MAAoB;IAC7F,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,sGAAsG,CAAC;IAC/G,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,OAAO,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,MAAM,YAAY,MAAM,GAAG,CAAC;IACnG,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,EAAE,CAAC;QACZ,KAAK,CAAC,OAAO,CACZ,cAAc,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,YAAY,MAAM,MAAM,CAAC,cAAc,KAAK,MAAM,CAAC,MAAM,IAAI,CACnG,CAAC;IACH,CAAC;IACD,OAAO,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,UAA8B,EAAE,GAAgB;IACrE,MAAM,KAAK,GAAG,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG;QACb,aAAa,UAAU,CAAC,IAAI,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,oBAAoB,GAAG,CAAC,cAAc,GAAG;QACrG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,OAAO,MAAM,IAAI,KAAK,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;QAC9C,CAAC,CAAC;KACF,CAAC;IACF,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,OAAwC;IAC9D,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,CAAC;IACzB,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,OAAO;YACN,KAAK,EAAE,UAAU;YACjB,MAAM,EAAE,OAAO,EAAE,MAAM;YACvB,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACzC,SAAS,EAAE,OAAO,EAAE,KAAK,IAAI,kBAAkB;SAC/C,CAAC;IACH,CAAC;IACD,OAAO;QACN,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EACL,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC7G,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC;QAChE,SAAS,EAAE,OAAO,CAAC,KAAK;KACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAA8B;IAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,OAAO;QACN,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EACV,gHAAgH;QACjH,aAAa,EAAE,6CAA6C;QAC5D,gBAAgB,EAAE;YACjB,sGAAsG;YACtG,uGAAuG;YACvG,uGAAuG;SACvG;QACD,UAAU,EAAE,cAAc;QAC1B,WAAW,EAAE,MAAM;QACnB,UAAU;YACT,OAAO,sBAAsB,EAAE,CAAC;QACjC,CAAC;QACD,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,KAAK;YAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAA0C,CAAC;YAClE,OAAO,6BAA6B,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBACnE,SAAS;gBACT,QAAQ,EAAE,CAAC,QAAQ,IAAI,OAAO,EAAE,OAAO,KAAK,IAAI;gBAChD,QAAQ,EAAE,IAAI;aACd,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAwB;YAClD,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACtF,IAAI,CAAC;gBACJ,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC7B,MAAM,WAAW,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;oBAC9D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC7C,OAAO;wBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;wBACrF,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAgC;qBACtF,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;oBAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;wBAAE,OAAO,WAAW,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;oBAC7E,MAAM,UAAU,GAAG,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACpE,IAAI,CAAC,UAAU,EAAE,CAAC;wBACjB,OAAO,WAAW,CAAC,OAAO,EAAE,iCAAiC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACrF,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBACvC,IAAI,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC/C,OAAO,WAAW,CACjB,OAAO,EACP,kBAAkB,QAAQ,CAAC,KAAK,kDAAkD,EAClF,QAAQ,CACR,CAAC;oBACH,CAAC;oBACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,eAAe,EAAE,CAAC;oBACxD,MAAM,GAAG,GAAG,sBAAsB,CAAC;wBAClC,UAAU;wBACV,KAAK;wBACL,OAAO,EAAE,qBAAqB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC;wBACjD,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,MAAM;wBAC7D,GAAG,EAAE,SAAS;qBACd,CAAC,CAAC;oBACH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;oBACpC,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC/D,MAAM,IAAI,GAAG;wBACZ,gCAAgC,GAAG,CAAC,KAAK,OAAO,KAAK,CAAC,EAAE,GAAG;wBAC3D,qBAAqB,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC;qBACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACb,OAAO;wBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;wBAC1C,OAAO,EAAE;4BACR,MAAM,EAAE,OAAO;4BACf,OAAO,EAAE,IAAI;4BACb,GAAG;4BACH,cAAc,EAAE,UAAU,CAAC,IAAI;yBACD;qBAC/B,CAAC;gBACH,CAAC;gBAED,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAI,CAAC,OAAO;oBAAE,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAC;gBAC3F,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACpD,IAAI,CAAC,UAAU,EAAE,CAAC;oBACjB,OAAO,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,wBAAwB,OAAO,CAAC,YAAY,eAAe,EAAE,OAAO,CAAC,CAAC;gBACxG,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAC5D,OAAO;wBACN,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,qBAAqB,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE;6BACtG;yBACD;wBACD,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAgC;qBACzF,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAChC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBACnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;oBAC1B,OAAO;wBACN,OAAO,EAAE;4BACR,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,kCAAkC,GAAG,CAAC,KAAK,gBAAgB,EAAE;yBAC5F;wBACD,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAgC;qBAChF,CAAC;gBACH,CAAC;gBAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE;oBACrE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE;oBAC3B,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBACxC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,EAAE,EAAE;iBACpD,CAAC,CAAC;gBACH,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACnC,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACjE,OAAO;oBACN,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,gCAAgC,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,qBAAqB,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE;yBAC7H;qBACD;oBACD,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAgC;iBAChG,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,WAAW,CACjB,KAAK,CAAC,MAAM,EACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,IAAI,CAAC,cAAc,EAAE,CACrB,CAAC;YACH,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport { createWorkRunId } from \"../../utils/work-directory.ts\";\nimport type { BackgroundToolTaskRef } from \"../background-tool-task-controller.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { GoalState } from \"../goals/goal-state.ts\";\nimport type { OpenTaskStepRef } from \"../goals/goal-tool-core.ts\";\nimport {\n\tabandonPipelineRun,\n\tassembleStageContext,\n\tcreatePipelineRunRoot,\n\tdiscoverPipelineDefinitions,\n\tfindActivePipelineRun,\n\tfindPipelineDefinition,\n\tformatPipelineContext,\n\tincrementPipelineRun,\n\tinstantiatePipelineRun,\n\tisPipelineRunActive,\n\tloadPipelineDefinition,\n\tloadPipelineRunById,\n\ttype PipelineDefinition,\n\ttype PipelineRun,\n\tscanPipelineRun,\n} from \"../pipelines/index.ts\";\nimport {\n\temptyOrchestrationCall,\n\ttype OrchestrationPanelModel,\n\trenderOrchestrationToolResult,\n} from \"./orchestration-panel.ts\";\n\nconst pipelineSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"list\"),\n\t\t\t\tType.Literal(\"start\"),\n\t\t\t\tType.Literal(\"status\"),\n\t\t\t\tType.Literal(\"increment\"),\n\t\t\t\tType.Literal(\"abandon\"),\n\t\t\t],\n\t\t\t{ description: \"list definitions; start a run; status from output/; increment current; abandon.\" },\n\t\t),\n\t\tname: Type.Optional(Type.String({ minLength: 1, maxLength: 64, description: \"Definition name for start.\" })),\n\t\trunId: Type.Optional(\n\t\t\tType.String({ minLength: 1, maxLength: 128, description: \"Run id. Defaults to the active run.\" }),\n\t\t),\n\t\tgoalId: Type.Optional(\n\t\t\tType.String({ minLength: 1, maxLength: 128, description: \"Optional goal to join on start.\" }),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type PipelineToolInput = Static<typeof pipelineSchema>;\nexport type PipelineToolAction = PipelineToolInput[\"action\"];\n\nexport interface PipelineToolDetails {\n\taction: PipelineToolAction;\n\tapplied: boolean;\n\terror?: string;\n\trun?: PipelineRun;\n\tdefinitionName?: string;\n}\n\nexport interface PipelineToolDependencies {\n\tcwd: () => string;\n\tagentPipelinesDir: () => string;\n\tgetPipelineRun: () => PipelineRun | undefined;\n\tsavePipelineRun: (run: PipelineRun) => void;\n\tgetGoalState?: () => GoalState | undefined;\n\tgetOpenTaskSteps?: () => readonly OpenTaskStepRef[];\n\tgetBackgroundToolTasks?: () => readonly BackgroundToolTaskRef[];\n\tnow?: () => string;\n\tcreateRunId?: () => string;\n}\n\nfunction errorResult(action: PipelineToolAction, error: string, run?: PipelineRun) {\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text: `pipeline ${action} failed: ${error}` }],\n\t\tdetails: { action, applied: false, error, run } satisfies PipelineToolDetails,\n\t\tisError: true as const,\n\t};\n}\n\nfunction resolveRun(deps: PipelineToolDependencies, runId: string | undefined): PipelineRun | undefined {\n\tif (runId?.trim()) return loadPipelineRunById(deps.cwd(), runId.trim());\n\treturn deps.getPipelineRun() ?? findActivePipelineRun(deps.cwd());\n}\n\nfunction resolveDefinition(deps: PipelineToolDependencies, run: PipelineRun): PipelineDefinition | undefined {\n\treturn (\n\t\tloadPipelineDefinition(run.definitionPath) ??\n\t\tfindPipelineDefinition({ agentPipelinesDir: deps.agentPipelinesDir(), cwd: deps.cwd() }, run.pipelineName)\n\t);\n}\n\nfunction formatDefinitionList(definitions: readonly PipelineDefinition[], active?: PipelineRun): string {\n\tif (definitions.length === 0) {\n\t\treturn \"No pipeline definitions. Put a numbered-stage workspace in .pi/pipelines/ or ~/.pi/agent/pipelines/.\";\n\t}\n\tconst lines = definitions.map((definition) => {\n\t\tconst stages = definition.stages.map((stage) => stage.id).join(\", \");\n\t\treturn `- ${definition.name} (${definition.form}, ${definition.stages.length} stages: ${stages})`;\n\t});\n\tif (active) {\n\t\tlines.unshift(\n\t\t\t`Active run ${active.runId}: ${active.pipelineName} @ ${active.currentStageId} (${active.status}).`,\n\t\t);\n\t}\n\treturn `Pipelines:\\n${lines.join(\"\\n\")}`;\n}\n\nfunction formatStatus(definition: PipelineDefinition, run: PipelineRun): string {\n\tconst scans = scanPipelineRun(definition, run);\n\tconst lines = [\n\t\t`Pipeline '${definition.name}' run ${run.runId} ${run.status}. Current stage: ${run.currentStageId}.`,\n\t\t...scans.map((scan) => {\n\t\t\tconst mark = scan.status === \"complete\" ? \"x\" : \" \";\n\t\t\tconst files = scan.outputFiles.length > 0 ? ` (${scan.outputFiles.join(\", \")})` : \"\";\n\t\t\treturn `- [${mark}] ${scan.stageId}${files}`;\n\t\t}),\n\t];\n\tif (run.goalId) lines.push(`Joined goal: ${run.goalId}.`);\n\treturn lines.join(\"\\n\");\n}\n\nfunction pipelinePanel(details: PipelineToolDetails | undefined): OrchestrationPanelModel {\n\tconst run = details?.run;\n\tif (!run) {\n\t\treturn {\n\t\t\tlabel: \"pipeline\",\n\t\t\taction: details?.action,\n\t\t\tstatus: details?.error ? \"error\" : \"idle\",\n\t\t\temptyText: details?.error ?? \"No pipeline run.\",\n\t\t};\n\t}\n\treturn {\n\t\tlabel: \"pipeline\",\n\t\taction: details.action,\n\t\tstatus:\n\t\t\trun.status === \"completed\" ? \"success\" : run.status === \"abandoned\" || details.error ? \"warning\" : \"running\",\n\t\tsummary: [`${run.pipelineName}`, run.currentStageId, run.status],\n\t\temptyText: details.error,\n\t};\n}\n\nexport function createPipelineToolDefinition(deps: PipelineToolDependencies): ToolDefinition {\n\tconst now = deps.now ?? (() => new Date().toISOString());\n\treturn {\n\t\tname: \"pipeline\",\n\t\tlabel: \"Pipeline\",\n\t\tdescription:\n\t\t\t\"Run an ICM folder pipeline: numbered stages, load only the current contract, increment when output/ has files.\",\n\t\tpromptSnippet: \"Walk a folder pipeline one stage at a time.\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use for repeating sequential workflows with stage folders. Status is output/ files, not chat memory.\",\n\t\t\t\"increment completes the current stage then starts the next. Write outputs first. No Review-now latch.\",\n\t\t\t\"Use task_steps advance for checklists, goal increment for requirements, delegate for concurrent work.\",\n\t\t],\n\t\tparameters: pipelineSchema,\n\t\trenderShell: \"self\",\n\t\trenderCall() {\n\t\t\treturn emptyOrchestrationCall();\n\t\t},\n\t\trenderResult(result, { expanded, isPartial }, theme) {\n\t\t\tconst details = result.details as PipelineToolDetails | undefined;\n\t\t\treturn renderOrchestrationToolResult(theme, pipelinePanel(details), {\n\t\t\t\tisPartial,\n\t\t\t\tcollapse: !expanded && details?.applied === true,\n\t\t\t\texpanded: true,\n\t\t\t});\n\t\t},\n\t\tasync execute(_toolCallId, input: PipelineToolInput) {\n\t\t\tconst timestamp = now();\n\t\t\tconst discoverOpts = { agentPipelinesDir: deps.agentPipelinesDir(), cwd: deps.cwd() };\n\t\t\ttry {\n\t\t\t\tif (input.action === \"list\") {\n\t\t\t\t\tconst definitions = discoverPipelineDefinitions(discoverOpts);\n\t\t\t\t\tconst active = resolveRun(deps, input.runId);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: formatDefinitionList(definitions, active) }],\n\t\t\t\t\t\tdetails: { action: \"list\", applied: false, run: active } satisfies PipelineToolDetails,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (input.action === \"start\") {\n\t\t\t\t\tif (!input.name?.trim()) return errorResult(\"start\", \"start requires name.\");\n\t\t\t\t\tconst definition = findPipelineDefinition(discoverOpts, input.name);\n\t\t\t\t\tif (!definition) {\n\t\t\t\t\t\treturn errorResult(\"start\", `No pipeline definition named '${input.name.trim()}'.`);\n\t\t\t\t\t}\n\t\t\t\t\tconst existing = deps.getPipelineRun();\n\t\t\t\t\tif (existing && isPipelineRunActive(existing)) {\n\t\t\t\t\t\treturn errorResult(\n\t\t\t\t\t\t\t\"start\",\n\t\t\t\t\t\t\t`An active run '${existing.runId}' already exists. Increment or abandon it first.`,\n\t\t\t\t\t\t\texisting,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst runId = deps.createRunId?.() ?? createWorkRunId();\n\t\t\t\t\tconst run = instantiatePipelineRun({\n\t\t\t\t\t\tdefinition,\n\t\t\t\t\t\trunId,\n\t\t\t\t\t\trunRoot: createPipelineRunRoot(deps.cwd(), runId),\n\t\t\t\t\t\tgoalId: input.goalId?.trim() || deps.getGoalState?.()?.goalId,\n\t\t\t\t\t\tnow: timestamp,\n\t\t\t\t\t});\n\t\t\t\t\tdeps.savePipelineRun(run);\n\t\t\t\t\tconst stage = definition.stages[0]!;\n\t\t\t\t\tconst assembled = assembleStageContext(definition, run, stage);\n\t\t\t\t\tconst text = [\n\t\t\t\t\t\t`pipeline start recorded. Run ${run.runId} at ${stage.id}.`,\n\t\t\t\t\t\tformatPipelineContext(definition, run, assembled),\n\t\t\t\t\t].join(\"\\n\");\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\taction: \"start\",\n\t\t\t\t\t\t\tapplied: true,\n\t\t\t\t\t\t\trun,\n\t\t\t\t\t\t\tdefinitionName: definition.name,\n\t\t\t\t\t\t} satisfies PipelineToolDetails,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst current = resolveRun(deps, input.runId);\n\t\t\t\tif (!current) return errorResult(input.action, \"No active pipeline run. Use start first.\");\n\t\t\t\tconst definition = resolveDefinition(deps, current);\n\t\t\t\tif (!definition) {\n\t\t\t\t\treturn errorResult(input.action, `Pipeline definition '${current.pipelineName}' is missing.`, current);\n\t\t\t\t}\n\n\t\t\t\tif (input.action === \"status\") {\n\t\t\t\t\tconst assembled = assembleStageContext(definition, current);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: `${formatStatus(definition, current)}\\n${formatPipelineContext(definition, current, assembled)}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"status\", applied: false, run: current } satisfies PipelineToolDetails,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (input.action === \"abandon\") {\n\t\t\t\t\tconst run = abandonPipelineRun(current, timestamp);\n\t\t\t\t\tdeps.savePipelineRun(run);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{ type: \"text\" as const, text: `pipeline abandon recorded. Run ${run.runId} is abandoned.` },\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"abandon\", applied: true, run } satisfies PipelineToolDetails,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tconst advanced = incrementPipelineRun(definition, current, timestamp, {\n\t\t\t\t\tgoal: deps.getGoalState?.(),\n\t\t\t\t\topenTaskSteps: deps.getOpenTaskSteps?.(),\n\t\t\t\t\tbackgroundToolTasks: deps.getBackgroundToolTasks?.(),\n\t\t\t\t});\n\t\t\t\tdeps.savePipelineRun(advanced.run);\n\t\t\t\tconst assembled = assembleStageContext(definition, advanced.run);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\ttext: `pipeline increment recorded. ${advanced.result.detail}\\n${formatPipelineContext(definition, advanced.run, assembled)}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { action: \"increment\", applied: true, run: advanced.run } satisfies PipelineToolDetails,\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\treturn errorResult(\n\t\t\t\t\tinput.action,\n\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\tdeps.getPipelineRun(),\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-audit.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAY7D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAU/C;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQxD;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,cAAc,EAAE,KAAK,CAAC;QACrB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,mBAAmB,EAAE,KAAK,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE,gBAAgB,CAqFlB;AAED,QAAA,MAAM,gBAAgB;;;;EAIpB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;CAAG;AAEzC,wBAAgB,8BAA8B,CAC7C,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,qBAAqB,GAC9B,cAAc,CAAC,OAAO,gBAAgB,EAAE,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"skill-audit.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAY7D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAU/C;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQxD;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,cAAc,EAAE,KAAK,CAAC;QACrB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,mBAAmB,EAAE,KAAK,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE,gBAAgB,CAqFlB;AAED,QAAA,MAAM,gBAAgB;;;;EAIpB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;CAAG;AAEzC,wBAAgB,8BAA8B,CAC7C,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,qBAAqB,GAC9B,cAAc,CAAC,OAAO,gBAAgB,EAAE,gBAAgB,CAAC,CAyE3D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC,OAAO,gBAAgB,CAAC,CAErH"}
|
|
@@ -119,7 +119,8 @@ const skillAuditSchema = Type.Object({
|
|
|
119
119
|
export function createSkillAuditToolDefinition(cwd, _options) {
|
|
120
120
|
return {
|
|
121
121
|
name: "skill_audit",
|
|
122
|
-
label: "
|
|
122
|
+
label: "Skill Audit",
|
|
123
|
+
toolGroup: "skills",
|
|
123
124
|
description: "Check a draft/new skill for overlap with existing skills before creating it; flags near-duplicate triggers/descriptions via local Jaccard similarity. Read-only: does not write files.",
|
|
124
125
|
promptSnippet: "Audit skill for overlaps",
|
|
125
126
|
promptGuidelines: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/core/tools/skill-audit.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAc,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,GAAG,CACxB,0KAA0K,CAAC,KAAK,CAC/K,GAAG,CACH,CACD,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,OAAO;QACN,GAAG,IAAI,GAAG,CACT,IAAI;aACF,WAAW,EAAE;aACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;aAC7B,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAC/D;KACD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,CAAW,EAAE,CAAW;IAC/C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,IAAI;QAAE,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,YAAY,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;AAC/C,CAAC;AA+BD;;GAEG;AACH,MAAM,UAAU,aAAa,CAC5B,GAAW,EACX,UAAmE;IAEnE,uBAAuB;IACvB,MAAM,MAAM,GAAG,UAAU,CAAC;QACzB,GAAG;QACH,QAAQ,EAAE,WAAW,EAAE;QACvB,UAAU,EAAE,EAAE;QACd,eAAe,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAmB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAY,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,IAAI,EAAE,KAAK,CAAC,QAAQ;QACpB,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,SAAS;QAC1C,QAAQ,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;KACxD,CAAC,CAAC,CAAC;IAEJ,iEAAiE;IACjE,IAAI,UAAU,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,IAAI,aAAa,CAAC;QACnD,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,IAAI,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,QAAQ,CAAC,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;SACxE,CAAC,CAAC;IACJ,CAAC;IAED,mDAAmD;IACnD,MAAM,cAAc,GAAuC,EAAE,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnE,IAAI,UAAU,IAAI,mBAAmB,EAAE,CAAC;gBACvC,MAAM,MAAM,GACX,UAAU,IAAI,GAAG;oBAChB,CAAC,CAAC,gEAAgE;oBAClE,CAAC,CAAC,yEAAyE,CAAC;gBAC9E,cAAc,CAAC,IAAI,CAAC;oBACnB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;oBACjB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;oBACjB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACzC,MAAM;iBACN,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IAE3D,4BAA4B;IAC5B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAE5C,wBAAwB;IACxB,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,UAAU,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC5F,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,eAAe,CAAC,IAAI,CACnB,mBAAmB,cAAc,CAAC,MAAM,6EAA6E,CACrH,CAAC;QACH,CAAC;IACF,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,eAAe,CAAC,IAAI,CACnB,SAAS,cAAc,CAAC,MAAM,uEAAuE,CACrG,CAAC;IACH,CAAC;IAED,OAAO;QACN,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,0CAA0C;QAC9F,cAAc;QACd,mBAAmB,EAAE,EAAE;QACvB,cAAc;QACd,eAAe;KACf,CAAC;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAC1F,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAC/F,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC,CAAC;CACzF,CAAC,CAAC;AAUH,MAAM,UAAU,8BAA8B,CAC7C,GAAW,EACX,QAAgC;IAEhC,OAAO;QACN,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,aAAa;QACpB,WAAW,EACV,wLAAwL;QACzL,aAAa,EAAE,0BAA0B;QACzC,gBAAgB,EAAE;YACjB,2EAA2E;YAC3E,2EAA2E;SAC3E;QACD,UAAU,EAAE,gBAAgB;QAC5B,KAAK,CAAC,OAAO,CACZ,WAAW,EACX,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAmB,EAC3D,OAAqB,EACrB,SAAU,EACV,IAAK;YAKL,MAAM,UAAU,GACf,SAAS,IAAI,gBAAgB;gBAC5B,CAAC,CAAC;oBACA,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,gBAAgB;oBAC7B,IAAI,EAAE,SAAS;iBACf;gBACF,CAAC,CAAC,SAAS,CAAC;YAEd,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAE9C,qCAAqC;YACrC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CACT,gBAAgB,MAAM,CAAC,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,cAAc,CAAC,MAAM,sBAAsB,CACpG,CAAC;YAEF,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;gBACtC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oBAChD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oBAChD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC9F,CAAC;YACF,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACtD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;gBAC1D,CAAC;YACF,CAAC;YAED,IAAI,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACxB,CAAC;YACF,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9E,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YACxE,CAAC;YAED,OAAO;gBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,OAAO,EAAE,MAAM;aACf,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,OAA+B;IAChF,OAAO,kBAAkB,CAAC,8BAA8B,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AACzE,CAAC","sourcesContent":["import type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { loadSkills, type Skill } from \"../skills.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst DUPLICATE_THRESHOLD = 0.55;\n\nconst STOPWORDS = new Set(\n\t\"the a an and or of for to with when use using from into this that skill task work working project agent agents code files file in on by as is are be do not should about\".split(\n\t\t\" \",\n\t),\n);\n\n/**\n * Tokenize text by lowercasing, removing non-alphanumeric chars (except hyphens and colons),\n * splitting on whitespace, and filtering out short tokens and stopwords.\n */\nexport function tokenize(text: string): string[] {\n\treturn [\n\t\t...new Set(\n\t\t\ttext\n\t\t\t\t.toLowerCase()\n\t\t\t\t.replace(/[^a-z0-9:-]+/g, \" \")\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter((token) => token.length >= 3 && !STOPWORDS.has(token)),\n\t\t),\n\t];\n}\n\n/**\n * Calculate Jaccard similarity between two token sets.\n * Jaccard(A, B) = |A ∩ B| / |A ∪ B|\n */\nexport function jaccard(a: string[], b: string[]): number {\n\tif (a.length === 0 || b.length === 0) return 0;\n\tconst setA = new Set(a);\n\tconst setB = new Set(b);\n\tlet intersection = 0;\n\tfor (const item of setA) if (setB.has(item)) intersection++;\n\tconst union = new Set([...a, ...b]).size;\n\treturn union === 0 ? 0 : intersection / union;\n}\n\nexport interface SkillSummary {\n\tname: string;\n\tdescription: string;\n\tpath: string;\n\tscope: string;\n\tkeywords: string[];\n}\n\nexport interface SkillAuditReport {\n\tgeneratedAt: string;\n\tskills: SkillSummary[];\n\tnearDuplicates: Array<{\n\t\ta: string;\n\t\tb: string;\n\t\tsimilarity: number;\n\t\treason: string;\n\t}>;\n\tcompartmentWarnings: Array<{\n\t\tskill: string;\n\t\tpath: string;\n\t\treason: string;\n\t}>;\n\tnameCollisions: Array<{\n\t\tname: string;\n\t\tpaths: string[];\n\t}>;\n\trecommendations?: string[];\n}\n\n/**\n * Audit existing skills for overlap and compare against a draft skill.\n */\nexport function runSkillAudit(\n\tcwd: string,\n\tdraftSkill?: { name?: string; description?: string; body?: string },\n): SkillAuditReport {\n\t// Load existing skills\n\tconst result = loadSkills({\n\t\tcwd,\n\t\tagentDir: getAgentDir(),\n\t\tskillPaths: [],\n\t\tincludeDefaults: true,\n\t});\n\n\tconst skills: SkillSummary[] = result.skills.map((skill: Skill) => ({\n\t\tname: skill.name,\n\t\tdescription: skill.description,\n\t\tpath: skill.filePath,\n\t\tscope: skill.sourceInfo.scope ?? \"unknown\",\n\t\tkeywords: tokenize(`${skill.name} ${skill.description}`),\n\t}));\n\n\t// If a draft skill is provided, add it to the set for comparison\n\tif (draftSkill) {\n\t\tconst draftName = draftSkill.name || \"draft-skill\";\n\t\tconst draftDesc = draftSkill.description || \"\";\n\t\tskills.push({\n\t\t\tname: draftName,\n\t\t\tdescription: draftDesc,\n\t\t\tpath: \"[draft]\",\n\t\t\tscope: \"draft\",\n\t\t\tkeywords: tokenize(`${draftName} ${draftDesc} ${draftSkill.body || \"\"}`),\n\t\t});\n\t}\n\n\t// Find near-duplicates based on Jaccard similarity\n\tconst nearDuplicates: SkillAuditReport[\"nearDuplicates\"] = [];\n\tfor (let i = 0; i < skills.length; i++) {\n\t\tfor (let j = i + 1; j < skills.length; j++) {\n\t\t\tconst similarity = jaccard(skills[i].keywords, skills[j].keywords);\n\t\t\tif (similarity >= DUPLICATE_THRESHOLD) {\n\t\t\t\tconst reason =\n\t\t\t\t\tsimilarity >= 0.9\n\t\t\t\t\t\t? \"90%+ keyword overlap; merge/refine before adding another skill\"\n\t\t\t\t\t\t: \"high trigger/workflow overlap; review for dedup or compartmentalization\";\n\t\t\t\tnearDuplicates.push({\n\t\t\t\t\ta: skills[i].path,\n\t\t\t\t\tb: skills[j].path,\n\t\t\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\t\t\treason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tnearDuplicates.sort((a, b) => b.similarity - a.similarity);\n\n\t// Check for name collisions\n\tconst byName = new Map<string, string[]>();\n\tfor (const skill of skills) {\n\t\tconst existing = byName.get(skill.name) ?? [];\n\t\tbyName.set(skill.name, [...existing, skill.path]);\n\t}\n\tconst nameCollisions = [...byName.entries()]\n\t\t.filter(([, paths]) => paths.length > 1)\n\t\t.map(([name, paths]) => ({ name, paths }));\n\n\t// Build recommendations\n\tconst recommendations: string[] = [];\n\tif (draftSkill && nearDuplicates.length > 0) {\n\t\tconst draftNearDupes = nearDuplicates.filter((d) => d.a === \"[draft]\" || d.b === \"[draft]\");\n\t\tif (draftNearDupes.length > 0) {\n\t\t\trecommendations.push(\n\t\t\t\t`Draft skill has ${draftNearDupes.length} similar existing skill(s). Consider merging or refining the trigger/scope.`,\n\t\t\t);\n\t\t}\n\t}\n\tif (nameCollisions.length > 0) {\n\t\trecommendations.push(\n\t\t\t`Found ${nameCollisions.length} skill name collision(s). Resolve naming conflicts before deployment.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tgeneratedAt: new Date().toISOString(),\n\t\tskills: skills.filter((s) => s.path !== \"[draft]\"), // Don't include draft in final skill list\n\t\tnearDuplicates,\n\t\tcompartmentWarnings: [],\n\t\tnameCollisions,\n\t\trecommendations,\n\t};\n}\n\nconst skillAuditSchema = Type.Object({\n\tdraftName: Type.Optional(Type.String({ description: \"Name of the draft skill to audit\" })),\n\tdraftDescription: Type.Optional(Type.String({ description: \"Description of the draft skill\" })),\n\tdraftBody: Type.Optional(Type.String({ description: \"Body/content of the draft skill\" })),\n});\n\nexport type SkillAuditInput = Static<typeof skillAuditSchema>;\n\nexport interface SkillAuditToolDetails {\n\treportPath?: string;\n}\n\nexport interface SkillAuditToolOptions {}\n\nexport function createSkillAuditToolDefinition(\n\tcwd: string,\n\t_options?: SkillAuditToolOptions,\n): ToolDefinition<typeof skillAuditSchema, SkillAuditReport> {\n\treturn {\n\t\tname: \"skill_audit\",\n\t\tlabel: \"skill audit\",\n\t\tdescription:\n\t\t\t\"Check a draft/new skill for overlap with existing skills before creating it; flags near-duplicate triggers/descriptions via local Jaccard similarity. Read-only: does not write files.\",\n\t\tpromptSnippet: \"Audit skill for overlaps\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skill_audit to check draft skills for conflicts before creating them.\",\n\t\t\t\"Similarity >= 55% indicates potential dedup or compartmentalization work.\",\n\t\t],\n\t\tparameters: skillAuditSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ draftName, draftDescription, draftBody }: SkillAuditInput,\n\t\t\t_signal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillAuditReport;\n\t\t}> {\n\t\t\tconst draftSkill =\n\t\t\t\tdraftName || draftDescription\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: draftName,\n\t\t\t\t\t\t\tdescription: draftDescription,\n\t\t\t\t\t\t\tbody: draftBody,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\n\t\t\tconst report = runSkillAudit(cwd, draftSkill);\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(\n\t\t\t\t`Skill audit: ${report.skills.length} skill(s), ${report.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (report.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlap warnings:\");\n\t\t\t\tfor (const item of report.nearDuplicates.slice(0, 8)) {\n\t\t\t\t\tconst aName = item.a.split(\"/\").pop() || item.a;\n\t\t\t\t\tconst bName = item.b.split(\"/\").pop() || item.b;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${aName} ↔ ${bName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of report.nameCollisions.slice(0, 8)) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} paths`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.recommendations && report.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of report.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nearDuplicates.length === 0 && report.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\nNo overlaps detected. This skill appears to be unique.\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillAuditTool(cwd: string, options?: SkillAuditToolOptions): AgentTool<typeof skillAuditSchema> {\n\treturn wrapToolDefinition(createSkillAuditToolDefinition(cwd, options));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"skill-audit.js","sourceRoot":"","sources":["../../../src/core/tools/skill-audit.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { loadSkills, type Skill } from \"../skills.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst DUPLICATE_THRESHOLD = 0.55;\n\nconst STOPWORDS = new Set(\n\t\"the a an and or of for to with when use using from into this that skill task work working project agent agents code files file in on by as is are be do not should about\".split(\n\t\t\" \",\n\t),\n);\n\n/**\n * Tokenize text by lowercasing, removing non-alphanumeric chars (except hyphens and colons),\n * splitting on whitespace, and filtering out short tokens and stopwords.\n */\nexport function tokenize(text: string): string[] {\n\treturn [\n\t\t...new Set(\n\t\t\ttext\n\t\t\t\t.toLowerCase()\n\t\t\t\t.replace(/[^a-z0-9:-]+/g, \" \")\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter((token) => token.length >= 3 && !STOPWORDS.has(token)),\n\t\t),\n\t];\n}\n\n/**\n * Calculate Jaccard similarity between two token sets.\n * Jaccard(A, B) = |A ∩ B| / |A ∪ B|\n */\nexport function jaccard(a: string[], b: string[]): number {\n\tif (a.length === 0 || b.length === 0) return 0;\n\tconst setA = new Set(a);\n\tconst setB = new Set(b);\n\tlet intersection = 0;\n\tfor (const item of setA) if (setB.has(item)) intersection++;\n\tconst union = new Set([...a, ...b]).size;\n\treturn union === 0 ? 0 : intersection / union;\n}\n\nexport interface SkillSummary {\n\tname: string;\n\tdescription: string;\n\tpath: string;\n\tscope: string;\n\tkeywords: string[];\n}\n\nexport interface SkillAuditReport {\n\tgeneratedAt: string;\n\tskills: SkillSummary[];\n\tnearDuplicates: Array<{\n\t\ta: string;\n\t\tb: string;\n\t\tsimilarity: number;\n\t\treason: string;\n\t}>;\n\tcompartmentWarnings: Array<{\n\t\tskill: string;\n\t\tpath: string;\n\t\treason: string;\n\t}>;\n\tnameCollisions: Array<{\n\t\tname: string;\n\t\tpaths: string[];\n\t}>;\n\trecommendations?: string[];\n}\n\n/**\n * Audit existing skills for overlap and compare against a draft skill.\n */\nexport function runSkillAudit(\n\tcwd: string,\n\tdraftSkill?: { name?: string; description?: string; body?: string },\n): SkillAuditReport {\n\t// Load existing skills\n\tconst result = loadSkills({\n\t\tcwd,\n\t\tagentDir: getAgentDir(),\n\t\tskillPaths: [],\n\t\tincludeDefaults: true,\n\t});\n\n\tconst skills: SkillSummary[] = result.skills.map((skill: Skill) => ({\n\t\tname: skill.name,\n\t\tdescription: skill.description,\n\t\tpath: skill.filePath,\n\t\tscope: skill.sourceInfo.scope ?? \"unknown\",\n\t\tkeywords: tokenize(`${skill.name} ${skill.description}`),\n\t}));\n\n\t// If a draft skill is provided, add it to the set for comparison\n\tif (draftSkill) {\n\t\tconst draftName = draftSkill.name || \"draft-skill\";\n\t\tconst draftDesc = draftSkill.description || \"\";\n\t\tskills.push({\n\t\t\tname: draftName,\n\t\t\tdescription: draftDesc,\n\t\t\tpath: \"[draft]\",\n\t\t\tscope: \"draft\",\n\t\t\tkeywords: tokenize(`${draftName} ${draftDesc} ${draftSkill.body || \"\"}`),\n\t\t});\n\t}\n\n\t// Find near-duplicates based on Jaccard similarity\n\tconst nearDuplicates: SkillAuditReport[\"nearDuplicates\"] = [];\n\tfor (let i = 0; i < skills.length; i++) {\n\t\tfor (let j = i + 1; j < skills.length; j++) {\n\t\t\tconst similarity = jaccard(skills[i].keywords, skills[j].keywords);\n\t\t\tif (similarity >= DUPLICATE_THRESHOLD) {\n\t\t\t\tconst reason =\n\t\t\t\t\tsimilarity >= 0.9\n\t\t\t\t\t\t? \"90%+ keyword overlap; merge/refine before adding another skill\"\n\t\t\t\t\t\t: \"high trigger/workflow overlap; review for dedup or compartmentalization\";\n\t\t\t\tnearDuplicates.push({\n\t\t\t\t\ta: skills[i].path,\n\t\t\t\t\tb: skills[j].path,\n\t\t\t\t\tsimilarity: Number(similarity.toFixed(3)),\n\t\t\t\t\treason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tnearDuplicates.sort((a, b) => b.similarity - a.similarity);\n\n\t// Check for name collisions\n\tconst byName = new Map<string, string[]>();\n\tfor (const skill of skills) {\n\t\tconst existing = byName.get(skill.name) ?? [];\n\t\tbyName.set(skill.name, [...existing, skill.path]);\n\t}\n\tconst nameCollisions = [...byName.entries()]\n\t\t.filter(([, paths]) => paths.length > 1)\n\t\t.map(([name, paths]) => ({ name, paths }));\n\n\t// Build recommendations\n\tconst recommendations: string[] = [];\n\tif (draftSkill && nearDuplicates.length > 0) {\n\t\tconst draftNearDupes = nearDuplicates.filter((d) => d.a === \"[draft]\" || d.b === \"[draft]\");\n\t\tif (draftNearDupes.length > 0) {\n\t\t\trecommendations.push(\n\t\t\t\t`Draft skill has ${draftNearDupes.length} similar existing skill(s). Consider merging or refining the trigger/scope.`,\n\t\t\t);\n\t\t}\n\t}\n\tif (nameCollisions.length > 0) {\n\t\trecommendations.push(\n\t\t\t`Found ${nameCollisions.length} skill name collision(s). Resolve naming conflicts before deployment.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tgeneratedAt: new Date().toISOString(),\n\t\tskills: skills.filter((s) => s.path !== \"[draft]\"), // Don't include draft in final skill list\n\t\tnearDuplicates,\n\t\tcompartmentWarnings: [],\n\t\tnameCollisions,\n\t\trecommendations,\n\t};\n}\n\nconst skillAuditSchema = Type.Object({\n\tdraftName: Type.Optional(Type.String({ description: \"Name of the draft skill to audit\" })),\n\tdraftDescription: Type.Optional(Type.String({ description: \"Description of the draft skill\" })),\n\tdraftBody: Type.Optional(Type.String({ description: \"Body/content of the draft skill\" })),\n});\n\nexport type SkillAuditInput = Static<typeof skillAuditSchema>;\n\nexport interface SkillAuditToolDetails {\n\treportPath?: string;\n}\n\nexport interface SkillAuditToolOptions {}\n\nexport function createSkillAuditToolDefinition(\n\tcwd: string,\n\t_options?: SkillAuditToolOptions,\n): ToolDefinition<typeof skillAuditSchema, SkillAuditReport> {\n\treturn {\n\t\tname: \"skill_audit\",\n\t\tlabel: \"Skill Audit\",\n\t\ttoolGroup: \"skills\",\n\t\tdescription:\n\t\t\t\"Check a draft/new skill for overlap with existing skills before creating it; flags near-duplicate triggers/descriptions via local Jaccard similarity. Read-only: does not write files.\",\n\t\tpromptSnippet: \"Audit skill for overlaps\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skill_audit to check draft skills for conflicts before creating them.\",\n\t\t\t\"Similarity >= 55% indicates potential dedup or compartmentalization work.\",\n\t\t],\n\t\tparameters: skillAuditSchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ draftName, draftDescription, draftBody }: SkillAuditInput,\n\t\t\t_signal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillAuditReport;\n\t\t}> {\n\t\t\tconst draftSkill =\n\t\t\t\tdraftName || draftDescription\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tname: draftName,\n\t\t\t\t\t\t\tdescription: draftDescription,\n\t\t\t\t\t\t\tbody: draftBody,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\n\t\t\tconst report = runSkillAudit(cwd, draftSkill);\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(\n\t\t\t\t`Skill audit: ${report.skills.length} skill(s), ${report.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (report.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlap warnings:\");\n\t\t\t\tfor (const item of report.nearDuplicates.slice(0, 8)) {\n\t\t\t\t\tconst aName = item.a.split(\"/\").pop() || item.a;\n\t\t\t\t\tconst bName = item.b.split(\"/\").pop() || item.b;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${aName} ↔ ${bName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of report.nameCollisions.slice(0, 8)) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} paths`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.recommendations && report.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of report.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (report.nearDuplicates.length === 0 && report.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\nNo overlaps detected. This skill appears to be unique.\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillAuditTool(cwd: string, options?: SkillAuditToolOptions): AgentTool<typeof skillAuditSchema> {\n\treturn wrapToolDefinition(createSkillAuditToolDefinition(cwd, options));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpH,QAAA,MAAM,WAAW;;;;EAUhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAalD,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEpH,QAAA,MAAM,WAAW;;;;EAUhB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;AACxD,MAAM,MAAM,gBAAgB,GACzB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC7D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAalD,qEAAqE;AACrE,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CA4D9G"}
|
package/dist/core/tools/skill.js
CHANGED
|
@@ -20,7 +20,8 @@ function statusText(result) {
|
|
|
20
20
|
export function createSkillVaultToolDefinition(vault) {
|
|
21
21
|
return {
|
|
22
22
|
name: "skill",
|
|
23
|
-
label: "
|
|
23
|
+
label: "Skill",
|
|
24
|
+
toolGroup: "skills",
|
|
24
25
|
description: "Skill vault. Specialist guidance useful: search, load exact name before work. Host injects body transiently, expires idle; unload optional.",
|
|
25
26
|
promptSnippet: "Search/load skill.",
|
|
26
27
|
parameters: skillSchema,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SkillLoadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from \"../skill-vault.ts\";\n\nconst skillSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[Type.Literal(\"search\"), Type.Literal(\"load\"), Type.Literal(\"unload\"), Type.Literal(\"status\")],\n\t\t\t{ description: \"search | load | unload | status\" },\n\t\t),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact load name\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type SkillToolInput = Static<typeof skillSchema>;\nexport type SkillToolDetails =\n\t| { action: \"search\"; result: SkillSearchResult }\n\t| { action: \"load\"; result: SkillLoadResult }\n\t| { action: \"unload\"; result: { ok: true; unloaded?: string } }\n\t| { action: \"status\"; result: SkillVaultStatus };\n\nfunction searchText(result: SkillSearchResult): string {\n\tif (result.candidates.length === 0) return \"skill search: no match\";\n\treturn result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join(\"\\n\");\n}\n\nfunction statusText(result: SkillVaultStatus): string {\n\tif (result.state === \"unloaded\") return `skill state: unloaded${result.reason ? `, ${result.reason}` : \"\"}`;\n\tif (result.state === \"loaded_pending\") return `skill state: loaded_pending, ${result.name}, applies next request`;\n\treturn `skill state: active, ${result.name}, idle ${Math.round(result.idleForMs ?? 0)}ms, expires ${Math.round(result.expiresInMs ?? 0)}ms`;\n}\n\n/** One compact agent surface over the host-owned skill lifecycle. */\nexport function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/core/tools/skill.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,SAAS,CAAC;AAI5C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAC9B;IACC,MAAM,EAAE,IAAI,CAAC,KAAK,CACjB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAC9F,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAClD;IACD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;IAClE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC,CAAC;CACpE,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAC/B,CAAC;AASF,SAAS,UAAU,CAAC,MAAyB;IAC5C,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,wBAAwB,CAAC;IACpE,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,UAAU,CAAC,MAAwB;IAC3C,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU;QAAE,OAAO,wBAAwB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC5G,IAAI,MAAM,CAAC,KAAK,KAAK,gBAAgB;QAAE,OAAO,gCAAgC,MAAM,CAAC,IAAI,wBAAwB,CAAC;IAClH,OAAO,wBAAwB,MAAM,CAAC,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC;AAC7I,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,8BAA8B,CAAC,KAA2B;IACzE,OAAO;QACN,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,QAAQ;QACnB,WAAW,EACV,6IAA6I;QAC9I,aAAa,EAAE,oBAAoB;QACnC,UAAU,EAAE,WAAW;QACvB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK;YAC/B,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,KAAK,QAAQ,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;wBAC1B,MAAM,MAAM,GAAsB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;wBACrD,OAAO;4BACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC;4BACzE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAiB,EAAE,MAAM,EAAE;4BAC9C,OAAO,EAAE,IAAI;yBACb,CAAC;oBACH,CAAC;oBACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACzC,OAAO;wBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9D,OAAO,EAAE,EAAE,MAAM,EAAE,QAAiB,EAAE,MAAM,EAAE;qBAC9C,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,EAAE,CAAC;oBACb,MAAM,MAAM,GAAoB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;wBACjD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC;wBACxC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC;oBACjF,OAAO;wBACN,OAAO,EAAE;4BACR;gCACC,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,MAAM,CAAC,EAAE;oCACd,CAAC,CAAC,iBAAiB,MAAM,CAAC,IAAI,wBAAwB;oCACtD,CAAC,CAAC,sBAAsB,MAAM,CAAC,OAAO,EAAE;6BACzC;yBACD;wBACD,OAAO,EAAE,EAAE,MAAM,EAAE,MAAe,EAAE,MAAM,EAAE;wBAC5C,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE;qBACnB,CAAC;gBACH,CAAC;gBACD,KAAK,QAAQ,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC9B,OAAO;wBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,mBAAmB,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,EAAE,CAAC;wBAC1F,OAAO,EAAE,EAAE,MAAM,EAAE,QAAiB,EAAE,MAAM,EAAE;qBAC9C,CAAC;gBACH,CAAC;gBACD,KAAK,QAAQ,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;oBAC9B,OAAO;wBACN,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9D,OAAO,EAAE,EAAE,MAAM,EAAE,QAAiB,EAAE,MAAM,EAAE;qBAC9C,CAAC;gBACH,CAAC;YACF,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC","sourcesContent":["import { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport type { SkillLoadResult, SkillSearchResult, SkillVaultController, SkillVaultStatus } from \"../skill-vault.ts\";\n\nconst skillSchema = Type.Object(\n\t{\n\t\taction: Type.Union(\n\t\t\t[Type.Literal(\"search\"), Type.Literal(\"load\"), Type.Literal(\"unload\"), Type.Literal(\"status\")],\n\t\t\t{ description: \"search | load | unload | status\" },\n\t\t),\n\t\tquery: Type.Optional(Type.String({ description: \"search query\" })),\n\t\tname: Type.Optional(Type.String({ description: \"exact load name\" })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type SkillToolInput = Static<typeof skillSchema>;\nexport type SkillToolDetails =\n\t| { action: \"search\"; result: SkillSearchResult }\n\t| { action: \"load\"; result: SkillLoadResult }\n\t| { action: \"unload\"; result: { ok: true; unloaded?: string } }\n\t| { action: \"status\"; result: SkillVaultStatus };\n\nfunction searchText(result: SkillSearchResult): string {\n\tif (result.candidates.length === 0) return \"skill search: no match\";\n\treturn result.candidates.map((candidate) => `${candidate.name}: ${candidate.description}`).join(\"\\n\");\n}\n\nfunction statusText(result: SkillVaultStatus): string {\n\tif (result.state === \"unloaded\") return `skill state: unloaded${result.reason ? `, ${result.reason}` : \"\"}`;\n\tif (result.state === \"loaded_pending\") return `skill state: loaded_pending, ${result.name}, applies next request`;\n\treturn `skill state: active, ${result.name}, idle ${Math.round(result.idleForMs ?? 0)}ms, expires ${Math.round(result.expiresInMs ?? 0)}ms`;\n}\n\n/** One compact agent surface over the host-owned skill lifecycle. */\nexport function createSkillVaultToolDefinition(vault: SkillVaultController): ToolDefinition<typeof skillSchema> {\n\treturn {\n\t\tname: \"skill\",\n\t\tlabel: \"Skill\",\n\t\ttoolGroup: \"skills\",\n\t\tdescription:\n\t\t\t\"Skill vault. Specialist guidance useful: search, load exact name before work. Host injects body transiently, expires idle; unload optional.\",\n\t\tpromptSnippet: \"Search/load skill.\",\n\t\tparameters: skillSchema,\n\t\tasync execute(_toolCallId, input) {\n\t\t\tswitch (input.action) {\n\t\t\t\tcase \"search\": {\n\t\t\t\t\tif (!input.query?.trim()) {\n\t\t\t\t\t\tconst result: SkillSearchResult = { candidates: [] };\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: \"skill search requires query\" }],\n\t\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst result = vault.search(input.query);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: searchText(result) }],\n\t\t\t\t\t\tdetails: { action: \"search\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"load\": {\n\t\t\t\t\tconst result: SkillLoadResult = input.name?.trim()\n\t\t\t\t\t\t? vault.load(input.name.trim(), \"model\")\n\t\t\t\t\t\t: { ok: false, reason: \"not_found\", message: \"skill load requires exact name\" };\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\t\t\ttext: result.ok\n\t\t\t\t\t\t\t\t\t? `skill loaded: ${result.name}, applies next request`\n\t\t\t\t\t\t\t\t\t: `skill load failed: ${result.message}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t\tdetails: { action: \"load\" as const, result },\n\t\t\t\t\t\tisError: !result.ok,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"unload\": {\n\t\t\t\t\tconst result = vault.unload();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: `skill unloaded: ${result.unloaded ?? \"none\"}` }],\n\t\t\t\t\t\tdetails: { action: \"unload\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tcase \"status\": {\n\t\t\t\t\tconst result = vault.status();\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\" as const, text: statusText(result) }],\n\t\t\t\t\t\tdetails: { action: \"status\" as const, result },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillify.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGxE,QAAA,MAAM,cAAc;;;;EAIlB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,wBAAgB,4BAA4B,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,mBAAmB,GAC5B,cAAc,CAAC,OAAO,cAAc,EAAE,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"skillify.d.ts","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGxE,QAAA,MAAM,cAAc;;;;EAIlB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,gBAAgB,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF;AAED,MAAM,WAAW,mBAAmB;IACnC,MAAM,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;CAAG;AAEvC,wBAAgB,4BAA4B,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,mBAAmB,GAC5B,cAAc,CAAC,OAAO,cAAc,EAAE,cAAc,CAAC,CAsGvD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC,OAAO,cAAc,CAAC,CAE/G"}
|
|
@@ -12,11 +12,13 @@ const skillifySchema = Type.Object({
|
|
|
12
12
|
export function createSkillifyToolDefinition(cwd, _options) {
|
|
13
13
|
return {
|
|
14
14
|
name: "skillify",
|
|
15
|
-
label: "
|
|
15
|
+
label: "Skillify",
|
|
16
|
+
toolGroup: "skills",
|
|
16
17
|
description: "Validate a draft skill and audit for overlaps with existing skills. Pure analysis tool: generates a proposal with validation and audit report, but does NOT write files or activate the skill. Returns structured report with proposed install path.",
|
|
17
18
|
promptSnippet: "Validate and audit a draft skill",
|
|
18
19
|
promptGuidelines: [
|
|
19
20
|
"Use skillify to validate and audit draft skills before creating them.",
|
|
21
|
+
"When MEMORY.md holds a repeatable procedure, draft a skill from that procedure instead of leaving it as a fact.",
|
|
20
22
|
"Fix validation errors (name format, description length) and review audit findings before proceeding.",
|
|
21
23
|
"The tool returns a proposal only; persistent write and activation happen later.",
|
|
22
24
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillify.js","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { validateSkillName } from \"../skills.ts\";\nimport { runSkillAudit, type SkillAuditReport } from \"./skill-audit.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst skillifySchema = Type.Object({\n\tname: Type.String({ description: \"Skill name (lowercase, a-z 0-9 hyphens only, max 64 chars)\" }),\n\tdescription: Type.String({ description: \"Skill description (max 1024 chars)\" }),\n\tbody: Type.String({ description: \"Skill body/implementation code\" }),\n});\n\nexport type SkillifyInput = Static<typeof skillifySchema>;\n\nexport interface SkillifyReport {\n\tvalid: boolean;\n\terrors: string[];\n\taudit: SkillAuditReport;\n\tproposedPath: string;\n\tdraft: {\n\t\tname: string;\n\t\tdescription: string;\n\t\tbody: string;\n\t};\n}\n\nexport interface SkillifyToolDetails {\n\treport?: SkillifyReport;\n}\n\nexport interface SkillifyToolOptions {}\n\nexport function createSkillifyToolDefinition(\n\tcwd: string,\n\t_options?: SkillifyToolOptions,\n): ToolDefinition<typeof skillifySchema, SkillifyReport> {\n\treturn {\n\t\tname: \"skillify\",\n\t\tlabel: \"
|
|
1
|
+
{"version":3,"file":"skillify.js","sourceRoot":"","sources":["../../../src/core/tools/skillify.ts"],"names":[],"mappings":"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","sourcesContent":["import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@caupulican/pi-agent-core\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolDefinition } from \"../extensions/types.ts\";\nimport { validateSkillName } from \"../skills.ts\";\nimport { runSkillAudit, type SkillAuditReport } from \"./skill-audit.ts\";\nimport { wrapToolDefinition } from \"./tool-definition-wrapper.ts\";\n\nconst skillifySchema = Type.Object({\n\tname: Type.String({ description: \"Skill name (lowercase, a-z 0-9 hyphens only, max 64 chars)\" }),\n\tdescription: Type.String({ description: \"Skill description (max 1024 chars)\" }),\n\tbody: Type.String({ description: \"Skill body/implementation code\" }),\n});\n\nexport type SkillifyInput = Static<typeof skillifySchema>;\n\nexport interface SkillifyReport {\n\tvalid: boolean;\n\terrors: string[];\n\taudit: SkillAuditReport;\n\tproposedPath: string;\n\tdraft: {\n\t\tname: string;\n\t\tdescription: string;\n\t\tbody: string;\n\t};\n}\n\nexport interface SkillifyToolDetails {\n\treport?: SkillifyReport;\n}\n\nexport interface SkillifyToolOptions {}\n\nexport function createSkillifyToolDefinition(\n\tcwd: string,\n\t_options?: SkillifyToolOptions,\n): ToolDefinition<typeof skillifySchema, SkillifyReport> {\n\treturn {\n\t\tname: \"skillify\",\n\t\tlabel: \"Skillify\",\n\t\ttoolGroup: \"skills\",\n\t\tdescription:\n\t\t\t\"Validate a draft skill and audit for overlaps with existing skills. Pure analysis tool: generates a proposal with validation and audit report, but does NOT write files or activate the skill. Returns structured report with proposed install path.\",\n\t\tpromptSnippet: \"Validate and audit a draft skill\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use skillify to validate and audit draft skills before creating them.\",\n\t\t\t\"When MEMORY.md holds a repeatable procedure, draft a skill from that procedure instead of leaving it as a fact.\",\n\t\t\t\"Fix validation errors (name format, description length) and review audit findings before proceeding.\",\n\t\t\t\"The tool returns a proposal only; persistent write and activation happen later.\",\n\t\t],\n\t\tparameters: skillifySchema,\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\t{ name, description, body }: SkillifyInput,\n\t\t\t_signal?: AbortSignal,\n\t\t\t_onUpdate?,\n\t\t\t_ctx?,\n\t\t): Promise<{\n\t\t\tcontent: Array<{ type: \"text\"; text: string }>;\n\t\t\tdetails: SkillifyReport;\n\t\t}> {\n\t\t\tconst errors: string[] = [];\n\n\t\t\t// Validate name\n\t\t\tconst nameErrors = validateSkillName(name);\n\t\t\terrors.push(...nameErrors);\n\n\t\t\t// Validate description\n\t\t\tif (!description || description.trim() === \"\") {\n\t\t\t\terrors.push(\"description is required\");\n\t\t\t} else if (description.length > 1024) {\n\t\t\t\terrors.push(`description exceeds 1024 characters (${description.length})`);\n\t\t\t}\n\n\t\t\t// Run audit on the draft\n\t\t\tconst audit = runSkillAudit(cwd, { name, description, body });\n\n\t\t\tconst valid = errors.length === 0;\n\t\t\tconst proposedPath = join(homedir(), \".pi\", \"agent\", \"skills\", name, \"SKILL.md\");\n\n\t\t\tconst report: SkillifyReport = {\n\t\t\t\tvalid,\n\t\t\t\terrors,\n\t\t\t\taudit,\n\t\t\t\tproposedPath,\n\t\t\t\tdraft: { name, description, body },\n\t\t\t};\n\n\t\t\t// Format the report as readable text\n\t\t\tconst lines: string[] = [];\n\t\t\tlines.push(`Skillify validation: ${valid ? \"✓ valid\" : \"✗ invalid\"}`);\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tlines.push(\"\\nValidation errors:\");\n\t\t\t\tfor (const err of errors) {\n\t\t\t\t\tlines.push(`- ${err}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlines.push(\n\t\t\t\t`\\nAudit: ${audit.skills.length} existing skill(s), ${audit.nearDuplicates.length} overlap warning(s).`,\n\t\t\t);\n\n\t\t\tif (audit.nearDuplicates.length > 0) {\n\t\t\t\tlines.push(\"\\nTop overlaps with existing skills:\");\n\t\t\t\tfor (const item of audit.nearDuplicates.slice(0, 5)) {\n\t\t\t\t\tconst otherPath = item.a === \"[draft]\" ? item.b : item.a;\n\t\t\t\t\tconst otherName = otherPath.split(\"/\").pop() || otherPath;\n\t\t\t\t\tlines.push(`- ${(item.similarity * 100).toFixed(1)}%: ${otherName} — ${item.reason}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (audit.nameCollisions.length > 0) {\n\t\t\t\tlines.push(\"\\nName collisions:\");\n\t\t\t\tfor (const item of audit.nameCollisions) {\n\t\t\t\t\tlines.push(`- ${item.name}: ${item.paths.length} existing path(s)`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (audit.recommendations && audit.recommendations.length > 0) {\n\t\t\t\tlines.push(\"\\nRecommendations:\");\n\t\t\t\tfor (const rec of audit.recommendations) {\n\t\t\t\t\tlines.push(`- ${rec}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (valid && audit.nearDuplicates.length === 0 && audit.nameCollisions.length === 0) {\n\t\t\t\tlines.push(\"\\n✓ Skill appears ready for creation.\");\n\t\t\t}\n\n\t\t\tlines.push(`\\nProposed install path: ${proposedPath}`);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: lines.join(\"\\n\") }],\n\t\t\t\tdetails: report,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createSkillifyTool(cwd: string, options?: SkillifyToolOptions): AgentTool<typeof skillifySchema> {\n\treturn wrapToolDefinition(createSkillifyToolDefinition(cwd, options));\n}\n"]}
|
|
@@ -8,7 +8,7 @@ declare const taskStepsSchema: Type.TObject<{
|
|
|
8
8
|
requirementIds: Type.TOptional<Type.TArray<Type.TString>>;
|
|
9
9
|
note: Type.TOptional<Type.TString>;
|
|
10
10
|
evidence: Type.TOptional<Type.TArray<Type.TString>>;
|
|
11
|
-
action: Type.TUnion<[Type.TLiteral<"set">, Type.TLiteral<"add">, Type.TLiteral<"update">, Type.TLiteral<"list">, Type.TLiteral<"clear">, Type.TLiteral<"compact">, Type.TLiteral<"intake">]>;
|
|
11
|
+
action: Type.TUnion<[Type.TLiteral<"set">, Type.TLiteral<"add">, Type.TLiteral<"update">, Type.TLiteral<"list">, Type.TLiteral<"clear">, Type.TLiteral<"compact">, Type.TLiteral<"intake">, Type.TLiteral<"advance">]>;
|
|
12
12
|
steps: Type.TOptional<Type.TArray<Type.TObject<{
|
|
13
13
|
status: Type.TOptional<Type.TUnion<[Type.TLiteral<"pending">, Type.TLiteral<"in_progress">, Type.TLiteral<"completed">, Type.TLiteral<"blocked">, Type.TLiteral<"cancelled">]>>;
|
|
14
14
|
priority: Type.TOptional<Type.TUnion<[Type.TLiteral<"low">, Type.TLiteral<"normal">, Type.TLiteral<"high">]>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-steps.d.ts","sourceRoot":"","sources":["../../../src/core/tools/task-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-steps.d.ts","sourceRoot":"","sources":["../../../src/core/tools/task-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAaN,KAAK,cAAc,EAEnB,MAAM,wBAAwB,CAAC;AA6ChC,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;EAoCpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4FAA4F;IAC5F,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,yBAAyB;IACzC,iBAAiB,EAAE,MAAM,cAAc,GAAG,SAAS,CAAC;IACpD,kBAAkB,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAmID,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,yBAAyB,GAAG,cAAc,CAgK7F"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
+
import { advanceTaskSteps } from "../pipelines/increment.js";
|
|
2
3
|
import { addTaskStep, clearTaskSteps, compactTaskSteps, createTaskStepsState, findOpenDuplicateStep, formatTaskSteps, hasUnverifiedCompletedStep, MAX_TASK_STEPS, resolveTaskStepSelector, setTaskSteps, updateTaskStep, } from "../tasks/task-state.js";
|
|
3
4
|
import { emptyOrchestrationCall, OrchestrationPanelComponent, taskStepPanelRow, } from "./orchestration-panel.js";
|
|
4
5
|
const statusSchema = Type.Union([
|
|
@@ -36,6 +37,7 @@ const taskStepsSchema = Type.Object({
|
|
|
36
37
|
Type.Literal("clear"),
|
|
37
38
|
Type.Literal("compact"),
|
|
38
39
|
Type.Literal("intake"),
|
|
40
|
+
Type.Literal("advance"),
|
|
39
41
|
], { description: "Checklist action. Use list to read without mutation." }),
|
|
40
42
|
steps: Type.Optional(Type.Array(stepInputSchema, {
|
|
41
43
|
maxItems: MAX_TASK_STEPS,
|
|
@@ -178,6 +180,8 @@ export function createTaskStepsToolDefinition(deps) {
|
|
|
178
180
|
"Use for complex/explicitly tracked work, not one-step work. Keep one in_progress step.",
|
|
179
181
|
"Batch transitions. Address first open step; record evidence/blocker. Never call only to narrate unchanged state.",
|
|
180
182
|
"intake preserves every supplied item; link steps to active goal requirementIds.",
|
|
183
|
+
"advance completes the current step then starts the next pending step.",
|
|
184
|
+
"Attach completed tool_task taskIds as evidence. Goal complete refuses while linked steps stay open.",
|
|
181
185
|
"Before final: clear stale in_progress, discuss/defer remainder. Goal owns outcomes; delegate owns workers.",
|
|
182
186
|
],
|
|
183
187
|
parameters: taskStepsSchema,
|
|
@@ -254,6 +258,11 @@ export function createTaskStepsToolDefinition(deps) {
|
|
|
254
258
|
case "compact":
|
|
255
259
|
state = compactTaskSteps(state, timestamp);
|
|
256
260
|
break;
|
|
261
|
+
case "advance": {
|
|
262
|
+
const advanced = advanceTaskSteps(before, timestamp);
|
|
263
|
+
state = advanced.state;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
257
266
|
case "list":
|
|
258
267
|
if (input.clearCompleted)
|
|
259
268
|
state = compactTaskSteps(state, timestamp);
|