terse-cli 0.9.1 → 0.9.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terse-cli",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "type": "module",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "repository": {
@@ -28,7 +28,7 @@
28
28
  "commander": "^14.0.0",
29
29
  "conf": "^15.1.0",
30
30
  "dotenv": "^17.4.2",
31
- "durable-actors": "0.7.0",
31
+ "durable-actors": "0.7.4",
32
32
  "fflate": "^0.8.0",
33
33
  "handlebars": "^4.7.9",
34
34
  "import-meta-resolve": "^4.2.0",
@@ -40,8 +40,8 @@
40
40
  "tsx": "^4.0.0",
41
41
  "typescript": "^5.0.0",
42
42
  "zod": "^4.3.6",
43
- "terse-sdk": "0.9.1",
44
- "terse-types": "0.9.1"
43
+ "terse-sdk": "0.9.3",
44
+ "terse-types": "0.9.3"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/luxon": "^3.7.1",
@@ -1,5 +1,5 @@
1
1
  from pydantic import BaseModel
2
- from durable_actors import Actor, ActorSocket, emitted
2
+ from durable_actors import Actor, ActorSocket, emitted, persisted
3
3
 
4
4
 
5
5
  class Member(BaseModel):
@@ -24,7 +24,7 @@ class Message(BaseModel):
24
24
  class Chat(Actor[Member, SendMessage, Message]):
25
25
  """A Durable Actor chatroom"""
26
26
 
27
- messages: list[Message] = emitted(default_factory=list)
27
+ messages: list[Message] = emitted(persisted(default_factory=list))
28
28
 
29
29
  def post(self, author: Member, text: str) -> Message:
30
30
  """Save a message and broadcast it to connected members."""
@@ -2,10 +2,10 @@
2
2
  name = "{{projectName}}"
3
3
  version = "0.1.0"
4
4
  requires-python = ">=3.11"
5
- dependencies = ["durable-actors>=0.5.5,<1"]
5
+ dependencies = ["durable-actors>=0.7.4,<1"]
6
6
 
7
7
  [dependency-groups]
8
- dev = ["durable-actors[codegen]>=0.5.5,<1"]
8
+ dev = ["durable-actors[codegen]>=0.7.4,<1"]
9
9
 
10
10
  [tool.mypy]
11
11
  strict = true
