@letta-ai/letta-code 0.33.1 → 0.33.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/README.md +1 -1
- package/dist/agent-presets.js +8 -8
- package/dist/agent-presets.js.map +1 -1
- package/dist/channels-public.js +6 -35
- package/dist/channels-public.js.map +3 -3
- package/dist/channels-slack.js +2 -2
- package/dist/channels-slack.js.map +4 -4
- package/dist/gateway-core.js +6 -35
- package/dist/gateway-core.js.map +3 -3
- package/dist/mcp-client.js +2 -2
- package/dist/mcp-client.js.map +1 -1
- package/dist/memory-confinement.js.map +1 -1
- package/dist/types/agent/approval-execution.d.ts.map +1 -1
- package/dist/types/agent/subagents/index.d.ts.map +1 -1
- package/dist/types/agent/subagents/manager.d.ts.map +1 -1
- package/dist/types/agent/subagents/sandbox.d.ts +1 -1
- package/dist/types/agent/subagents/subagent-launcher.d.ts +1 -1
- package/dist/types/backend/api/conversation-enqueue.d.ts +3 -1
- package/dist/types/backend/api/conversation-enqueue.d.ts.map +1 -1
- package/dist/types/backend/api/request.d.ts +2 -1
- package/dist/types/backend/api/request.d.ts.map +1 -1
- package/dist/types/channels/progress-formatting.d.ts.map +1 -1
- package/dist/types/channels/slack/progress.d.ts.map +1 -1
- package/dist/types/cron/runner.d.ts +16 -68
- package/dist/types/cron/runner.d.ts.map +1 -1
- package/dist/types/cron/scheduler.d.ts.map +1 -1
- package/dist/types/managed-cloud-runtime.d.ts +9 -0
- package/dist/types/managed-cloud-runtime.d.ts.map +1 -0
- package/dist/types/permissions/canonical.d.ts.map +1 -1
- package/dist/types/permissions/checker.d.ts.map +1 -1
- package/dist/types/permissions/cross-agent-guard.d.ts +1 -1
- package/dist/types/permissions/cross-agent-guard.d.ts.map +1 -1
- package/dist/types/permissions/mode.d.ts.map +1 -1
- package/dist/types/sandbox/availability.d.ts +1 -1
- package/dist/types/tools/impl/exec-command.d.ts.map +1 -1
- package/dist/types/tools/impl/kill-bash.d.ts +0 -8
- package/dist/types/tools/impl/kill-bash.d.ts.map +1 -1
- package/dist/types/tools/impl/process_manager.d.ts +1 -1
- package/dist/types/tools/impl/send-agent-message.d.ts.map +1 -1
- package/dist/types/tools/impl/skill.d.ts +0 -6
- package/dist/types/tools/impl/skill.d.ts.map +1 -1
- package/dist/types/tools/impl/task-stop.d.ts.map +1 -1
- package/dist/types/tools/impl/tool-return-clamp.d.ts +2 -3
- package/dist/types/tools/impl/tool-return-clamp.d.ts.map +1 -1
- package/dist/types/tools/impl/wake.d.ts.map +1 -1
- package/dist/types/tools/manager.d.ts +1 -1
- package/dist/types/tools/manager.d.ts.map +1 -1
- package/dist/types/tools/removed-tools.d.ts +4 -0
- package/dist/types/tools/removed-tools.d.ts.map +1 -0
- package/dist/types/tools/tool-definitions.d.ts +1 -14
- package/dist/types/tools/tool-definitions.d.ts.map +1 -1
- package/dist/types/tools/tool-permissions.d.ts.map +1 -1
- package/dist/types/tools/toolset-catalog.d.ts +1 -1
- package/dist/types/tools/toolset-catalog.d.ts.map +1 -1
- package/dist/types/tools/toolset.d.ts.map +1 -1
- package/dist/types/tools/workflow/sdk-spawner.d.ts.map +1 -1
- package/dist/types/tools/workflow/types.d.ts +4 -0
- package/dist/types/tools/workflow/types.d.ts.map +1 -1
- package/dist/types/utils/debug.d.ts +11 -1
- package/dist/types/utils/debug.d.ts.map +1 -1
- package/letta.js +7758 -10184
- package/package.json +2 -2
- package/scripts/source-file-size-baseline.json +4 -5
- package/skills/creating-mods/references/plan-mode.md +6 -8
- package/skills/initializing-memory/SKILL.md +122 -640
- package/skills/initializing-memory/scripts/history-coverage.mjs +129 -0
- package/skills/initializing-memory/scripts/prepare-history.mjs +219 -0
- package/skills/scheduling-tasks/SKILL.md +15 -24
- package/skills/workflow-authoring/SKILL.md +6 -5
- package/dist/types/tools/impl/grep-files.d.ts +0 -19
- package/dist/types/tools/impl/grep-files.d.ts.map +0 -1
- package/dist/types/tools/impl/list-dir-codex.d.ts +0 -21
- package/dist/types/tools/impl/list-dir-codex.d.ts.map +0 -1
- package/dist/types/tools/impl/multi-edit.d.ts +0 -21
- package/dist/types/tools/impl/multi-edit.d.ts.map +0 -1
- package/dist/types/tools/impl/read-file-codex.d.ts +0 -24
- package/dist/types/tools/impl/read-file-codex.d.ts.map +0 -1
- package/dist/types/tools/impl/shell-command.d.ts +0 -25
- package/dist/types/tools/impl/shell-command.d.ts.map +0 -1
- package/dist/types/tools/impl/shell.d.ts +0 -25
- package/dist/types/tools/impl/shell.d.ts.map +0 -1
- package/dist/types/tools/impl/todo-write.d.ts +0 -14
- package/dist/types/tools/impl/todo-write.d.ts.map +0 -1
- package/skills/initializing-memory/ROOT_MEMORY.md +0 -723
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Account for every exported session after the analysis Workflow ran.
|
|
3
|
+
// Compares the cohorts and ledger written by prepare-history.mjs against the
|
|
4
|
+
// Workflow journal(s): a session counts as analyzed only when some history
|
|
5
|
+
// subagent returned JSON whose `sessionsRead` array names its sessionId.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// node history-coverage.mjs --prepared <dir> --journal <journal.jsonl>
|
|
9
|
+
// [--journal <journal.jsonl> ...] [--retry-out <file>] [--retry-size 5]
|
|
10
|
+
//
|
|
11
|
+
// Prints a coverage report. With --retry-out, writes { historyCohorts } with
|
|
12
|
+
// the unread sessions split into smaller cohorts for a follow-up Workflow run.
|
|
13
|
+
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
15
|
+
import { join, resolve } from "node:path";
|
|
16
|
+
import { parseArgs } from "node:util";
|
|
17
|
+
|
|
18
|
+
const USAGE =
|
|
19
|
+
"Usage: history-coverage.mjs --prepared <dir> --journal <journal.jsonl> [--journal ...] [--retry-out <file>] [--retry-size N]";
|
|
20
|
+
|
|
21
|
+
function fail(message) {
|
|
22
|
+
console.error(message);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function readJson(path) {
|
|
27
|
+
if (!existsSync(path))
|
|
28
|
+
fail(`Missing ${path}; run prepare-history.mjs first.`);
|
|
29
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function readSessionsRead(journalPath) {
|
|
33
|
+
if (!existsSync(journalPath)) fail(`Missing journal ${journalPath}`);
|
|
34
|
+
const read = new Set();
|
|
35
|
+
for (const line of readFileSync(journalPath, "utf8").split("\n")) {
|
|
36
|
+
if (!line.trim()) continue;
|
|
37
|
+
let entry;
|
|
38
|
+
try {
|
|
39
|
+
entry = JSON.parse(line);
|
|
40
|
+
} catch {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const value = entry?.outcome?.failed ? null : entry?.outcome?.value;
|
|
44
|
+
if (value && Array.isArray(value.sessionsRead)) {
|
|
45
|
+
for (const id of value.sessionsRead) {
|
|
46
|
+
if (typeof id === "string") read.add(id);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return read;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const { values } = parseArgs({
|
|
54
|
+
options: {
|
|
55
|
+
prepared: { type: "string" },
|
|
56
|
+
journal: { type: "string", multiple: true },
|
|
57
|
+
"retry-out": { type: "string" },
|
|
58
|
+
"retry-size": { type: "string", default: "5" },
|
|
59
|
+
help: { type: "boolean", short: "h" },
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
if (values.help) {
|
|
64
|
+
console.log(USAGE);
|
|
65
|
+
process.exit(0);
|
|
66
|
+
}
|
|
67
|
+
if (!values.prepared || !values.journal?.length) fail(USAGE);
|
|
68
|
+
const retrySize = Number(values["retry-size"]);
|
|
69
|
+
if (!Number.isSafeInteger(retrySize) || retrySize < 1) {
|
|
70
|
+
fail("--retry-size must be a positive integer");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const preparedDir = resolve(values.prepared);
|
|
74
|
+
const { historyCohorts } = readJson(join(preparedDir, "cohorts.json"));
|
|
75
|
+
const ledger = readJson(join(preparedDir, "ledger.json"));
|
|
76
|
+
|
|
77
|
+
const read = new Set();
|
|
78
|
+
for (const journal of values.journal) {
|
|
79
|
+
for (const id of readSessionsRead(resolve(journal))) read.add(id);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const unread = [];
|
|
83
|
+
let analyzed = 0;
|
|
84
|
+
for (const cohort of historyCohorts) {
|
|
85
|
+
const missing = cohort.sessions.filter((s) => !read.has(s.sessionId));
|
|
86
|
+
analyzed += cohort.sessions.length - missing.length;
|
|
87
|
+
if (missing.length)
|
|
88
|
+
unread.push({ cohort: cohort.id, repo: cohort.repo, sessions: missing });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const unreadCount = unread.reduce((n, c) => n + c.sessions.length, 0);
|
|
92
|
+
const inCohorts = analyzed + unreadCount;
|
|
93
|
+
// Sessions the ledger assigned but that were later dropped from cohorts.json
|
|
94
|
+
// (for example deprioritized by hand) were never sent to the Workflow.
|
|
95
|
+
const droppedFromCohorts = Math.max(0, ledger.assigned - inCohorts);
|
|
96
|
+
const report = {
|
|
97
|
+
manifestSessions: ledger.manifestSessions,
|
|
98
|
+
exportErrors: ledger.exportErrors.length,
|
|
99
|
+
excluded: ledger.excluded.length,
|
|
100
|
+
droppedFromCohorts,
|
|
101
|
+
analyzed,
|
|
102
|
+
unread: unread.map((c) => ({
|
|
103
|
+
cohort: c.cohort,
|
|
104
|
+
sessionIds: c.sessions.map((s) => s.sessionId),
|
|
105
|
+
})),
|
|
106
|
+
allAssignedRead: unreadCount === 0 && droppedFromCohorts === 0,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
if (values["retry-out"]) {
|
|
110
|
+
const retryCohorts = [];
|
|
111
|
+
for (const cohort of unread) {
|
|
112
|
+
for (let i = 0; i < cohort.sessions.length; i += retrySize) {
|
|
113
|
+
retryCohorts.push({
|
|
114
|
+
id: `${cohort.cohort}-retry-${i / retrySize + 1}`,
|
|
115
|
+
repo: cohort.repo,
|
|
116
|
+
sessions: cohort.sessions.slice(i, i + retrySize),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const retryPath = resolve(values["retry-out"]);
|
|
121
|
+
writeFileSync(
|
|
122
|
+
retryPath,
|
|
123
|
+
`${JSON.stringify({ historyCohorts: retryCohorts }, null, 2)}\n`,
|
|
124
|
+
);
|
|
125
|
+
report.retryFile = retryPath;
|
|
126
|
+
report.retryCohorts = retryCohorts.length;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
console.log(JSON.stringify(report, null, 2));
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Turn a `letta trajectories export` directory into Workflow-ready history
|
|
3
|
+
// cohorts: render every session to plain text (Workflow subagents only have
|
|
4
|
+
// Read/Grep/Glob), group sessions into size-bounded cohorts per project, and
|
|
5
|
+
// record a coverage ledger of everything that was excluded and why.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// node prepare-history.mjs --export <dir> --out <dir>
|
|
9
|
+
// [--max-bytes 200000] [--max-sessions 20]
|
|
10
|
+
// [--letta <executable>] [--letta-arg <argument> ...]
|
|
11
|
+
//
|
|
12
|
+
// Writes <out>/rendered/<source>/<session>.txt, <out>/cohorts.json
|
|
13
|
+
// ({ historyCohorts }) and <out>/ledger.json, and prints a summary.
|
|
14
|
+
|
|
15
|
+
import { spawnSync } from "node:child_process";
|
|
16
|
+
import {
|
|
17
|
+
closeSync,
|
|
18
|
+
existsSync,
|
|
19
|
+
mkdirSync,
|
|
20
|
+
openSync,
|
|
21
|
+
readFileSync,
|
|
22
|
+
rmSync,
|
|
23
|
+
statSync,
|
|
24
|
+
writeFileSync,
|
|
25
|
+
} from "node:fs";
|
|
26
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
27
|
+
import { parseArgs } from "node:util";
|
|
28
|
+
|
|
29
|
+
const USAGE =
|
|
30
|
+
"Usage: prepare-history.mjs --export <dir> --out <dir> [--max-bytes N] [--max-sessions N] [--letta executable] [--letta-arg argument ...]";
|
|
31
|
+
|
|
32
|
+
function fail(message) {
|
|
33
|
+
console.error(message);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function positiveInt(value, name) {
|
|
38
|
+
const n = Number(value);
|
|
39
|
+
if (!Number.isSafeInteger(n) || n < 1)
|
|
40
|
+
fail(`--${name} must be a positive integer`);
|
|
41
|
+
return n;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function slug(value) {
|
|
45
|
+
return (
|
|
46
|
+
value
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
49
|
+
.replace(/^-+|-+$/g, "") || "session"
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function render(lettaCmd, exportDir, file, path) {
|
|
54
|
+
const [bin, ...prefix] = lettaCmd;
|
|
55
|
+
// Bun can exit before flushing a large console.log to a pipe. Redirect to a
|
|
56
|
+
// regular file so a successful CLI exit cannot silently truncate history.
|
|
57
|
+
const fd = openSync(path, "w");
|
|
58
|
+
let result;
|
|
59
|
+
try {
|
|
60
|
+
result = spawnSync(
|
|
61
|
+
bin,
|
|
62
|
+
[...prefix, "trajectories", "view", file, "--out", exportDir, "--tools"],
|
|
63
|
+
{ encoding: "utf8", stdio: ["ignore", fd, "pipe"] },
|
|
64
|
+
);
|
|
65
|
+
} finally {
|
|
66
|
+
closeSync(fd);
|
|
67
|
+
}
|
|
68
|
+
if (result.error || result.status !== 0) rmSync(path, { force: true });
|
|
69
|
+
if (result.error) return { error: result.error.message };
|
|
70
|
+
if (result.status !== 0) {
|
|
71
|
+
return { error: (result.stderr || `exit ${result.status}`).trim() };
|
|
72
|
+
}
|
|
73
|
+
return { bytes: statSync(path).size };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function buildCohorts(sessions, maxBytes, maxSessions) {
|
|
77
|
+
const byProject = new Map();
|
|
78
|
+
for (const session of sessions) {
|
|
79
|
+
const key = session.project ?? "";
|
|
80
|
+
if (!byProject.has(key)) byProject.set(key, []);
|
|
81
|
+
byProject.get(key).push(session);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const cohorts = [];
|
|
85
|
+
const usedIds = new Set();
|
|
86
|
+
for (const [project, list] of byProject) {
|
|
87
|
+
list.sort((a, b) => (a.startedAt ?? "").localeCompare(b.startedAt ?? ""));
|
|
88
|
+
let current = [];
|
|
89
|
+
let bytes = 0;
|
|
90
|
+
const flush = () => {
|
|
91
|
+
if (current.length === 0) return;
|
|
92
|
+
const base = `${slug(project ? basename(project) : "unknown-project")}-${(current[0].startedAt ?? "undated").slice(0, 10)}`;
|
|
93
|
+
let id = base;
|
|
94
|
+
for (let n = 2; usedIds.has(id); n++) id = `${base}-${n}`;
|
|
95
|
+
usedIds.add(id);
|
|
96
|
+
cohorts.push({
|
|
97
|
+
id,
|
|
98
|
+
repo: project && existsSync(project) ? project : null,
|
|
99
|
+
sessions: current,
|
|
100
|
+
});
|
|
101
|
+
current = [];
|
|
102
|
+
bytes = 0;
|
|
103
|
+
};
|
|
104
|
+
for (const session of list) {
|
|
105
|
+
if (
|
|
106
|
+
current.length > 0 &&
|
|
107
|
+
(bytes + session.renderedBytes > maxBytes ||
|
|
108
|
+
current.length >= maxSessions)
|
|
109
|
+
) {
|
|
110
|
+
flush();
|
|
111
|
+
}
|
|
112
|
+
current.push(session);
|
|
113
|
+
bytes += session.renderedBytes;
|
|
114
|
+
}
|
|
115
|
+
flush();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return cohorts.map((cohort) => ({
|
|
119
|
+
...cohort,
|
|
120
|
+
sessions: cohort.sessions.map(({ renderedBytes: _bytes, ...rest }) => rest),
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const { values } = parseArgs({
|
|
125
|
+
options: {
|
|
126
|
+
export: { type: "string" },
|
|
127
|
+
out: { type: "string" },
|
|
128
|
+
"max-bytes": { type: "string", default: "200000" },
|
|
129
|
+
"max-sessions": { type: "string", default: "20" },
|
|
130
|
+
letta: { type: "string", default: "letta" },
|
|
131
|
+
"letta-arg": { type: "string", multiple: true },
|
|
132
|
+
help: { type: "boolean", short: "h" },
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
if (values.help) {
|
|
137
|
+
console.log(USAGE);
|
|
138
|
+
process.exit(0);
|
|
139
|
+
}
|
|
140
|
+
if (!values.export || !values.out) fail(USAGE);
|
|
141
|
+
|
|
142
|
+
const exportDir = resolve(values.export);
|
|
143
|
+
const outDir = resolve(values.out);
|
|
144
|
+
const maxBytes = positiveInt(values["max-bytes"], "max-bytes");
|
|
145
|
+
const maxSessions = positiveInt(values["max-sessions"], "max-sessions");
|
|
146
|
+
const lettaCmd = [values.letta, ...(values["letta-arg"] ?? [])];
|
|
147
|
+
|
|
148
|
+
const manifestPath = join(exportDir, "manifest.json");
|
|
149
|
+
if (!existsSync(manifestPath)) {
|
|
150
|
+
fail(
|
|
151
|
+
`No manifest at ${manifestPath}. Run: letta trajectories export --out ${exportDir}`,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
155
|
+
|
|
156
|
+
const excluded = [];
|
|
157
|
+
const rendered = [];
|
|
158
|
+
for (const entry of manifest.sessions ?? []) {
|
|
159
|
+
const ref = {
|
|
160
|
+
sessionId: entry.sessionId,
|
|
161
|
+
source: entry.source,
|
|
162
|
+
file: entry.file,
|
|
163
|
+
};
|
|
164
|
+
if (!entry.userMessages) {
|
|
165
|
+
excluded.push({ ...ref, reason: "no user messages" });
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const path = join(outDir, "rendered", entry.file.replace(/\.json$/, ".txt"));
|
|
169
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
170
|
+
const result = render(lettaCmd, exportDir, entry.file, path);
|
|
171
|
+
if (result.error) {
|
|
172
|
+
excluded.push({ ...ref, reason: `render failed: ${result.error}` });
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
rendered.push({
|
|
176
|
+
sessionId: entry.sessionId,
|
|
177
|
+
path,
|
|
178
|
+
source: entry.source,
|
|
179
|
+
project: entry.project ?? null,
|
|
180
|
+
startedAt: entry.startedAt ?? null,
|
|
181
|
+
userMessages: entry.userMessages,
|
|
182
|
+
renderedBytes: result.bytes,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const historyCohorts = buildCohorts(rendered, maxBytes, maxSessions);
|
|
187
|
+
const ledger = {
|
|
188
|
+
exportDir,
|
|
189
|
+
manifestSessions: (manifest.sessions ?? []).length,
|
|
190
|
+
exportErrors: manifest.errors ?? [],
|
|
191
|
+
assigned: rendered.length,
|
|
192
|
+
excluded,
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
mkdirSync(outDir, { recursive: true });
|
|
196
|
+
writeFileSync(
|
|
197
|
+
join(outDir, "cohorts.json"),
|
|
198
|
+
`${JSON.stringify({ historyCohorts }, null, 2)}\n`,
|
|
199
|
+
);
|
|
200
|
+
writeFileSync(
|
|
201
|
+
join(outDir, "ledger.json"),
|
|
202
|
+
`${JSON.stringify(ledger, null, 2)}\n`,
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
console.log(
|
|
206
|
+
JSON.stringify(
|
|
207
|
+
{
|
|
208
|
+
cohorts: historyCohorts.length,
|
|
209
|
+
manifestSessions: ledger.manifestSessions,
|
|
210
|
+
assigned: ledger.assigned,
|
|
211
|
+
excluded: excluded.length,
|
|
212
|
+
exportErrors: ledger.exportErrors.length,
|
|
213
|
+
cohortsFile: join(outDir, "cohorts.json"),
|
|
214
|
+
ledgerFile: join(outDir, "ledger.json"),
|
|
215
|
+
},
|
|
216
|
+
null,
|
|
217
|
+
2,
|
|
218
|
+
),
|
|
219
|
+
);
|
|
@@ -1,39 +1,31 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scheduling-tasks
|
|
3
|
-
description: Advanced scheduling through the letta cron CLI for other conversations,
|
|
3
|
+
description: Advanced scheduling through the letta cron CLI for other conversations, computers, run history, and schedule replacement. Use Wake for ordinary create/list/cancel operations in the current conversation.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Scheduling Tasks
|
|
7
7
|
|
|
8
8
|
This skill lets you create, list, and manage scheduled tasks using the `letta cron` CLI. Scheduled tasks send a prompt to the agent on a timer — useful for reminders, periodic check-ins, and deferred follow-ups.
|
|
9
9
|
|
|
10
|
-
For ordinary one-shot or recurring work in the current conversation, use Wake instead. Wake is self-bound and covers create, list, and cancel without
|
|
10
|
+
For ordinary one-shot or recurring work in the current conversation, use Wake instead. Wake is self-bound and covers create, list, and cancel without routing choices.
|
|
11
11
|
|
|
12
12
|
## When to Use This Skill
|
|
13
13
|
|
|
14
14
|
- The task should run in a fresh, default, or different conversation
|
|
15
|
-
- The task needs a specific
|
|
15
|
+
- The task needs a specific connected computer
|
|
16
16
|
- You need run history, replacement, or broader schedule inspection
|
|
17
17
|
- Wake cannot see or manage the schedule you need
|
|
18
18
|
|
|
19
|
-
## Where Schedules Run
|
|
19
|
+
## Where Schedules Run
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Execution determines schedule ownership; there is no runner selection flag:
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
- In a managed Cloud sandbox, schedules are durable Cloud schedules and run in the agent's Cloud sandbox.
|
|
24
|
+
- On a user-managed computer or self-hosted runtime, schedules are local and fire only while a Letta session is running there.
|
|
24
25
|
|
|
25
|
-
|
|
26
|
-
- **`--computer <deviceId>`** — the work needs a specific connected computer (its filesystem, services, or credentials). Get the deviceId from `letta computers list`. If that computer is offline at fire time, execution falls back to the cloud sandbox.
|
|
27
|
-
- **`--runner local`** — the work must only ever run on the current computer, even if that means missing fires while no session is running here.
|
|
26
|
+
From a managed Cloud sandbox, `--computer <deviceId>` can run the scheduled work on a specific connected computer. Get the device ID from `letta computers list`. If that computer is offline at fire time, execution falls back to the Cloud sandbox. Local execution cannot target another computer.
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
### Fast Follow-ups vs Recurring Jobs
|
|
32
|
-
|
|
33
|
-
Two patterns cover most schedules:
|
|
34
|
-
|
|
35
|
-
- **Fast follow-ups** ("check on the PR in 5m"): the default is right — same computer as the active conversation. If the session dies before it fires, the follow-up usually died with the task anyway.
|
|
36
|
-
- **Recurring jobs** ("every Monday 11am, start the lunch order"): prefer durability. If the CLI warned that a recurring schedule is local, that's usually wrong for the user's intent — recreate it with `--runner cloud`, or `--computer` if the job needs a specific always-on computer. A fresh conversation per run is the default; pass a conversation explicitly when the job needs continuity in one thread.
|
|
28
|
+
Creation and execution follow those rules, while management commands still show and cancel both local and Cloud inventory. This keeps schedules created by older CLI versions visible without changing where new schedules run.
|
|
37
29
|
|
|
38
30
|
## CLI Usage
|
|
39
31
|
|
|
@@ -67,8 +59,7 @@ letta cron add --name <short-name> --description <text> --prompt <text> <schedul
|
|
|
67
59
|
|------|-------------|
|
|
68
60
|
| `--agent <id>` | Agent ID (defaults to `LETTA_AGENT_ID` from the current shell/session) |
|
|
69
61
|
| `--conversation <id>` | Conversation target: omit or pass `new` for a fresh conversation per fire; pass `self` for the current conversation; pass `default` for the agent default; or pass a concrete ID |
|
|
70
|
-
| `--
|
|
71
|
-
| `--computer <id>` | Execute on a specific connected computer — normally omit |
|
|
62
|
+
| `--computer <id>` | From managed Cloud, execute on a specific connected computer |
|
|
72
63
|
| `--once` | Mark `--at` as one-shot (already the default for `--at`) |
|
|
73
64
|
|
|
74
65
|
### Listing Tasks
|
|
@@ -77,20 +68,20 @@ letta cron add --name <short-name> --description <text> --prompt <text> <schedul
|
|
|
77
68
|
letta cron list
|
|
78
69
|
```
|
|
79
70
|
|
|
80
|
-
Optional filters: `--agent <id>`, `--conversation <id
|
|
71
|
+
Optional filters: `--agent <id>`, `--conversation <id>`
|
|
81
72
|
|
|
82
73
|
### Getting a Single Task
|
|
83
74
|
|
|
84
75
|
`get` accepts an ID or name:
|
|
85
76
|
|
|
86
77
|
```bash
|
|
87
|
-
letta cron get <id-or-name> [--
|
|
78
|
+
letta cron get <id-or-name> [--agent <id>]
|
|
88
79
|
```
|
|
89
80
|
|
|
90
81
|
### Reading Run History
|
|
91
82
|
|
|
92
83
|
```bash
|
|
93
|
-
letta cron runs --id <task-id> [--limit <n>] [--
|
|
84
|
+
letta cron runs --id <task-id> [--limit <n>] [--agent <id>]
|
|
94
85
|
```
|
|
95
86
|
|
|
96
87
|
For local run history, `--run-id <id>` selects one run. Cloud history ignores that flag.
|
|
@@ -125,7 +116,7 @@ letta cron list --agent "$LETTA_AGENT_ID" --conversation self
|
|
|
125
116
|
|
|
126
117
|
```bash
|
|
127
118
|
# Delete a specific task
|
|
128
|
-
letta cron delete <id-or-name> [--
|
|
119
|
+
letta cron delete <id-or-name> [--agent <id>]
|
|
129
120
|
|
|
130
121
|
# Delete all tasks for one agent
|
|
131
122
|
letta cron delete --all --agent "$AGENT_ID"
|
|
@@ -212,7 +203,7 @@ Include context about what the user originally asked for, so you can give a help
|
|
|
212
203
|
- **Default binding**: `letta cron add` uses `--agent` first, then `LETTA_AGENT_ID`. Omit `--conversation` for a fresh conversation per fire; use `--conversation self` to capture `LETTA_CONVERSATION_ID` explicitly.
|
|
213
204
|
- **Local scheduler requirement**: Local schedules only fire while a Letta session is running on their computer; fires while no session runs are marked as missed. Cloud schedules fire from the cloud regardless.
|
|
214
205
|
- **`--at` for specific times**: prefer RFC 3339 with an explicit offset. A bare `--at "3:00pm"` uses the process timezone and schedules tomorrow if that time has already passed there.
|
|
215
|
-
- **Cloud schedule creation failures are loud**: if creating a
|
|
206
|
+
- **Cloud schedule creation failures are loud**: if creating a Cloud schedule fails in a managed Cloud sandbox, no schedule is created; it never falls back to a local schedule.
|
|
216
207
|
|
|
217
208
|
## Cron Expression Reference
|
|
218
209
|
|
|
@@ -69,11 +69,12 @@ Workflow subagents require the API backend.
|
|
|
69
69
|
## Script body hooks
|
|
70
70
|
|
|
71
71
|
- `agent(prompt, opts?)` → Promise. Spawn one subagent. Resolves to its final
|
|
72
|
-
text, or with `
|
|
73
|
-
|
|
74
|
-
`null`
|
|
75
|
-
|
|
76
|
-
|
|
72
|
+
text, or with `schema` (JSON Schema) to a validated object. Prefer `schema`
|
|
73
|
+
for shaped results: invalid or missing output is retried, then resolves to
|
|
74
|
+
`null` with validation detail in the journal. `json: true` still parses
|
|
75
|
+
without validating; `schema` wins if both are set. Resolves to `null` on
|
|
76
|
+
failure — filter with `.filter(Boolean)`. Options: `label` (display name),
|
|
77
|
+
`phase` (progress group — use this inside concurrent stages), `schema`,
|
|
77
78
|
`json`, `model`, `effort` (`'low'` for mechanical stages, higher for the
|
|
78
79
|
hardest verify/judge stages), `allowedTools`, `systemPrompt` (extra system
|
|
79
80
|
prompt for this subagent), `timeoutMs` (default 10 minutes), `maxToolCalls`
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
interface GrepFilesArgs {
|
|
2
|
-
pattern: string;
|
|
3
|
-
include?: string;
|
|
4
|
-
path?: string;
|
|
5
|
-
limit?: number;
|
|
6
|
-
}
|
|
7
|
-
interface GrepFilesResult {
|
|
8
|
-
output: string;
|
|
9
|
-
matches?: number;
|
|
10
|
-
files?: number;
|
|
11
|
-
truncated?: boolean;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Codex-style grep_files tool.
|
|
15
|
-
* Uses the existing Grep implementation and returns a list of files with matches.
|
|
16
|
-
*/
|
|
17
|
-
export declare function grep_files(args: GrepFilesArgs): Promise<GrepFilesResult>;
|
|
18
|
-
export {};
|
|
19
|
-
//# sourceMappingURL=grep-files.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grep-files.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/grep-files.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CA0C1B"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
interface ListDirCodexArgs {
|
|
2
|
-
dir_path: string;
|
|
3
|
-
offset?: number;
|
|
4
|
-
limit?: number;
|
|
5
|
-
depth?: number;
|
|
6
|
-
}
|
|
7
|
-
interface ListDirCodexResult {
|
|
8
|
-
content: string;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Codex-style list_dir tool.
|
|
12
|
-
* Lists entries with pagination and depth control.
|
|
13
|
-
*
|
|
14
|
-
* Defaults:
|
|
15
|
-
* - offset: 1 (1-indexed)
|
|
16
|
-
* - limit: 25
|
|
17
|
-
* - depth: 2 (immediate children + one nested level)
|
|
18
|
-
*/
|
|
19
|
-
export declare function list_dir(args: ListDirCodexArgs): Promise<ListDirCodexResult>;
|
|
20
|
-
export {};
|
|
21
|
-
//# sourceMappingURL=list-dir-codex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list-dir-codex.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/list-dir-codex.ts"],"names":[],"mappings":"AAYA,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAqD7B"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
interface Edit {
|
|
2
|
-
old_string: string;
|
|
3
|
-
new_string: string;
|
|
4
|
-
replace_all?: boolean;
|
|
5
|
-
}
|
|
6
|
-
export interface MultiEditArgs {
|
|
7
|
-
file_path: string;
|
|
8
|
-
edits: Edit[];
|
|
9
|
-
}
|
|
10
|
-
interface EditWithLine {
|
|
11
|
-
description: string;
|
|
12
|
-
startLine: number;
|
|
13
|
-
}
|
|
14
|
-
interface MultiEditResult {
|
|
15
|
-
message: string;
|
|
16
|
-
edits_applied: number;
|
|
17
|
-
edits: EditWithLine[];
|
|
18
|
-
}
|
|
19
|
-
export declare function multi_edit(args: MultiEditArgs): Promise<MultiEditResult>;
|
|
20
|
-
export {};
|
|
21
|
-
//# sourceMappingURL=multi-edit.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-edit.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/multi-edit.ts"],"names":[],"mappings":"AAKA,UAAU,IAAI;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AACD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AACD,UAAU,YAAY;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CAoF1B"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
interface IndentationOptions {
|
|
2
|
-
anchor_line?: number;
|
|
3
|
-
max_levels?: number;
|
|
4
|
-
include_siblings?: boolean;
|
|
5
|
-
include_header?: boolean;
|
|
6
|
-
max_lines?: number;
|
|
7
|
-
}
|
|
8
|
-
interface ReadFileCodexArgs {
|
|
9
|
-
file_path: string;
|
|
10
|
-
offset?: number;
|
|
11
|
-
limit?: number;
|
|
12
|
-
mode?: "slice" | "indentation" | string;
|
|
13
|
-
indentation?: IndentationOptions;
|
|
14
|
-
}
|
|
15
|
-
interface ReadFileCodexResult {
|
|
16
|
-
content: string;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Codex-style read_file tool.
|
|
20
|
-
* Supports both slice mode (simple range) and indentation mode (context-aware block reading).
|
|
21
|
-
*/
|
|
22
|
-
export declare function read_file(args: ReadFileCodexArgs): Promise<ReadFileCodexResult>;
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=read-file-codex.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"read-file-codex.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/read-file-codex.ts"],"names":[],"mappings":"AAOA,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AASD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAiC9B"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
interface ShellCommandArgs {
|
|
2
|
-
command: string;
|
|
3
|
-
description?: string;
|
|
4
|
-
workdir?: string;
|
|
5
|
-
login?: boolean;
|
|
6
|
-
timeout_ms?: number;
|
|
7
|
-
sandbox_permissions?: "use_default" | "require_escalated";
|
|
8
|
-
justification?: string;
|
|
9
|
-
prefix_rule?: string[];
|
|
10
|
-
signal?: AbortSignal;
|
|
11
|
-
onOutput?: (chunk: string, stream: "stdout" | "stderr") => void;
|
|
12
|
-
secretEnv?: Record<string, string>;
|
|
13
|
-
}
|
|
14
|
-
interface ShellCommandResult {
|
|
15
|
-
output: string;
|
|
16
|
-
stdout?: string[];
|
|
17
|
-
stderr?: string[];
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Codex-style shell_command tool.
|
|
21
|
-
* Runs a shell script string in the user's default shell.
|
|
22
|
-
*/
|
|
23
|
-
export declare function shell_command(args: ShellCommandArgs): Promise<ShellCommandResult>;
|
|
24
|
-
export {};
|
|
25
|
-
//# sourceMappingURL=shell-command.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shell-command.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/shell-command.ts"],"names":[],"mappings":"AASA,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,aAAa,GAAG,mBAAmB,CAAC;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAuBD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAwD7B"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
interface ShellArgs {
|
|
2
|
-
command: string[];
|
|
3
|
-
workdir?: string;
|
|
4
|
-
timeout_ms?: number;
|
|
5
|
-
env_overrides?: NodeJS.ProcessEnv;
|
|
6
|
-
secretEnv?: Record<string, string>;
|
|
7
|
-
with_escalated_permissions?: boolean;
|
|
8
|
-
justification?: string;
|
|
9
|
-
signal?: AbortSignal;
|
|
10
|
-
onOutput?: (chunk: string, stream: "stdout" | "stderr") => void;
|
|
11
|
-
}
|
|
12
|
-
export declare function resolveShellWorkdir(workdir?: string): string;
|
|
13
|
-
export interface ShellResult {
|
|
14
|
-
output: string;
|
|
15
|
-
stdout: string[];
|
|
16
|
-
stderr: string[];
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Codex-style shell tool.
|
|
20
|
-
* Runs an array of shell arguments using execvp-style semantics.
|
|
21
|
-
* Typically called with ["bash", "-lc", "..."] for shell commands.
|
|
22
|
-
*/
|
|
23
|
-
export declare function shell(args: ShellArgs): Promise<ShellResult>;
|
|
24
|
-
export {};
|
|
25
|
-
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/shell.ts"],"names":[],"mappings":"AAaA,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAC;CACjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AA8DD;;;;GAIG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CA8EjE"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
interface TodoItem {
|
|
2
|
-
content: string;
|
|
3
|
-
status: "pending" | "in_progress" | "completed";
|
|
4
|
-
activeForm: string;
|
|
5
|
-
}
|
|
6
|
-
interface TodoWriteArgs {
|
|
7
|
-
todos: TodoItem[];
|
|
8
|
-
}
|
|
9
|
-
interface TodoWriteResult {
|
|
10
|
-
message: string;
|
|
11
|
-
}
|
|
12
|
-
export declare function todo_write(args: TodoWriteArgs): Promise<TodoWriteResult>;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=todo-write.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"todo-write.d.ts","sourceRoot":"","sources":["../../../../src/tools/impl/todo-write.ts"],"names":[],"mappings":"AAEA,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAChD,UAAU,EAAE,MAAM,CAAC;CACpB;AACD,UAAU,aAAa;IACrB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AACD,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CAqB1B"}
|