clanka 0.2.31 → 0.2.32
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/dist/Agent.js +2 -2
- package/dist/ScriptPreprocessing.test.js +1 -0
- package/dist/ScriptPreprocessing.test.js.map +1 -1
- package/package.json +1 -1
- package/src/Agent.ts +2 -2
- package/src/ScriptPreprocessing.test.ts +1 -0
- package/src/fixtures/patch15-broken.txt +90 -0
- package/src/fixtures/patch15-fixed.txt +90 -0
package/dist/Agent.js
CHANGED
|
@@ -289,9 +289,9 @@ ${content}
|
|
|
289
289
|
});
|
|
290
290
|
});
|
|
291
291
|
const retryPolicy = Schedule.exponential(100, 1.5).pipe(Schedule.either(Schedule.spaced(5000)), Schedule.jittered);
|
|
292
|
-
const defaultSystem = (options) => `You are a world-class software engineer: precise, rigorous, thoughtful, and
|
|
292
|
+
const defaultSystem = (options) => `You are a world-class software engineer: precise, rigorous, thoughtful, and efficient. You fully understand the task, verify assumptions, and produce minimal, correct, maintainable solutions. You make no mistakes.
|
|
293
293
|
|
|
294
|
-
-
|
|
294
|
+
- Fully read and understand your task before proceeding.
|
|
295
295
|
- Only add comments when necessary.
|
|
296
296
|
|
|
297
297
|
${options.toolInstructions}
|
|
@@ -114,6 +114,7 @@ describe("preprocessScript", () => {
|
|
|
114
114
|
"patch12",
|
|
115
115
|
"patch13",
|
|
116
116
|
"patch14",
|
|
117
|
+
"patch15",
|
|
117
118
|
])("fixes broken %s", (fixture) => {
|
|
118
119
|
const content = readFileSync(join(__dirname, "fixtures", `${fixture}-broken.txt`), "utf-8");
|
|
119
120
|
const fixed = readFileSync(join(__dirname, "fixtures", `${fixture}-fixed.txt`), "utf-8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScriptPreprocessing.test.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScriptPreprocessing.test.js","sourceRoot":"","sources":["../src/ScriptPreprocessing.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Agent.ts
CHANGED
|
@@ -475,9 +475,9 @@ const retryPolicy = Schedule.exponential(100, 1.5).pipe(
|
|
|
475
475
|
const defaultSystem = (options: {
|
|
476
476
|
readonly toolInstructions: string
|
|
477
477
|
readonly agentsMd: string | null
|
|
478
|
-
}) => `You are a world-class software engineer: precise, rigorous, thoughtful, and
|
|
478
|
+
}) => `You are a world-class software engineer: precise, rigorous, thoughtful, and efficient. You fully understand the task, verify assumptions, and produce minimal, correct, maintainable solutions. You make no mistakes.
|
|
479
479
|
|
|
480
|
-
-
|
|
480
|
+
- Fully read and understand your task before proceeding.
|
|
481
481
|
- Only add comments when necessary.
|
|
482
482
|
|
|
483
483
|
${options.toolInstructions}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const patch = `*** Begin Patch
|
|
2
|
+
*** Update File: packages/sql/pg/src/PgClient.ts
|
|
3
|
+
@@
|
|
4
|
+
- const listenClient = yield* RcRef.make({
|
|
5
|
+
- acquire: reserveRaw
|
|
6
|
+
- })
|
|
7
|
+
+ const onListenClientError = (_cause: Error) => {
|
|
8
|
+
+ //
|
|
9
|
+
+ }
|
|
10
|
+
+ const listenClient = yield* RcRef.make({
|
|
11
|
+
+ acquire: Effect.acquireRelease(
|
|
12
|
+
+ Effect.tryPromise({
|
|
13
|
+
+ try: async () => {
|
|
14
|
+
+ const client = new Pg.Client(pool.options)
|
|
15
|
+
+ client.on("error", onListenClientError)
|
|
16
|
+
+ await client.connect()
|
|
17
|
+
+ return client
|
|
18
|
+
+ },
|
|
19
|
+
+ catch: (cause) =>
|
|
20
|
+
+ new SqlError({
|
|
21
|
+
+ reason: classifyError(cause, "Failed to acquire connection for listen", "listen")
|
|
22
|
+
+ })
|
|
23
|
+
+ }),
|
|
24
|
+
+ (client) =>
|
|
25
|
+
+ Effect.promise(() => {
|
|
26
|
+
+ client.off("error", onListenClientError)
|
|
27
|
+
+ return client.end()
|
|
28
|
+
+ }).pipe(
|
|
29
|
+
+ Effect.timeoutOption(1000)
|
|
30
|
+
+ )
|
|
31
|
+
+ )
|
|
32
|
+
+ })
|
|
33
|
+
*** Add File: packages/sql/pg/test/Listen.test.ts
|
|
34
|
+
+import { PgClient } from "@effect/sql-pg"
|
|
35
|
+
+import { assert, it } from "@effect/vitest"
|
|
36
|
+
+import { Effect, Fiber, Option, Stream } from "effect"
|
|
37
|
+
+import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
38
|
+
+import * as Pg from "pg"
|
|
39
|
+
+import { PgContainer } from "./utils.ts"
|
|
40
|
+
+
|
|
41
|
+
+it.layer(PgContainer.layer, { timeout: "30 seconds" })("PgClient listen", (it) => {
|
|
42
|
+
+ it.effect("uses a dedicated connection outside of the pool", () =>
|
|
43
|
+
+ Effect.scoped(
|
|
44
|
+
+ Effect.gen(function*() {
|
|
45
|
+
+ const container = yield* PgContainer
|
|
46
|
+
+ const pool = new Pg.Pool({
|
|
47
|
+
+ connectionString: container.getConnectionUri(),
|
|
48
|
+
+ max: 1,
|
|
49
|
+
+ application_name: "@effect/sql-pg-test-listen"
|
|
50
|
+
+ })
|
|
51
|
+
+ yield* Effect.addFinalizer(() => Effect.promise(() => pool.end()))
|
|
52
|
+
+
|
|
53
|
+
+ const client = yield* PgClient.fromPool({
|
|
54
|
+
+ acquire: Effect.succeed(pool)
|
|
55
|
+
+ }).pipe(
|
|
56
|
+
+ Effect.provide(Reactivity.layer)
|
|
57
|
+
+ )
|
|
58
|
+
+
|
|
59
|
+
+ const channel = \`listen_\${Date.now()}_\${Math.random().toString(36).slice(2)}\`
|
|
60
|
+
+ const listener = yield* client.listen(channel).pipe(
|
|
61
|
+
+ Stream.take(1),
|
|
62
|
+
+ Stream.runHead,
|
|
63
|
+
+ Effect.forkScoped
|
|
64
|
+
+ )
|
|
65
|
+
+
|
|
66
|
+
+ yield* Effect.sleep(200)
|
|
67
|
+
+ assert.strictEqual(pool.totalCount, 0)
|
|
68
|
+
+
|
|
69
|
+
+ const rows = yield* client<{ value: number }>(\`SELECT 1 AS value\`).pipe(
|
|
70
|
+
+ Effect.timeoutFail({
|
|
71
|
+
+ duration: "3 seconds",
|
|
72
|
+
+ onTimeout: () => new Error("query timed out while listen was active")
|
|
73
|
+
+ })
|
|
74
|
+
+ )
|
|
75
|
+
+ assert.deepEqual(rows, [{ value: 1 }])
|
|
76
|
+
+
|
|
77
|
+
+ yield* client.notify(channel, "payload")
|
|
78
|
+
+ const message = yield* Fiber.join(listener)
|
|
79
|
+
+ assert.deepEqual(message, Option.some("payload"))
|
|
80
|
+
+ })
|
|
81
|
+
+ ))
|
|
82
|
+
+})
|
|
83
|
+
*** Add File: .changeset/ten-pens-rule.md
|
|
84
|
+
+---
|
|
85
|
+
+"@effect/sql-pg": patch
|
|
86
|
+
+---
|
|
87
|
+
+
|
|
88
|
+
+Change `PgClient.listen` to use a dedicated PostgreSQL connection instead of reserving one from the pool.
|
|
89
|
+
*** End Patch`
|
|
90
|
+
console.log(await applyPatch(patch))
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const patch = `*** Begin Patch
|
|
2
|
+
*** Update File: packages/sql/pg/src/PgClient.ts
|
|
3
|
+
@@
|
|
4
|
+
- const listenClient = yield* RcRef.make({
|
|
5
|
+
- acquire: reserveRaw
|
|
6
|
+
- })
|
|
7
|
+
+ const onListenClientError = (_cause: Error) => {
|
|
8
|
+
+ //
|
|
9
|
+
+ }
|
|
10
|
+
+ const listenClient = yield* RcRef.make({
|
|
11
|
+
+ acquire: Effect.acquireRelease(
|
|
12
|
+
+ Effect.tryPromise({
|
|
13
|
+
+ try: async () => {
|
|
14
|
+
+ const client = new Pg.Client(pool.options)
|
|
15
|
+
+ client.on("error", onListenClientError)
|
|
16
|
+
+ await client.connect()
|
|
17
|
+
+ return client
|
|
18
|
+
+ },
|
|
19
|
+
+ catch: (cause) =>
|
|
20
|
+
+ new SqlError({
|
|
21
|
+
+ reason: classifyError(cause, "Failed to acquire connection for listen", "listen")
|
|
22
|
+
+ })
|
|
23
|
+
+ }),
|
|
24
|
+
+ (client) =>
|
|
25
|
+
+ Effect.promise(() => {
|
|
26
|
+
+ client.off("error", onListenClientError)
|
|
27
|
+
+ return client.end()
|
|
28
|
+
+ }).pipe(
|
|
29
|
+
+ Effect.timeoutOption(1000)
|
|
30
|
+
+ )
|
|
31
|
+
+ )
|
|
32
|
+
+ })
|
|
33
|
+
*** Add File: packages/sql/pg/test/Listen.test.ts
|
|
34
|
+
+import { PgClient } from "@effect/sql-pg"
|
|
35
|
+
+import { assert, it } from "@effect/vitest"
|
|
36
|
+
+import { Effect, Fiber, Option, Stream } from "effect"
|
|
37
|
+
+import * as Reactivity from "effect/unstable/reactivity/Reactivity"
|
|
38
|
+
+import * as Pg from "pg"
|
|
39
|
+
+import { PgContainer } from "./utils.ts"
|
|
40
|
+
+
|
|
41
|
+
+it.layer(PgContainer.layer, { timeout: "30 seconds" })("PgClient listen", (it) => {
|
|
42
|
+
+ it.effect("uses a dedicated connection outside of the pool", () =>
|
|
43
|
+
+ Effect.scoped(
|
|
44
|
+
+ Effect.gen(function*() {
|
|
45
|
+
+ const container = yield* PgContainer
|
|
46
|
+
+ const pool = new Pg.Pool({
|
|
47
|
+
+ connectionString: container.getConnectionUri(),
|
|
48
|
+
+ max: 1,
|
|
49
|
+
+ application_name: "@effect/sql-pg-test-listen"
|
|
50
|
+
+ })
|
|
51
|
+
+ yield* Effect.addFinalizer(() => Effect.promise(() => pool.end()))
|
|
52
|
+
+
|
|
53
|
+
+ const client = yield* PgClient.fromPool({
|
|
54
|
+
+ acquire: Effect.succeed(pool)
|
|
55
|
+
+ }).pipe(
|
|
56
|
+
+ Effect.provide(Reactivity.layer)
|
|
57
|
+
+ )
|
|
58
|
+
+
|
|
59
|
+
+ const channel = \`listen_\${Date.now()}_\${Math.random().toString(36).slice(2)}\`
|
|
60
|
+
+ const listener = yield* client.listen(channel).pipe(
|
|
61
|
+
+ Stream.take(1),
|
|
62
|
+
+ Stream.runHead,
|
|
63
|
+
+ Effect.forkScoped
|
|
64
|
+
+ )
|
|
65
|
+
+
|
|
66
|
+
+ yield* Effect.sleep(200)
|
|
67
|
+
+ assert.strictEqual(pool.totalCount, 0)
|
|
68
|
+
+
|
|
69
|
+
+ const rows = yield* client<{ value: number }>(\`SELECT 1 AS value\`).pipe(
|
|
70
|
+
+ Effect.timeoutFail({
|
|
71
|
+
+ duration: "3 seconds",
|
|
72
|
+
+ onTimeout: () => new Error("query timed out while listen was active")
|
|
73
|
+
+ })
|
|
74
|
+
+ )
|
|
75
|
+
+ assert.deepEqual(rows, [{ value: 1 }])
|
|
76
|
+
+
|
|
77
|
+
+ yield* client.notify(channel, "payload")
|
|
78
|
+
+ const message = yield* Fiber.join(listener)
|
|
79
|
+
+ assert.deepEqual(message, Option.some("payload"))
|
|
80
|
+
+ })
|
|
81
|
+
+ ))
|
|
82
|
+
+})
|
|
83
|
+
*** Add File: .changeset/ten-pens-rule.md
|
|
84
|
+
+---
|
|
85
|
+
+"@effect/sql-pg": patch
|
|
86
|
+
+---
|
|
87
|
+
+
|
|
88
|
+
+Change \`PgClient.listen\` to use a dedicated PostgreSQL connection instead of reserving one from the pool.
|
|
89
|
+
*** End Patch`
|
|
90
|
+
console.log(await applyPatch(patch))
|