@asermax/tachikoma 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/dist/agent/adapter.d.ts +8 -0
- package/dist/agent/adapter.js +86 -0
- package/dist/agent/adapter.js.map +1 -0
- package/dist/agent/manager.d.ts +35 -0
- package/dist/agent/manager.js +76 -0
- package/dist/agent/manager.js.map +1 -0
- package/dist/agent/models.d.ts +46 -0
- package/dist/agent/models.js +96 -0
- package/dist/agent/models.js.map +1 -0
- package/dist/agent/side-run.d.ts +42 -0
- package/dist/agent/side-run.js +83 -0
- package/dist/agent/side-run.js.map +1 -0
- package/dist/app.d.ts +5 -0
- package/dist/app.js +79 -0
- package/dist/app.js.map +1 -0
- package/dist/channels/types.d.ts +37 -0
- package/dist/channels/types.js +5 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/config/default-template.d.ts +1 -0
- package/dist/config/default-template.js +49 -0
- package/dist/config/default-template.js.map +1 -0
- package/dist/config/load.d.ts +8 -0
- package/dist/config/load.js +28 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/parse.d.ts +5 -0
- package/dist/config/parse.js +18 -0
- package/dist/config/parse.js.map +1 -0
- package/dist/config/schema.d.ts +29 -0
- package/dist/config/schema.js +35 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/coordinator.d.ts +54 -0
- package/dist/coordinator.js +344 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/db/core-schema.d.ts +250 -0
- package/dist/db/core-schema.js +19 -0
- package/dist/db/core-schema.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.js +16 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +4 -0
- package/dist/db/schema.js +7 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/state.d.ts +10 -0
- package/dist/db/state.js +36 -0
- package/dist/db/state.js.map +1 -0
- package/dist/domain/agent-events.d.ts +26 -0
- package/dist/domain/agent-events.js +2 -0
- package/dist/domain/agent-events.js.map +1 -0
- package/dist/domain/message.d.ts +25 -0
- package/dist/domain/message.js +17 -0
- package/dist/domain/message.js.map +1 -0
- package/dist/events.d.ts +9 -0
- package/dist/events.js +27 -0
- package/dist/events.js.map +1 -0
- package/dist/extensions/api.d.ts +118 -0
- package/dist/extensions/api.js +7 -0
- package/dist/extensions/api.js.map +1 -0
- package/dist/extensions/boundary/detector.d.ts +20 -0
- package/dist/extensions/boundary/detector.js +57 -0
- package/dist/extensions/boundary/detector.js.map +1 -0
- package/dist/extensions/boundary/idle.d.ts +10 -0
- package/dist/extensions/boundary/idle.js +28 -0
- package/dist/extensions/boundary/idle.js.map +1 -0
- package/dist/extensions/boundary/index.d.ts +12 -0
- package/dist/extensions/boundary/index.js +65 -0
- package/dist/extensions/boundary/index.js.map +1 -0
- package/dist/extensions/boundary/summary.d.ts +5 -0
- package/dist/extensions/boundary/summary.js +33 -0
- package/dist/extensions/boundary/summary.js.map +1 -0
- package/dist/extensions/commands/index.d.ts +7 -0
- package/dist/extensions/commands/index.js +21 -0
- package/dist/extensions/commands/index.js.map +1 -0
- package/dist/extensions/context/index.d.ts +7 -0
- package/dist/extensions/context/index.js +65 -0
- package/dist/extensions/context/index.js.map +1 -0
- package/dist/extensions/context/processor.d.ts +27 -0
- package/dist/extensions/context/processor.js +228 -0
- package/dist/extensions/context/processor.js.map +1 -0
- package/dist/extensions/detached-processes/index.d.ts +12 -0
- package/dist/extensions/detached-processes/index.js +51 -0
- package/dist/extensions/detached-processes/index.js.map +1 -0
- package/dist/extensions/detached-processes/limits.d.ts +27 -0
- package/dist/extensions/detached-processes/limits.js +55 -0
- package/dist/extensions/detached-processes/limits.js.map +1 -0
- package/dist/extensions/detached-processes/output.d.ts +2 -0
- package/dist/extensions/detached-processes/output.js +26 -0
- package/dist/extensions/detached-processes/output.js.map +1 -0
- package/dist/extensions/detached-processes/reconcile.d.ts +31 -0
- package/dist/extensions/detached-processes/reconcile.js +71 -0
- package/dist/extensions/detached-processes/reconcile.js.map +1 -0
- package/dist/extensions/detached-processes/repository.d.ts +33 -0
- package/dist/extensions/detached-processes/repository.js +62 -0
- package/dist/extensions/detached-processes/repository.js.map +1 -0
- package/dist/extensions/detached-processes/schema.d.ts +252 -0
- package/dist/extensions/detached-processes/schema.js +23 -0
- package/dist/extensions/detached-processes/schema.js.map +1 -0
- package/dist/extensions/detached-processes/spawn.d.ts +40 -0
- package/dist/extensions/detached-processes/spawn.js +137 -0
- package/dist/extensions/detached-processes/spawn.js.map +1 -0
- package/dist/extensions/detached-processes/tools.d.ts +41 -0
- package/dist/extensions/detached-processes/tools.js +243 -0
- package/dist/extensions/detached-processes/tools.js.map +1 -0
- package/dist/extensions/detached-processes/watcher.d.ts +7 -0
- package/dist/extensions/detached-processes/watcher.js +19 -0
- package/dist/extensions/detached-processes/watcher.js.map +1 -0
- package/dist/extensions/external/index.d.ts +11 -0
- package/dist/extensions/external/index.js +40 -0
- package/dist/extensions/external/index.js.map +1 -0
- package/dist/extensions/external/installs.d.ts +39 -0
- package/dist/extensions/external/installs.js +98 -0
- package/dist/extensions/external/installs.js.map +1 -0
- package/dist/extensions/external/loader.d.ts +19 -0
- package/dist/extensions/external/loader.js +70 -0
- package/dist/extensions/external/loader.js.map +1 -0
- package/dist/extensions/external/tools.d.ts +17 -0
- package/dist/extensions/external/tools.js +112 -0
- package/dist/extensions/external/tools.js.map +1 -0
- package/dist/extensions/git/commit.d.ts +19 -0
- package/dist/extensions/git/commit.js +44 -0
- package/dist/extensions/git/commit.js.map +1 -0
- package/dist/extensions/git/git.d.ts +11 -0
- package/dist/extensions/git/git.js +29 -0
- package/dist/extensions/git/git.js.map +1 -0
- package/dist/extensions/git/hooks.d.ts +10 -0
- package/dist/extensions/git/hooks.js +88 -0
- package/dist/extensions/git/hooks.js.map +1 -0
- package/dist/extensions/git/index.d.ts +11 -0
- package/dist/extensions/git/index.js +28 -0
- package/dist/extensions/git/index.js.map +1 -0
- package/dist/extensions/git/processor.d.ts +13 -0
- package/dist/extensions/git/processor.js +52 -0
- package/dist/extensions/git/processor.js.map +1 -0
- package/dist/extensions/git/sync.d.ts +44 -0
- package/dist/extensions/git/sync.js +189 -0
- package/dist/extensions/git/sync.js.map +1 -0
- package/dist/extensions/git/tools.d.ts +21 -0
- package/dist/extensions/git/tools.js +101 -0
- package/dist/extensions/git/tools.js.map +1 -0
- package/dist/extensions/host.d.ts +31 -0
- package/dist/extensions/host.js +75 -0
- package/dist/extensions/host.js.map +1 -0
- package/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/index.js +32 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/memory/archive.d.ts +8 -0
- package/dist/extensions/memory/archive.js +46 -0
- package/dist/extensions/memory/archive.js.map +1 -0
- package/dist/extensions/memory/dates.d.ts +2 -0
- package/dist/extensions/memory/dates.js +7 -0
- package/dist/extensions/memory/dates.js.map +1 -0
- package/dist/extensions/memory/extraction.d.ts +17 -0
- package/dist/extensions/memory/extraction.js +218 -0
- package/dist/extensions/memory/extraction.js.map +1 -0
- package/dist/extensions/memory/index.d.ts +20 -0
- package/dist/extensions/memory/index.js +67 -0
- package/dist/extensions/memory/index.js.map +1 -0
- package/dist/extensions/memory/indexes.d.ts +14 -0
- package/dist/extensions/memory/indexes.js +64 -0
- package/dist/extensions/memory/indexes.js.map +1 -0
- package/dist/extensions/memory/layout.d.ts +20 -0
- package/dist/extensions/memory/layout.js +79 -0
- package/dist/extensions/memory/layout.js.map +1 -0
- package/dist/extensions/memory/maintenance.d.ts +21 -0
- package/dist/extensions/memory/maintenance.js +357 -0
- package/dist/extensions/memory/maintenance.js.map +1 -0
- package/dist/extensions/memory/prompts.d.ts +8 -0
- package/dist/extensions/memory/prompts.js +125 -0
- package/dist/extensions/memory/prompts.js.map +1 -0
- package/dist/extensions/memory/transcript.d.ts +18 -0
- package/dist/extensions/memory/transcript.js +79 -0
- package/dist/extensions/memory/transcript.js.map +1 -0
- package/dist/extensions/notifications/format.d.ts +5 -0
- package/dist/extensions/notifications/format.js +17 -0
- package/dist/extensions/notifications/format.js.map +1 -0
- package/dist/extensions/notifications/index.d.ts +13 -0
- package/dist/extensions/notifications/index.js +29 -0
- package/dist/extensions/notifications/index.js.map +1 -0
- package/dist/extensions/notifications/payload.d.ts +22 -0
- package/dist/extensions/notifications/payload.js +29 -0
- package/dist/extensions/notifications/payload.js.map +1 -0
- package/dist/extensions/notifications/router.d.ts +29 -0
- package/dist/extensions/notifications/router.js +55 -0
- package/dist/extensions/notifications/router.js.map +1 -0
- package/dist/extensions/notifications/tools.d.ts +12 -0
- package/dist/extensions/notifications/tools.js +41 -0
- package/dist/extensions/notifications/tools.js.map +1 -0
- package/dist/extensions/projects/context-provider.d.ts +9 -0
- package/dist/extensions/projects/context-provider.js +37 -0
- package/dist/extensions/projects/context-provider.js.map +1 -0
- package/dist/extensions/projects/git.d.ts +28 -0
- package/dist/extensions/projects/git.js +91 -0
- package/dist/extensions/projects/git.js.map +1 -0
- package/dist/extensions/projects/hooks.d.ts +7 -0
- package/dist/extensions/projects/hooks.js +42 -0
- package/dist/extensions/projects/hooks.js.map +1 -0
- package/dist/extensions/projects/index.d.ts +11 -0
- package/dist/extensions/projects/index.js +30 -0
- package/dist/extensions/projects/index.js.map +1 -0
- package/dist/extensions/projects/processor.d.ts +13 -0
- package/dist/extensions/projects/processor.js +63 -0
- package/dist/extensions/projects/processor.js.map +1 -0
- package/dist/extensions/projects/tools.d.ts +21 -0
- package/dist/extensions/projects/tools.js +118 -0
- package/dist/extensions/projects/tools.js.map +1 -0
- package/dist/extensions/registrations.d.ts +21 -0
- package/dist/extensions/registrations.js +12 -0
- package/dist/extensions/registrations.js.map +1 -0
- package/dist/extensions/repl/index.d.ts +2 -0
- package/dist/extensions/repl/index.js +85 -0
- package/dist/extensions/repl/index.js.map +1 -0
- package/dist/extensions/skills/agents.d.ts +17 -0
- package/dist/extensions/skills/agents.js +77 -0
- package/dist/extensions/skills/agents.js.map +1 -0
- package/dist/extensions/skills/delegate.d.ts +22 -0
- package/dist/extensions/skills/delegate.js +54 -0
- package/dist/extensions/skills/delegate.js.map +1 -0
- package/dist/extensions/skills/index.d.ts +11 -0
- package/dist/extensions/skills/index.js +43 -0
- package/dist/extensions/skills/index.js.map +1 -0
- package/dist/extensions/skills/reload.d.ts +8 -0
- package/dist/extensions/skills/reload.js +38 -0
- package/dist/extensions/skills/reload.js.map +1 -0
- package/dist/extensions/tasks/executor.d.ts +43 -0
- package/dist/extensions/tasks/executor.js +179 -0
- package/dist/extensions/tasks/executor.js.map +1 -0
- package/dist/extensions/tasks/expiration.d.ts +12 -0
- package/dist/extensions/tasks/expiration.js +17 -0
- package/dist/extensions/tasks/expiration.js.map +1 -0
- package/dist/extensions/tasks/generation.d.ts +14 -0
- package/dist/extensions/tasks/generation.js +70 -0
- package/dist/extensions/tasks/generation.js.map +1 -0
- package/dist/extensions/tasks/index.d.ts +14 -0
- package/dist/extensions/tasks/index.js +75 -0
- package/dist/extensions/tasks/index.js.map +1 -0
- package/dist/extensions/tasks/repository.d.ts +53 -0
- package/dist/extensions/tasks/repository.js +147 -0
- package/dist/extensions/tasks/repository.js.map +1 -0
- package/dist/extensions/tasks/schedule.d.ts +13 -0
- package/dist/extensions/tasks/schedule.js +32 -0
- package/dist/extensions/tasks/schedule.js.map +1 -0
- package/dist/extensions/tasks/schema.d.ts +423 -0
- package/dist/extensions/tasks/schema.js +45 -0
- package/dist/extensions/tasks/schema.js.map +1 -0
- package/dist/extensions/tasks/session-delivery.d.ts +18 -0
- package/dist/extensions/tasks/session-delivery.js +39 -0
- package/dist/extensions/tasks/session-delivery.js.map +1 -0
- package/dist/extensions/tasks/tools.d.ts +38 -0
- package/dist/extensions/tasks/tools.js +181 -0
- package/dist/extensions/tasks/tools.js.map +1 -0
- package/dist/extensions/telegram/buttons.d.ts +14 -0
- package/dist/extensions/telegram/buttons.js +49 -0
- package/dist/extensions/telegram/buttons.js.map +1 -0
- package/dist/extensions/telegram/channel.d.ts +39 -0
- package/dist/extensions/telegram/channel.js +201 -0
- package/dist/extensions/telegram/channel.js.map +1 -0
- package/dist/extensions/telegram/chunking.d.ts +7 -0
- package/dist/extensions/telegram/chunking.js +67 -0
- package/dist/extensions/telegram/chunking.js.map +1 -0
- package/dist/extensions/telegram/inbound.d.ts +7 -0
- package/dist/extensions/telegram/inbound.js +29 -0
- package/dist/extensions/telegram/inbound.js.map +1 -0
- package/dist/extensions/telegram/index.d.ts +13 -0
- package/dist/extensions/telegram/index.js +67 -0
- package/dist/extensions/telegram/index.js.map +1 -0
- package/dist/extensions/telegram/media.d.ts +39 -0
- package/dist/extensions/telegram/media.js +223 -0
- package/dist/extensions/telegram/media.js.map +1 -0
- package/dist/extensions/telegram/mutex.d.ts +9 -0
- package/dist/extensions/telegram/mutex.js +14 -0
- package/dist/extensions/telegram/mutex.js.map +1 -0
- package/dist/extensions/telegram/sending.d.ts +48 -0
- package/dist/extensions/telegram/sending.js +119 -0
- package/dist/extensions/telegram/sending.js.map +1 -0
- package/dist/extensions/telegram/streaming.d.ts +46 -0
- package/dist/extensions/telegram/streaming.js +140 -0
- package/dist/extensions/telegram/streaming.js.map +1 -0
- package/dist/extensions/telegram/tools.d.ts +80 -0
- package/dist/extensions/telegram/tools.js +232 -0
- package/dist/extensions/telegram/tools.js.map +1 -0
- package/dist/extensions/workflows/cleanup.d.ts +10 -0
- package/dist/extensions/workflows/cleanup.js +38 -0
- package/dist/extensions/workflows/cleanup.js.map +1 -0
- package/dist/extensions/workflows/index.d.ts +11 -0
- package/dist/extensions/workflows/index.js +42 -0
- package/dist/extensions/workflows/index.js.map +1 -0
- package/dist/extensions/workflows/loader.d.ts +27 -0
- package/dist/extensions/workflows/loader.js +90 -0
- package/dist/extensions/workflows/loader.js.map +1 -0
- package/dist/extensions/workflows/model.d.ts +19 -0
- package/dist/extensions/workflows/model.js +7 -0
- package/dist/extensions/workflows/model.js.map +1 -0
- package/dist/extensions/workflows/repository.d.ts +24 -0
- package/dist/extensions/workflows/repository.js +61 -0
- package/dist/extensions/workflows/repository.js.map +1 -0
- package/dist/extensions/workflows/schema.d.ts +193 -0
- package/dist/extensions/workflows/schema.js +20 -0
- package/dist/extensions/workflows/schema.js.map +1 -0
- package/dist/extensions/workflows/tools.d.ts +27 -0
- package/dist/extensions/workflows/tools.js +285 -0
- package/dist/extensions/workflows/tools.js.map +1 -0
- package/dist/log.d.ts +8 -0
- package/dist/log.js +15 -0
- package/dist/log.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +27 -0
- package/dist/main.js.map +1 -0
- package/dist/migration/ask.d.ts +8 -0
- package/dist/migration/ask.js +24 -0
- package/dist/migration/ask.js.map +1 -0
- package/dist/migration/config.d.ts +10 -0
- package/dist/migration/config.js +122 -0
- package/dist/migration/config.js.map +1 -0
- package/dist/migration/context.d.ts +3 -0
- package/dist/migration/context.js +24 -0
- package/dist/migration/context.js.map +1 -0
- package/dist/migration/database.d.ts +8 -0
- package/dist/migration/database.js +51 -0
- package/dist/migration/database.js.map +1 -0
- package/dist/migration/fs.d.ts +1 -0
- package/dist/migration/fs.js +11 -0
- package/dist/migration/fs.js.map +1 -0
- package/dist/migration/index.d.ts +11 -0
- package/dist/migration/index.js +28 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/skills.d.ts +19 -0
- package/dist/migration/skills.js +77 -0
- package/dist/migration/skills.js.map +1 -0
- package/dist/scheduler.d.ts +17 -0
- package/dist/scheduler.js +53 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/sessions/registry.d.ts +15 -0
- package/dist/sessions/registry.js +42 -0
- package/dist/sessions/registry.js.map +1 -0
- package/dist/workspace.d.ts +13 -0
- package/dist/workspace.js +32 -0
- package/dist/workspace.js.map +1 -0
- package/drizzle/0000_init.sql +19 -0
- package/drizzle/0001_extensions.sql +63 -0
- package/drizzle/meta/0000_snapshot.json +134 -0
- package/drizzle/meta/0001_snapshot.json +526 -0
- package/drizzle/meta/_journal.json +20 -0
- package/package.json +63 -0
- package/skills/skill-authoring/SKILL.md +168 -0
- package/skills/workflow-authoring/SKILL.md +251 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { StringEnum } from "@earendil-works/pi-ai";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import { STEP_STATES } from "./model.js";
|
|
7
|
+
export const UpdateActionSchema = StringEnum(["start", "complete", "skip"], {
|
|
8
|
+
description: "Transition to apply to the step",
|
|
9
|
+
});
|
|
10
|
+
export const EndActionSchema = StringEnum(["complete", "abort"], {
|
|
11
|
+
description: "Whether the workflow ended successfully or was abandoned",
|
|
12
|
+
});
|
|
13
|
+
const ACTION_PAST_TENSE = {
|
|
14
|
+
start: "started",
|
|
15
|
+
complete: "completed",
|
|
16
|
+
skip: "skipped",
|
|
17
|
+
};
|
|
18
|
+
// ---- helpers ------------------------------------------------------------------
|
|
19
|
+
export const deleteScratchpad = (path) => {
|
|
20
|
+
try {
|
|
21
|
+
rmSync(path, { force: true });
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Best-effort cleanup — a leftover scratchpad never blocks the workflow.
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const stepToSnapshot = (step) => ({
|
|
28
|
+
id: step.id,
|
|
29
|
+
title: step.title,
|
|
30
|
+
required: step.required,
|
|
31
|
+
path: dirname(step.instructionsPath),
|
|
32
|
+
});
|
|
33
|
+
const findNextPendingStep = (stepStates, snapshot) => snapshot.find((step) => (stepStates[step.id] ?? STEP_STATES.pending) === "pending") ?? null;
|
|
34
|
+
const getSnapshotStep = (snapshot, stepId) => snapshot.find((step) => step.id === stepId) ?? null;
|
|
35
|
+
const readStepInstructions = (step) => {
|
|
36
|
+
try {
|
|
37
|
+
return readFileSync(join(step.path, "instructions.md"), "utf8");
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const buildStepResponse = (step, prefix) => {
|
|
44
|
+
const instructions = readStepInstructions(step);
|
|
45
|
+
return [
|
|
46
|
+
prefix,
|
|
47
|
+
...(instructions != null ? [instructions] : []),
|
|
48
|
+
`---\n*Step path: \`${step.path}\`*`,
|
|
49
|
+
].join("\n\n");
|
|
50
|
+
};
|
|
51
|
+
const formatUtc = (date) => `${date.toISOString().slice(0, 16).replace("T", " ")} UTC`;
|
|
52
|
+
/**
|
|
53
|
+
* Validate a step transition against the current states and the frozen definition.
|
|
54
|
+
* Returns null when valid, an error message otherwise.
|
|
55
|
+
*/
|
|
56
|
+
export const validateTransition = (stepStates, stepId, action, snapshot) => {
|
|
57
|
+
const step = getSnapshotStep(snapshot, stepId);
|
|
58
|
+
if (step == null) {
|
|
59
|
+
const validIds = snapshot.map((candidate) => candidate.id).join(", ");
|
|
60
|
+
return `Invalid step '${stepId}'. Valid steps: ${validIds}`;
|
|
61
|
+
}
|
|
62
|
+
const currentState = stepStates[stepId] ?? STEP_STATES.pending;
|
|
63
|
+
if (currentState === "completed" || currentState === "skipped") {
|
|
64
|
+
return `Step '${stepId}' is already ${currentState}. Cannot change a completed or skipped step.`;
|
|
65
|
+
}
|
|
66
|
+
if (action === "start" && currentState !== "pending") {
|
|
67
|
+
return `Step '${stepId}' is already ${currentState}. Can only start a pending step.`;
|
|
68
|
+
}
|
|
69
|
+
if (action === "complete" && currentState !== "started") {
|
|
70
|
+
return `Step '${stepId}' is ${currentState}. Must start a step before completing it.`;
|
|
71
|
+
}
|
|
72
|
+
if (action === "skip") {
|
|
73
|
+
if (step.required)
|
|
74
|
+
return `Step '${stepId}' is required and cannot be skipped.`;
|
|
75
|
+
if (currentState !== "pending") {
|
|
76
|
+
return `Step '${stepId}' is ${currentState}. Can only skip a pending step.`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
// ---- handlers (testable without pi) ---------------------------------------------
|
|
82
|
+
export const handleStartWorkflow = (deps, skillName, workflowName) => {
|
|
83
|
+
const definition = deps.findWorkflow(skillName, workflowName);
|
|
84
|
+
if (definition == null) {
|
|
85
|
+
throw new Error(`Workflow '${workflowName}' not found in skill '${skillName}'. ` +
|
|
86
|
+
"Check that the skill exists and contains this workflow.");
|
|
87
|
+
}
|
|
88
|
+
if (definition.steps.length === 0) {
|
|
89
|
+
throw new Error(`Workflow '${workflowName}' has no steps. Add step directories with instructions.md files.`);
|
|
90
|
+
}
|
|
91
|
+
const existing = deps.repository.getActive(skillName, workflowName);
|
|
92
|
+
if (existing != null) {
|
|
93
|
+
throw new Error(`Workflow '${workflowName}' is already active for skill '${skillName}'. ` +
|
|
94
|
+
`Existing workflow ID: ${existing.id}. ` +
|
|
95
|
+
"Use end_workflow to complete or abort it before starting a new one.");
|
|
96
|
+
}
|
|
97
|
+
const workflowId = randomUUID();
|
|
98
|
+
const scratchpadPath = join(deps.scratchpadDir, `workflow-${workflowId}.md`);
|
|
99
|
+
mkdirSync(deps.scratchpadDir, { recursive: true });
|
|
100
|
+
writeFileSync(scratchpadPath, `# Workflow: ${workflowName}\n\nWorkflow ID: ${workflowId}\n`);
|
|
101
|
+
const definitionSnapshot = definition.steps.map(stepToSnapshot);
|
|
102
|
+
const stepStates = Object.fromEntries(definition.steps.map((step) => [step.id, STEP_STATES.pending]));
|
|
103
|
+
try {
|
|
104
|
+
deps.repository.create({
|
|
105
|
+
id: workflowId,
|
|
106
|
+
skillName,
|
|
107
|
+
workflowName,
|
|
108
|
+
stepStates,
|
|
109
|
+
definitionSnapshot,
|
|
110
|
+
scratchpadPath,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
deleteScratchpad(scratchpadPath);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
const stepLines = definition.steps.map((step, index) => {
|
|
118
|
+
const skipMarker = step.required ? "" : " (skippable)";
|
|
119
|
+
return `${index + 1}. **${step.title}** (\`${step.id}\`)${skipMarker}`;
|
|
120
|
+
});
|
|
121
|
+
return [
|
|
122
|
+
`Workflow started: **${workflowName}**`,
|
|
123
|
+
`## Steps\n\n${stepLines.join("\n")}`,
|
|
124
|
+
"## Getting Started",
|
|
125
|
+
`1. Call \`update_workflow_state\` with \`workflow_id="${workflowId}", ` +
|
|
126
|
+
`step="${definition.steps[0]?.id}", action="start"\` to begin the first step\n` +
|
|
127
|
+
`2. Read the scratchpad file at \`${scratchpadPath}\` first, then keep it updated ` +
|
|
128
|
+
`with your workflow ID (\`${workflowId}\`) and progress notes`,
|
|
129
|
+
"## Progressing",
|
|
130
|
+
'- Use `action="start"` to begin the first step (returns its instructions)\n' +
|
|
131
|
+
'- Use `action="complete"` to finish a started step — this **auto-starts** the next ' +
|
|
132
|
+
"step and returns its instructions (no separate start call needed)\n" +
|
|
133
|
+
'- Use `action="skip"` to skip a skippable step — also auto-starts the next step\n' +
|
|
134
|
+
"- When the last step is completed, the workflow is **auto-finalized** " +
|
|
135
|
+
"(no need to call `end_workflow`)",
|
|
136
|
+
"## Recovery",
|
|
137
|
+
"If you lose context, call `query_workflow()` without arguments to find your workflow, " +
|
|
138
|
+
"then `query_workflow(workflow_id=...)` to resume.",
|
|
139
|
+
].join("\n\n");
|
|
140
|
+
};
|
|
141
|
+
export const handleUpdateWorkflowState = (deps, workflowId, stepId, action) => {
|
|
142
|
+
const state = deps.repository.get(workflowId);
|
|
143
|
+
if (state == null)
|
|
144
|
+
throw new Error(`Workflow '${workflowId}' not found or no longer active.`);
|
|
145
|
+
const transitionError = validateTransition(state.stepStates, stepId, action, state.definitionSnapshot);
|
|
146
|
+
if (transitionError != null)
|
|
147
|
+
throw new Error(transitionError);
|
|
148
|
+
const stepStates = { ...state.stepStates };
|
|
149
|
+
// Present after a passing validation; narrows the type without a cast.
|
|
150
|
+
const step = getSnapshotStep(state.definitionSnapshot, stepId);
|
|
151
|
+
if (step == null)
|
|
152
|
+
throw new Error(`Invalid step '${stepId}'.`);
|
|
153
|
+
if (action === "start") {
|
|
154
|
+
stepStates[stepId] = STEP_STATES.started;
|
|
155
|
+
deps.repository.update(workflowId, { stepStates, currentStep: stepId });
|
|
156
|
+
return buildStepResponse(step, `Step **${step.title}** (\`${stepId}\`) started.`);
|
|
157
|
+
}
|
|
158
|
+
stepStates[stepId] = action === "complete" ? STEP_STATES.completed : STEP_STATES.skipped;
|
|
159
|
+
const next = findNextPendingStep(stepStates, state.definitionSnapshot);
|
|
160
|
+
if (next == null) {
|
|
161
|
+
deps.repository.update(workflowId, { stepStates, currentStep: null });
|
|
162
|
+
deps.repository.softDelete(workflowId);
|
|
163
|
+
deleteScratchpad(state.scratchpadPath);
|
|
164
|
+
const states = Object.values(stepStates);
|
|
165
|
+
const completed = states.filter((value) => value === "completed").length;
|
|
166
|
+
const skipped = states.filter((value) => value === "skipped").length;
|
|
167
|
+
return ("Workflow complete and finalized! " +
|
|
168
|
+
`All steps finished (${completed} completed, ${skipped} skipped).`);
|
|
169
|
+
}
|
|
170
|
+
stepStates[next.id] = STEP_STATES.started;
|
|
171
|
+
deps.repository.update(workflowId, { stepStates, currentStep: next.id });
|
|
172
|
+
return buildStepResponse(next, `Step \`${stepId}\` ${ACTION_PAST_TENSE[action]}. ` +
|
|
173
|
+
`Next step **${next.title}** (\`${next.id}\`) started.`);
|
|
174
|
+
};
|
|
175
|
+
const renderStateView = (state) => {
|
|
176
|
+
const stepLines = state.definitionSnapshot.map((step) => `- **${step.title}** (\`${step.id}\`): ${state.stepStates[step.id] ?? STEP_STATES.pending}`);
|
|
177
|
+
return [
|
|
178
|
+
"## Workflow State",
|
|
179
|
+
`- **ID**: ${state.id}\n` +
|
|
180
|
+
`- **Skill**: ${state.skillName}\n` +
|
|
181
|
+
`- **Workflow**: ${state.workflowName}\n` +
|
|
182
|
+
`- **Current Step**: ${state.currentStep ?? "none"}\n` +
|
|
183
|
+
`- **Scratchpad**: \`${state.scratchpadPath}\`\n` +
|
|
184
|
+
`- **Created**: ${formatUtc(state.createdAt)}\n` +
|
|
185
|
+
`- **Updated**: ${formatUtc(state.updatedAt)}`,
|
|
186
|
+
`### Steps\n\n${stepLines.join("\n")}`,
|
|
187
|
+
].join("\n\n");
|
|
188
|
+
};
|
|
189
|
+
export const handleQueryWorkflow = (deps, workflowId) => {
|
|
190
|
+
if (workflowId != null) {
|
|
191
|
+
const state = deps.repository.get(workflowId);
|
|
192
|
+
if (state == null)
|
|
193
|
+
throw new Error(`Workflow '${workflowId}' not found or no longer active.`);
|
|
194
|
+
return renderStateView(state);
|
|
195
|
+
}
|
|
196
|
+
const active = deps.repository.listActive();
|
|
197
|
+
if (active.length === 0)
|
|
198
|
+
return "No active workflows.";
|
|
199
|
+
const lines = active.map((state) => `- **${state.workflowName}** (skill: \`${state.skillName}\`) — ID: \`${state.id}\`, ` +
|
|
200
|
+
`current step: \`${state.currentStep ?? "none"}\`, started: ${formatUtc(state.createdAt)}`);
|
|
201
|
+
return `## Active Workflows\n\n${lines.join("\n")}`;
|
|
202
|
+
};
|
|
203
|
+
export const handleEndWorkflow = (deps, workflowId, action) => {
|
|
204
|
+
const state = deps.repository.get(workflowId);
|
|
205
|
+
if (state == null)
|
|
206
|
+
throw new Error(`Workflow '${workflowId}' not found or no longer active.`);
|
|
207
|
+
if (!deps.repository.softDelete(workflowId)) {
|
|
208
|
+
throw new Error(`Failed to end workflow '${workflowId}'.`);
|
|
209
|
+
}
|
|
210
|
+
deleteScratchpad(state.scratchpadPath);
|
|
211
|
+
const label = action === "complete" ? "completed" : "aborted";
|
|
212
|
+
return `Workflow **${state.workflowName}** ${label}. State cleaned up.`;
|
|
213
|
+
};
|
|
214
|
+
// ---- pi tool registration -------------------------------------------------------
|
|
215
|
+
const text = (value) => ({
|
|
216
|
+
content: [{ type: "text", text: value }],
|
|
217
|
+
details: undefined,
|
|
218
|
+
});
|
|
219
|
+
const WORKFLOW_ID_PARAM = Type.String({ description: "The workflow instance ID" });
|
|
220
|
+
export const registerWorkflowTools = (pi, deps) => {
|
|
221
|
+
pi.registerTool({
|
|
222
|
+
name: "start_workflow",
|
|
223
|
+
label: "Start workflow",
|
|
224
|
+
description: "Start a new instance of a workflow defined by a skill. Creates a tracked instance " +
|
|
225
|
+
"with a unique ID and returns the step list, scratchpad path, and guidance for " +
|
|
226
|
+
"progressing through the steps.",
|
|
227
|
+
promptSnippet: "start_workflow: begin a tracked multi-step workflow defined by a skill",
|
|
228
|
+
promptGuidelines: [
|
|
229
|
+
"When a skill defines a workflow for the task at hand, drive it with start_workflow and update_workflow_state instead of improvising the steps.",
|
|
230
|
+
],
|
|
231
|
+
parameters: Type.Object({
|
|
232
|
+
skill_name: Type.String({ description: "Name of the skill containing the workflow" }),
|
|
233
|
+
workflow_name: Type.String({ description: "Name of the workflow to start" }),
|
|
234
|
+
}),
|
|
235
|
+
async execute(_toolCallId, params) {
|
|
236
|
+
return text(handleStartWorkflow(deps, params.skill_name, params.workflow_name));
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
pi.registerTool({
|
|
240
|
+
name: "update_workflow_state",
|
|
241
|
+
label: "Update workflow state",
|
|
242
|
+
description: "Update a workflow step's state. Validates the transition and returns step " +
|
|
243
|
+
"instructions. Completing or skipping a step auto-starts the next pending step and " +
|
|
244
|
+
"returns its instructions. When all steps are done, the workflow is auto-finalized " +
|
|
245
|
+
"(cleaned up).",
|
|
246
|
+
promptSnippet: "update_workflow_state: start, complete, or skip a workflow step",
|
|
247
|
+
parameters: Type.Object({
|
|
248
|
+
workflow_id: WORKFLOW_ID_PARAM,
|
|
249
|
+
step: Type.String({ description: "The step identifier (directory name)" }),
|
|
250
|
+
action: UpdateActionSchema,
|
|
251
|
+
}),
|
|
252
|
+
async execute(_toolCallId, params) {
|
|
253
|
+
return text(handleUpdateWorkflowState(deps, params.workflow_id, params.step, params.action));
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
pi.registerTool({
|
|
257
|
+
name: "query_workflow",
|
|
258
|
+
label: "Query workflow",
|
|
259
|
+
description: "Query workflow state for recovery after context loss. With workflow_id, returns the " +
|
|
260
|
+
"full state including all step statuses; without it, lists all active workflows.",
|
|
261
|
+
promptSnippet: "query_workflow: inspect active workflows and their step states",
|
|
262
|
+
parameters: Type.Object({
|
|
263
|
+
workflow_id: Type.Optional(Type.String({ description: "Workflow instance ID. Omit to list all active workflows." })),
|
|
264
|
+
}),
|
|
265
|
+
async execute(_toolCallId, params) {
|
|
266
|
+
return text(handleQueryWorkflow(deps, params.workflow_id));
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
pi.registerTool({
|
|
270
|
+
name: "end_workflow",
|
|
271
|
+
label: "End workflow",
|
|
272
|
+
description: "End a workflow instance. Primarily used to abort a workflow in progress — normal " +
|
|
273
|
+
"completion happens automatically when the last step is completed. Removes the " +
|
|
274
|
+
"workflow state and its scratchpad file.",
|
|
275
|
+
promptSnippet: "end_workflow: abort or close out a workflow instance",
|
|
276
|
+
parameters: Type.Object({
|
|
277
|
+
workflow_id: WORKFLOW_ID_PARAM,
|
|
278
|
+
action: EndActionSchema,
|
|
279
|
+
}),
|
|
280
|
+
async execute(_toolCallId, params) {
|
|
281
|
+
return text(handleEndWorkflow(deps, params.workflow_id, params.action));
|
|
282
|
+
},
|
|
283
|
+
});
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/extensions/workflows/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/log.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import pino from "pino";
|
|
2
|
+
export type Logger = ReturnType<typeof pino>;
|
|
3
|
+
export interface LogOptions {
|
|
4
|
+
level: string;
|
|
5
|
+
pretty: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const createRootLogger: ({ level, pretty }: LogOptions) => Logger;
|
|
8
|
+
export declare const componentLogger: (root: Logger, component: string) => Logger;
|
package/dist/log.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import pino from "pino";
|
|
2
|
+
// Logs always go to stderr so channel output on stdout (REPL) stays clean.
|
|
3
|
+
export const createRootLogger = ({ level, pretty }) => {
|
|
4
|
+
// Legacy configs used uppercase levels ("INFO"); pino requires lowercase,
|
|
5
|
+
// and this runs before config migration gets a chance to translate.
|
|
6
|
+
const normalized = level.toLowerCase();
|
|
7
|
+
return pretty
|
|
8
|
+
? pino({
|
|
9
|
+
level: normalized,
|
|
10
|
+
transport: { target: "pino-pretty", options: { destination: 2, colorize: true } },
|
|
11
|
+
})
|
|
12
|
+
: pino({ level: normalized }, pino.destination(2));
|
|
13
|
+
};
|
|
14
|
+
export const componentLogger = (root, component) => root.child({ component });
|
|
15
|
+
//# sourceMappingURL=log.js.map
|
package/dist/log.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAc,EAAU,EAAE;IACxE,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,OAAO,MAAM;QACX,CAAC,CAAC,IAAI,CAAC;YACH,KAAK,EAAE,UAAU;YACjB,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;SAClF,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,SAAiB,EAAU,EAAE,CACzE,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC"}
|
package/dist/main.d.ts
ADDED
package/dist/main.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
3
|
+
import { runApp } from "./app.js";
|
|
4
|
+
const { values } = parseArgs({
|
|
5
|
+
options: {
|
|
6
|
+
channel: { type: "string", short: "c" },
|
|
7
|
+
config: { type: "string" },
|
|
8
|
+
help: { type: "boolean", short: "h" },
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
if (values.help === true) {
|
|
12
|
+
console.log(`tachikoma — proactive personal assistant
|
|
13
|
+
|
|
14
|
+
Usage: tachikoma [options]
|
|
15
|
+
|
|
16
|
+
Options:
|
|
17
|
+
-c, --channel <name> Channel to run (default: from config, usually "repl")
|
|
18
|
+
--config <path> Config file (default: ~/.config/tachikoma/config.toml)
|
|
19
|
+
-h, --help Show this help
|
|
20
|
+
`);
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
runApp({ channel: values.channel, configPath: values.config }).catch((error) => {
|
|
24
|
+
console.error(error instanceof Error ? (error.stack ?? error.message) : error);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE;QACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;KACtC;CACF,CAAC,CAAC;AAEH,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC;;;;;;;;CAQb,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC7E,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Logger } from "../log.ts";
|
|
2
|
+
export type Ask = (question: string) => Promise<boolean>;
|
|
3
|
+
/**
|
|
4
|
+
* Yes/no startup prompt. Interactive only on a TTY; otherwise every question
|
|
5
|
+
* resolves to its safe default (no) with a warning. Prompts run before any
|
|
6
|
+
* channel starts, so there is no stdin contention with the REPL.
|
|
7
|
+
*/
|
|
8
|
+
export declare const createAsk: (log: Logger) => Ask;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
/**
|
|
3
|
+
* Yes/no startup prompt. Interactive only on a TTY; otherwise every question
|
|
4
|
+
* resolves to its safe default (no) with a warning. Prompts run before any
|
|
5
|
+
* channel starts, so there is no stdin contention with the REPL.
|
|
6
|
+
*/
|
|
7
|
+
export const createAsk = (log) => {
|
|
8
|
+
return async (question) => {
|
|
9
|
+
if (process.stdin.isTTY !== true) {
|
|
10
|
+
log.warn({ question }, "non-interactive startup — answering no");
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
// Prompt on stderr so channel output on stdout (REPL) stays clean.
|
|
14
|
+
const readline = createInterface({ input: process.stdin, output: process.stderr });
|
|
15
|
+
try {
|
|
16
|
+
const answer = await readline.question(`${question} [y/N] `);
|
|
17
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
readline.close();
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/migration/ask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAMzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAO,EAAE;IAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,EAAE;QACxB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,wCAAwC,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mEAAmE;QACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAEnF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,CAAC,CAAC;YAC7D,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Config } from "../config/schema.ts";
|
|
2
|
+
import type { Logger } from "../log.ts";
|
|
3
|
+
import { type Ask } from "./ask.ts";
|
|
4
|
+
export declare const isOldShapeConfig: (raw: Record<string, unknown>) => boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Detect a config.toml written by a legacy install, back it up to
|
|
7
|
+
* `<path>.legacy-backup`, write a translated new-layout file, and return the
|
|
8
|
+
* reloaded Config. Returns null when the file is absent or already new-shape.
|
|
9
|
+
*/
|
|
10
|
+
export declare const adaptConfig: (path: string, log: Logger, ask?: Ask) => Promise<Config | null>;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { parse as parseToml, stringify as stringifyToml } from "smol-toml";
|
|
3
|
+
import { loadConfig } from "../config/load.js";
|
|
4
|
+
import { createAsk } from "./ask.js";
|
|
5
|
+
const OLD_ROLE_KEYS = {
|
|
6
|
+
model: "main",
|
|
7
|
+
searcher_model: "searcher",
|
|
8
|
+
processor_model: "processor",
|
|
9
|
+
classifier_model: "classifier",
|
|
10
|
+
};
|
|
11
|
+
const asTable = (value) => typeof value === "object" && value != null && !Array.isArray(value)
|
|
12
|
+
? value
|
|
13
|
+
: null;
|
|
14
|
+
export const isOldShapeConfig = (raw) => {
|
|
15
|
+
const agent = asTable(raw.agent);
|
|
16
|
+
return (asTable(raw.telegram) != null ||
|
|
17
|
+
typeof raw.channel === "string" ||
|
|
18
|
+
(agent != null && Object.keys(OLD_ROLE_KEYS).some((key) => key in agent)));
|
|
19
|
+
};
|
|
20
|
+
const translateOldConfig = async (raw, log, ask) => {
|
|
21
|
+
const result = {};
|
|
22
|
+
const oldWorkspace = asTable(raw.workspace);
|
|
23
|
+
if (typeof oldWorkspace?.path === "string")
|
|
24
|
+
result.workspace = { path: oldWorkspace.path };
|
|
25
|
+
const oldAgent = asTable(raw.agent);
|
|
26
|
+
const agent = {};
|
|
27
|
+
if (oldAgent != null) {
|
|
28
|
+
for (const [oldKey, role] of Object.entries(OLD_ROLE_KEYS)) {
|
|
29
|
+
const value = oldAgent[oldKey];
|
|
30
|
+
if (typeof value !== "string" || value === "")
|
|
31
|
+
continue;
|
|
32
|
+
// Legacy values were bare model aliases ("opus"); pi needs "provider/model-id".
|
|
33
|
+
const candidate = value.includes("/") ? value : `anthropic/${value}`;
|
|
34
|
+
if (await ask(`Set agent ${role} model to "${candidate}" (was "${value}")?`)) {
|
|
35
|
+
agent[role] = candidate;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
log.warn({ role, value }, "agent role left unset — configure it under [agent] in the new config if needed");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (Object.keys(agent).length > 0)
|
|
43
|
+
result.agent = agent;
|
|
44
|
+
const oldLogging = asTable(raw.logging);
|
|
45
|
+
if (oldLogging != null) {
|
|
46
|
+
const logging = {};
|
|
47
|
+
if (typeof oldLogging.level === "string")
|
|
48
|
+
logging.level = oldLogging.level.toLowerCase();
|
|
49
|
+
if (typeof oldLogging.console === "boolean")
|
|
50
|
+
logging.pretty = oldLogging.console;
|
|
51
|
+
if (Object.keys(logging).length > 0)
|
|
52
|
+
result.logging = logging;
|
|
53
|
+
}
|
|
54
|
+
if (typeof raw.channel === "string")
|
|
55
|
+
result.channels = { default: raw.channel };
|
|
56
|
+
const resumeWindow = oldAgent?.session_resume_window;
|
|
57
|
+
if (typeof resumeWindow === "number")
|
|
58
|
+
result.sessions = { resumeWindowSeconds: resumeWindow };
|
|
59
|
+
const timezone = asTable(raw.tasks)?.timezone;
|
|
60
|
+
if (typeof timezone === "string" && timezone !== "")
|
|
61
|
+
result.scheduler = { timezone };
|
|
62
|
+
const oldTelegram = asTable(raw.telegram);
|
|
63
|
+
if (oldTelegram != null) {
|
|
64
|
+
const telegram = {};
|
|
65
|
+
if (typeof oldTelegram.bot_token === "string")
|
|
66
|
+
telegram.botToken = oldTelegram.bot_token;
|
|
67
|
+
if (typeof oldTelegram.authorized_chat_id === "number") {
|
|
68
|
+
telegram.chatId = oldTelegram.authorized_chat_id;
|
|
69
|
+
}
|
|
70
|
+
if (typeof oldTelegram.push_notifications === "boolean") {
|
|
71
|
+
telegram.pushNotifications = oldTelegram.push_notifications;
|
|
72
|
+
}
|
|
73
|
+
const extraRoots = asTable(oldTelegram.send_file)?.extra_roots;
|
|
74
|
+
if (Array.isArray(extraRoots)) {
|
|
75
|
+
telegram.extraFileRoots = extraRoots.filter((root) => typeof root === "string");
|
|
76
|
+
}
|
|
77
|
+
if (oldTelegram.inbound_reactions != null) {
|
|
78
|
+
log.info("telegram inbound_reactions has no pi equivalent — dropped");
|
|
79
|
+
}
|
|
80
|
+
result.extensions = { telegram };
|
|
81
|
+
}
|
|
82
|
+
const carried = new Set(["workspace", "agent", "logging", "channel", "telegram"]);
|
|
83
|
+
const dropped = Object.keys(raw).filter((key) => !carried.has(key));
|
|
84
|
+
if (dropped.length > 0) {
|
|
85
|
+
log.info({ sections: dropped }, "config sections without a pi equivalent were not migrated (except tasks.timezone → scheduler.timezone); originals preserved in the backup");
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Detect a config.toml written by a legacy install, back it up to
|
|
91
|
+
* `<path>.legacy-backup`, write a translated new-layout file, and return the
|
|
92
|
+
* reloaded Config. Returns null when the file is absent or already new-shape.
|
|
93
|
+
*/
|
|
94
|
+
export const adaptConfig = async (path, log, ask = createAsk(log)) => {
|
|
95
|
+
let raw;
|
|
96
|
+
try {
|
|
97
|
+
raw = await readFile(path, "utf8");
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
let parsed;
|
|
103
|
+
try {
|
|
104
|
+
parsed = parseToml(raw);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
log.warn({ path, error }, "could not parse config for legacy-shape detection — leaving it untouched");
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (!isOldShapeConfig(parsed))
|
|
111
|
+
return null;
|
|
112
|
+
log.warn({ path }, "legacy config detected — translating to the new layout");
|
|
113
|
+
const translated = await translateOldConfig(parsed, log, ask);
|
|
114
|
+
const backupPath = `${path}.legacy-backup`;
|
|
115
|
+
await writeFile(backupPath, raw, "utf8");
|
|
116
|
+
const header = `# Tachikoma configuration\n# Translated from the legacy config; the original is preserved at\n# ${backupPath}\n\n`;
|
|
117
|
+
await writeFile(path, `${header}${stringifyToml(translated)}\n`, "utf8");
|
|
118
|
+
log.info({ path, backupPath }, "config translated — continuing with the new layout");
|
|
119
|
+
const { config } = await loadConfig(path);
|
|
120
|
+
return config;
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/migration/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { rename, rmdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathExists } from "./fs.js";
|
|
4
|
+
// Legacy workspaces kept these under {workspace}/context/; pi reads
|
|
5
|
+
// SOUL.md/USER.md from the workspace root and discovers AGENTS.md natively.
|
|
6
|
+
const CONTEXT_FILES = ["SOUL.md", "USER.md", "AGENTS.md"];
|
|
7
|
+
export const adaptContextFiles = async (workspace, log) => {
|
|
8
|
+
const oldDir = workspace.resolve("context");
|
|
9
|
+
for (const name of CONTEXT_FILES) {
|
|
10
|
+
const oldPath = join(oldDir, name);
|
|
11
|
+
const newPath = workspace.resolve(name);
|
|
12
|
+
if (!(await pathExists(oldPath)))
|
|
13
|
+
continue;
|
|
14
|
+
if (await pathExists(newPath)) {
|
|
15
|
+
log.warn({ file: name }, "context file exists in both context/ and the workspace root — keeping the root file, old copy left in context/");
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
await rename(oldPath, newPath);
|
|
19
|
+
log.info({ file: name }, "moved legacy context file to the workspace root");
|
|
20
|
+
}
|
|
21
|
+
// Tidy up the old directory when nothing is left; rmdir refuses non-empty dirs.
|
|
22
|
+
await rmdir(oldDir).catch(() => undefined);
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/migration/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,oEAAoE;AACpE,4EAA4E;AAC5E,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,SAAoB,EAAE,GAAW,EAAiB,EAAE;IAC1F,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YAAE,SAAS;QAE3C,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CACN,EAAE,IAAI,EAAE,IAAI,EAAE,EACd,gHAAgH,CACjH,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,iDAAiD,CAAC,CAAC;IAC9E,CAAC;IAED,gFAAgF;IAChF,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Logger } from "../log.ts";
|
|
2
|
+
import type { Workspace } from "../workspace.ts";
|
|
3
|
+
export declare const LEGACY_BACKUP_DB = "tachikoma.legacy-backup.db";
|
|
4
|
+
/**
|
|
5
|
+
* Detect a database written by a legacy install and rename it to a backup so
|
|
6
|
+
* drizzle starts from a fresh file. The backup is never deleted.
|
|
7
|
+
*/
|
|
8
|
+
export declare const adaptLegacyDatabase: (workspace: Workspace, log: Logger) => Promise<void>;
|