@@ -1,4 +0,0 @@
1
- import { type NonInteractiveOpts } from "../cliHelpers.js";
2
- export declare function applyImprovement(improvementId?: string, opts?: NonInteractiveOpts): Promise<void>;
3
- export declare function listImprovements(): Promise<void>;
4
- //# sourceMappingURL=improvements.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"improvements.d.ts","sourceRoot":"","sources":["../../src/commands/improvements.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,KAAK,kBAAkB,EAAoB,MAAM,kBAAkB,CAAA;AAQ5E,wBAAsB,gBAAgB,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCvG;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBtD"}
@@ -1,246 +0,0 @@
1
- import { cancel, confirm, intro, isCancel, log, outro, select } from "@clack/prompts";
2
- import chalk from "chalk";
3
- import { spawnSync } from "node:child_process";
4
- import fs from "node:fs";
5
- import os from "node:os";
6
- import path from "node:path";
7
- import { ApiRoutes, buildRoute } from "terse-types";
8
- import { fetchWithAuth, readApiKeyOrBail } from "../api.js";
9
- import { CliError } from "../cliError.js";
10
- import { isNonInteractive } from "../cliHelpers.js";
11
- import { createSpinner } from "../cliUi.js";
12
- export async function applyImprovement(improvementId, opts) {
13
- const nonInteractive = isNonInteractive(opts);
14
- if (!improvementId && nonInteractive) {
15
- throw new CliError("apply_requires_interactive", "`terse apply` needs an improvement id in non-interactive mode.", {
16
- detail: "Pass the id as an argument: `terse apply <improvement-id>`. Run `terse list improvements` to find pending ids."
17
- });
18
- }
19
- intro("terse apply");
20
- const apiKey = readApiKeyOrBail();
21
- const spinner = createSpinner();
22
- spinner.start("Fetching jobs and improvements");
23
- const agentsWithImprovements = await fetchAgentsWithImprovements(apiKey);
24
- spinner.stop(`Loaded ${agentsWithImprovements.length} job${agentsWithImprovements.length === 1 ? "" : "s"}`);
25
- const target = improvementId ? findImprovementById(agentsWithImprovements, improvementId) : await promptForImprovement(agentsWithImprovements);
26
- if (!target) {
27
- if (improvementId) {
28
- throw new CliError("improvement_not_found", `No pending improvement found with id ${improvementId}.`, {
29
- detail: "Run `terse list improvements` to see available pending improvements."
30
- });
31
- }
32
- throw new CliError("no_improvement_selected", "No improvement selected.");
33
- }
34
- const { agent, improvement } = target;
35
- await applyPatchLocallyAndMarkApplied(apiKey, agent, improvement, nonInteractive);
36
- outro("Done");
37
- }
38
- export async function listImprovements() {
39
- const apiKey = readApiKeyOrBail();
40
- const spinner = createSpinner();
41
- spinner.start("Fetching jobs and improvements");
42
- const agentsWithImprovements = await fetchAgentsWithImprovements(apiKey);
43
- spinner.stop(`Loaded ${agentsWithImprovements.length} job${agentsWithImprovements.length === 1 ? "" : "s"}`);
44
- const pendingTotal = agentsWithImprovements.reduce((sum, { improvements }) => sum + pendingOnly(improvements).length, 0);
45
- if (pendingTotal === 0) {
46
- console.log(chalk.dim(" No pending improvements."));
47
- return;
48
- }
49
- for (const { agent, improvements } of agentsWithImprovements) {
50
- const pending = pendingOnly(improvements);
51
- if (pending.length === 0)
52
- continue;
53
- console.log("");
54
- console.log(`${chalk.bold(agent.name)} ${chalk.dim(`(${pending.length} pending)`)}`);
55
- for (const improvement of pending) {
56
- printImprovementDetails(improvement, " ");
57
- }
58
- }
59
- console.log("");
60
- }
61
- async function promptForImprovement(agentsWithImprovements) {
62
- if (agentsWithImprovements.length === 0) {
63
- log.warn("No jobs found. Deploy a job first with `terse deploy`.");
64
- return null;
65
- }
66
- const longestName = agentsWithImprovements.reduce((max, { agent }) => Math.max(max, agent.name.length), 0);
67
- const agentId = abortIfCancelled(await select({
68
- message: "Choose a job",
69
- options: agentsWithImprovements.map(({ agent, improvements }) => {
70
- const pending = pendingOnly(improvements).length;
71
- const countLabel = `${pending} pending improvement${pending === 1 ? "" : "s"}`;
72
- return {
73
- value: agent.id,
74
- label: `${agent.name.padEnd(longestName)} ${chalk.dim(countLabel)}`
75
- };
76
- })
77
- }));
78
- const selected = agentsWithImprovements.find(({ agent }) => agent.id === agentId);
79
- if (!selected)
80
- return null;
81
- const pending = pendingOnly(selected.improvements);
82
- if (pending.length === 0) {
83
- log.warn(`${selected.agent.name} has no pending improvements.`);
84
- return null;
85
- }
86
- console.log("");
87
- console.log(chalk.bold(`Pending improvements for ${selected.agent.name}:`));
88
- for (const improvement of pending) {
89
- printImprovementDetails(improvement, " ");
90
- }
91
- console.log("");
92
- const improvementId = abortIfCancelled(await select({
93
- message: "Choose an improvement",
94
- options: pending.map(improvement => ({
95
- value: improvement.id,
96
- label: improvement.title,
97
- hint: formatImprovementMeta(improvement)
98
- }))
99
- }));
100
- const improvement = pending.find(i => i.id === improvementId);
101
- if (!improvement)
102
- return null;
103
- return { agent: selected.agent, improvement };
104
- }
105
- function findImprovementById(agentsWithImprovements, improvementId) {
106
- for (const { agent, improvements } of agentsWithImprovements) {
107
- const match = improvements.find(i => i.id === improvementId);
108
- if (match)
109
- return { agent, improvement: match };
110
- }
111
- return null;
112
- }
113
- async function fetchAgentsWithImprovements(apiKey) {
114
- const agentsResponse = await fetchWithAuth(`${ApiRoutes.AGENTS.LIST}?pageSize=100`, apiKey);
115
- const agents = agentsResponse.agents;
116
- const results = await Promise.all(agents.map(async (agent) => {
117
- try {
118
- const response = await fetchWithAuth(buildRoute(ApiRoutes.IMPROVEMENTS.BY_AGENT_ID, { agentId: agent.id }), apiKey);
119
- return { agent, improvements: response.improvements };
120
- }
121
- catch {
122
- return { agent, improvements: [] };
123
- }
124
- }));
125
- return results.sort((a, b) => pendingOnly(b.improvements).length - pendingOnly(a.improvements).length || a.agent.name.localeCompare(b.agent.name));
126
- }
127
- async function applyPatchLocallyAndMarkApplied(apiKey, agent, improvement, nonInteractive) {
128
- if (!improvement.suggestedPatch) {
129
- throw new CliError("improvement_no_patch", "This improvement has no downloadable patch.");
130
- }
131
- log.info(`Applying ${chalk.bold(improvement.title)} for ${chalk.cyan(agent.name)}`);
132
- const patchPath = writePatchToTempFile(improvement);
133
- const direct = runGitApply(["apply", patchPath]);
134
- if (direct.ok) {
135
- log.success(`Patch applied from ${chalk.dim(patchPath)}`);
136
- }
137
- else {
138
- const threeWay = runGitApply(["apply", "--3way", patchPath]);
139
- if (threeWay.ok) {
140
- log.success(`Patch applied with 3-way merge from ${chalk.dim(patchPath)}`);
141
- console.log(chalk.dim(" Review your working tree for conflict markers."));
142
- }
143
- else {
144
- log.warn("Your working copy has likely drifted from the snapshot this patch was generated against.");
145
- if (direct.stderr)
146
- console.log(chalk.dim(indentBlock(direct.stderr, " ")));
147
- if (nonInteractive) {
148
- throw new CliError("patch_apply_failed", "Patch could not be applied cleanly.", {
149
- detail: `Patch saved at ${patchPath}. Re-run interactively to opt into a partial --reject apply.`
150
- });
151
- }
152
- const tryPartial = abortIfCancelled(await confirm({
153
- message: "Apply with --reject? Successful hunks land in your working tree; failed hunks are written as .rej files for manual resolution.",
154
- initialValue: false
155
- }));
156
- if (!tryPartial) {
157
- throw new CliError("patch_apply_failed", "Patch could not be applied cleanly.", {
158
- detail: `Patch saved at ${patchPath}.`
159
- });
160
- }
161
- const rejected = runGitApply(["apply", "--reject", "--ignore-whitespace", "-C1", patchPath]);
162
- if (rejected.stderr)
163
- console.log(chalk.dim(indentBlock(rejected.stderr, " ")));
164
- log.info("Run `git status` to see applied changes and any .rej files.");
165
- }
166
- }
167
- const spinner = createSpinner();
168
- spinner.start("Marking improvement as applied");
169
- try {
170
- await fetchWithAuth(buildRoute(ApiRoutes.IMPROVEMENTS.APPLY, { agentId: agent.id, id: improvement.id }), apiKey, {}, "POST");
171
- spinner.stop("Marked as applied");
172
- }
173
- catch (error) {
174
- spinner.stop("Failed to mark as applied on server");
175
- console.error(chalk.red(` ${error instanceof Error ? error.message : String(error)}`));
176
- }
177
- }
178
- function writePatchToTempFile(improvement) {
179
- const safeName = improvement.title
180
- .replace(/[^a-zA-Z0-9-_ ]/g, "")
181
- .replace(/\s+/g, "-")
182
- .toLowerCase() || "improvement";
183
- const fileName = `${safeName}-${improvement.id}.patch`;
184
- const filePath = path.join(os.tmpdir(), fileName);
185
- const content = improvement.suggestedPatch.endsWith("\n") ? improvement.suggestedPatch : `${improvement.suggestedPatch}\n`;
186
- fs.writeFileSync(filePath, content, "utf8");
187
- return filePath;
188
- }
189
- function runGitApply(args) {
190
- const result = spawnSync("git", args, { encoding: "utf8" });
191
- if (result.error) {
192
- return { ok: false, stderr: result.error.message };
193
- }
194
- const stderr = (result.stderr ?? "").trim();
195
- return { ok: result.status === 0, stderr };
196
- }
197
- function indentBlock(value, indent) {
198
- return value
199
- .split("\n")
200
- .map(line => `${indent}${line}`)
201
- .join("\n");
202
- }
203
- function pendingOnly(improvements) {
204
- return improvements.filter(i => i.status === "PENDING");
205
- }
206
- function printImprovementDetails(improvement, indent) {
207
- console.log("");
208
- console.log(`${indent}${chalk.cyan.bold(improvement.title)} ${chalk.dim(formatImprovementMeta(improvement))}`);
209
- for (const line of wrapText(improvement.description.trim(), 100)) {
210
- console.log(`${indent}${line}`);
211
- }
212
- }
213
- function formatImprovementMeta(improvement) {
214
- const confidencePct = Math.round(improvement.confidence * 100);
215
- return `${confidencePct}% confidence`;
216
- }
217
- function wrapText(value, width) {
218
- const lines = [];
219
- for (const paragraph of value.split(/\n+/)) {
220
- const words = paragraph.split(/\s+/).filter(Boolean);
221
- let current = "";
222
- for (const word of words) {
223
- if (current.length === 0) {
224
- current = word;
225
- }
226
- else if (current.length + 1 + word.length > width) {
227
- lines.push(current);
228
- current = word;
229
- }
230
- else {
231
- current += ` ${word}`;
232
- }
233
- }
234
- if (current.length > 0)
235
- lines.push(current);
236
- }
237
- return lines;
238
- }
239
- function abortIfCancelled(value) {
240
- if (isCancel(value)) {
241
- cancel("Operation cancelled.");
242
- process.exit(0);
243
- }
244
- return value;
245
- }
246
- //# sourceMappingURL=improvements.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"improvements.js","sourceRoot":"","sources":["../../src/commands/improvements.ts"],"names":[],"mappings":"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"}