clanka 0.2.21 → 0.2.22

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/cli.js CHANGED
@@ -2,6 +2,8 @@
2
2
  import * as Effect from "effect/Effect";
3
3
  import * as Prompt from "effect/unstable/cli/Prompt";
4
4
  import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
5
+ import * as Command from "effect/unstable/cli/Command";
6
+ import * as Flag from "effect/unstable/cli/Flag";
5
7
  import * as NodeServices from "@effect/platform-node/NodeServices";
6
8
  import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
7
9
  import * as NodeSocket from "@effect/platform-node/NodeSocket";
@@ -19,6 +21,35 @@ import * as KeyValueStore from "effect/unstable/persistence/KeyValueStore";
19
21
  import * as SemanticSearch from "./SemanticSearch.js";
20
22
  import * as Option from "effect/Option";
21
23
  import { OpenAiClient, OpenAiEmbeddingModel } from "@effect/ai-openai";
24
+ const provider = Flag.choice("provider", ["openai", "copilot"]).pipe(Flag.withAlias("p"), Flag.withFallbackPrompt(Prompt.select({
25
+ message: "Select a provider",
26
+ choices: [
27
+ {
28
+ title: "openai",
29
+ value: "openai",
30
+ selected: true,
31
+ },
32
+ {
33
+ title: "copilot",
34
+ value: "copilot",
35
+ },
36
+ ],
37
+ })));
38
+ const model = Flag.string("model").pipe(Flag.withAlias("m"), Flag.withFallbackPrompt(Prompt.text({
39
+ message: "Enter a model",
40
+ default: "gpt-5.4/medium",
41
+ validate(value) {
42
+ const parts = value.split("/");
43
+ if (parts.length !== 2) {
44
+ return Effect.fail("Invalid model");
45
+ }
46
+ return Effect.succeed(value);
47
+ },
48
+ })));
49
+ const semantic = Flag.boolean("search").pipe(Flag.withDescription("Use semantic search? (uses OPENAI_API_KEY env var)"), Flag.withAlias("s"), Flag.withFallbackPrompt(Prompt.confirm({
50
+ message: "Use semantic search? (uses OPENAI_API_KEY env var)",
51
+ })));
52
+ const prompt = Flag.string("prompt").pipe(Flag.withDescription("Pass a prompt in non-interactive mode"), Flag.withAlias("p"), Flag.optional);
22
53
  const Kvs = Layer.unwrap(Effect.gen(function* () {
23
54
  const path = yield* Path.Path;
24
55
  const configHome = yield* Config.nonEmptyString("XDG_CONFIG_HOME").pipe(Config.orElse(() => Config.nonEmptyString("HOME").pipe(Config.map((home) => path.join(home, ".config")))));
@@ -40,36 +71,8 @@ const Search = Layer.unwrap(Effect.gen(function* () {
40
71
  apiKey: apiKey.value,
41
72
  })));
42
73
  })).pipe(Layer.provide([NodeServices.layer, NodeHttpClient.layerUndici]));
43
- Effect.gen(function* () {
74
+ Command.make("clanka", { provider, model, semantic, prompt }).pipe(Command.withHandler(Effect.fnUntraced(function* ({ provider, model: modelRaw, semantic, prompt: nonInteractivePrompt, }) {
44
75
  const stdio = yield* Stdio.Stdio;
45
- const provider = yield* Prompt.select({
46
- message: "Select a provider",
47
- choices: [
48
- {
49
- title: "openai",
50
- value: "openai",
51
- selected: true,
52
- },
53
- {
54
- title: "copilot",
55
- value: "copilot",
56
- },
57
- ],
58
- });
59
- const modelRaw = yield* Prompt.text({
60
- message: "Enter a model",
61
- default: "gpt-5.4/medium",
62
- validate(value) {
63
- const parts = value.split("/");
64
- if (parts.length !== 2) {
65
- return Effect.fail("Invalid model");
66
- }
67
- return Effect.succeed(value);
68
- },
69
- });
70
- const semantic = yield* Prompt.confirm({
71
- message: "Use semantic search? (uses OPENAI_API_KEY env var)",
72
- });
73
76
  const [model, reasoning] = modelRaw.split("/");
74
77
  const Model = provider === "openai"
75
78
  ? Codex.modelWebSocket(model, {
@@ -92,6 +95,9 @@ Effect.gen(function* () {
92
95
  }))), Layer.provide(Copilot.layerClient));
93
96
  return yield* Effect.gen(function* () {
94
97
  const agent = yield* Agent.Agent;
98
+ if (Option.isSome(nonInteractivePrompt)) {
99
+ return yield* pipe(agent.send({ prompt: nonInteractivePrompt.value }), Stream.unwrap, OutputFormatter.pretty({ outputTruncation: 30 }), Stream.run(stdio.stdout()));
100
+ }
95
101
  while (true) {
96
102
  const prompt = yield* Prompt.text({
97
103
  message: ">",
@@ -106,7 +112,9 @@ Effect.gen(function* () {
106
112
  Model,
107
113
  semantic ? Search : Layer.empty,
108
114
  ]));
109
- }).pipe(Effect.provide([
115
+ })), Command.run({
116
+ version: "0.0.1",
117
+ }), Effect.provide([
110
118
  NodeServices.layer,
111
119
  Kvs,
112
120
  NodeHttpClient.layerUndici,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "clanka",
3
3
  "type": "module",
4
- "version": "0.2.21",
4
+ "version": "0.2.22",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
package/src/cli.ts CHANGED
@@ -2,6 +2,8 @@
2
2
  import * as Effect from "effect/Effect"
3
3
  import * as Prompt from "effect/unstable/cli/Prompt"
4
4
  import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient"
5
+ import * as Command from "effect/unstable/cli/Command"
6
+ import * as Flag from "effect/unstable/cli/Flag"
5
7
  import * as NodeServices from "@effect/platform-node/NodeServices"
6
8
  import * as NodeRuntime from "@effect/platform-node/NodeRuntime"
7
9
  import * as NodeSocket from "@effect/platform-node/NodeSocket"
@@ -20,6 +22,59 @@ import * as SemanticSearch from "./SemanticSearch.ts"
20
22
  import * as Option from "effect/Option"
21
23
  import { OpenAiClient, OpenAiEmbeddingModel } from "@effect/ai-openai"
22
24
 
25
+ const provider = Flag.choice("provider", ["openai", "copilot"]).pipe(
26
+ Flag.withAlias("p"),
27
+ Flag.withFallbackPrompt(
28
+ Prompt.select({
29
+ message: "Select a provider",
30
+ choices: [
31
+ {
32
+ title: "openai",
33
+ value: "openai",
34
+ selected: true,
35
+ },
36
+ {
37
+ title: "copilot",
38
+ value: "copilot",
39
+ },
40
+ ],
41
+ }),
42
+ ),
43
+ )
44
+
45
+ const model = Flag.string("model").pipe(
46
+ Flag.withAlias("m"),
47
+ Flag.withFallbackPrompt(
48
+ Prompt.text({
49
+ message: "Enter a model",
50
+ default: "gpt-5.4/medium",
51
+ validate(value) {
52
+ const parts = value.split("/")
53
+ if (parts.length !== 2) {
54
+ return Effect.fail("Invalid model")
55
+ }
56
+ return Effect.succeed(value)
57
+ },
58
+ }),
59
+ ),
60
+ )
61
+
62
+ const semantic = Flag.boolean("search").pipe(
63
+ Flag.withDescription("Use semantic search? (uses OPENAI_API_KEY env var)"),
64
+ Flag.withAlias("s"),
65
+ Flag.withFallbackPrompt(
66
+ Prompt.confirm({
67
+ message: "Use semantic search? (uses OPENAI_API_KEY env var)",
68
+ }),
69
+ ),
70
+ )
71
+
72
+ const prompt = Flag.string("prompt").pipe(
73
+ Flag.withDescription("Pass a prompt in non-interactive mode"),
74
+ Flag.withAlias("p"),
75
+ Flag.optional,
76
+ )
77
+
23
78
  const Kvs = Layer.unwrap(
24
79
  Effect.gen(function* () {
25
80
  const path = yield* Path.Path
@@ -64,101 +119,91 @@ const Search = Layer.unwrap(
64
119
  }),
65
120
  ).pipe(Layer.provide([NodeServices.layer, NodeHttpClient.layerUndici]))
66
121
 
67
- Effect.gen(function* () {
68
- const stdio = yield* Stdio.Stdio
122
+ Command.make("clanka", { provider, model, semantic, prompt }).pipe(
123
+ Command.withHandler(
124
+ Effect.fnUntraced(function* ({
125
+ provider,
126
+ model: modelRaw,
127
+ semantic,
128
+ prompt: nonInteractivePrompt,
129
+ }) {
130
+ const stdio = yield* Stdio.Stdio
131
+ const [model, reasoning] = modelRaw.split("/") as [string, string]
132
+ const Model =
133
+ provider === "openai"
134
+ ? Codex.modelWebSocket(model, {
135
+ reasoning: {
136
+ effort: reasoning as any,
137
+ },
138
+ }).pipe(
139
+ Layer.merge(
140
+ Agent.layerSubagentModel(
141
+ Codex.modelWebSocket("gpt-5.4-mini", {
142
+ reasoning: {
143
+ effort: "high",
144
+ },
145
+ }),
146
+ ),
147
+ ),
148
+ Layer.provide(Codex.layerClient),
149
+ )
150
+ : Copilot.model(model, {
151
+ reasoning: {
152
+ effort: reasoning,
153
+ },
154
+ }).pipe(
155
+ Layer.merge(
156
+ Agent.layerSubagentModel(
157
+ Copilot.model(model, {
158
+ reasoning: {
159
+ effort: "medium",
160
+ },
161
+ }),
162
+ ),
163
+ ),
164
+ Layer.provide(Copilot.layerClient),
165
+ )
69
166
 
70
- const provider = yield* Prompt.select({
71
- message: "Select a provider",
72
- choices: [
73
- {
74
- title: "openai",
75
- value: "openai",
76
- selected: true,
77
- },
78
- {
79
- title: "copilot",
80
- value: "copilot",
81
- },
82
- ],
83
- })
84
- const modelRaw = yield* Prompt.text({
85
- message: "Enter a model",
86
- default: "gpt-5.4/medium",
87
- validate(value) {
88
- const parts = value.split("/")
89
- if (parts.length !== 2) {
90
- return Effect.fail("Invalid model")
91
- }
92
- return Effect.succeed(value)
93
- },
94
- })
95
- const semantic = yield* Prompt.confirm({
96
- message: "Use semantic search? (uses OPENAI_API_KEY env var)",
97
- })
98
-
99
- const [model, reasoning] = modelRaw.split("/") as [string, string]
100
- const Model =
101
- provider === "openai"
102
- ? Codex.modelWebSocket(model, {
103
- reasoning: {
104
- effort: reasoning as any,
105
- },
106
- }).pipe(
107
- Layer.merge(
108
- Agent.layerSubagentModel(
109
- Codex.modelWebSocket("gpt-5.4-mini", {
110
- reasoning: {
111
- effort: "high",
112
- },
113
- }),
114
- ),
115
- ),
116
- Layer.provide(Codex.layerClient),
117
- )
118
- : Copilot.model(model, {
119
- reasoning: {
120
- effort: reasoning,
121
- },
122
- }).pipe(
123
- Layer.merge(
124
- Agent.layerSubagentModel(
125
- Copilot.model(model, {
126
- reasoning: {
127
- effort: "medium",
128
- },
129
- }),
130
- ),
131
- ),
132
- Layer.provide(Copilot.layerClient),
133
- )
134
-
135
- return yield* Effect.gen(function* () {
136
- const agent = yield* Agent.Agent
137
-
138
- while (true) {
139
- const prompt = yield* Prompt.text({
140
- message: ">",
141
- })
142
-
143
- yield* pipe(
144
- agent.send({ prompt }),
145
- Stream.unwrap,
146
- OutputFormatter.pretty({ outputTruncation: 30 }),
147
- Stream.run(stdio.stdout()),
148
- )
167
+ return yield* Effect.gen(function* () {
168
+ const agent = yield* Agent.Agent
149
169
 
150
- console.log("")
151
- }
152
- }).pipe(
153
- Effect.provide([
154
- Agent.layerLocal({
155
- directory: process.cwd(),
156
- }),
157
- Model,
158
- semantic ? Search : Layer.empty,
159
- ]),
160
- )
161
- }).pipe(
170
+ if (Option.isSome(nonInteractivePrompt)) {
171
+ return yield* pipe(
172
+ agent.send({ prompt: nonInteractivePrompt.value }),
173
+ Stream.unwrap,
174
+ OutputFormatter.pretty({ outputTruncation: 30 }),
175
+ Stream.run(stdio.stdout()),
176
+ )
177
+ }
178
+
179
+ while (true) {
180
+ const prompt = yield* Prompt.text({
181
+ message: ">",
182
+ })
183
+
184
+ yield* pipe(
185
+ agent.send({ prompt }),
186
+ Stream.unwrap,
187
+ OutputFormatter.pretty({ outputTruncation: 30 }),
188
+ Stream.run(stdio.stdout()),
189
+ )
190
+
191
+ console.log("")
192
+ }
193
+ }).pipe(
194
+ Effect.provide([
195
+ Agent.layerLocal({
196
+ directory: process.cwd(),
197
+ }),
198
+ Model,
199
+ semantic ? Search : Layer.empty,
200
+ ]),
201
+ )
202
+ }),
203
+ ),
204
+ Command.run({
205
+ version: "0.0.1",
206
+ }),
162
207
  Effect.provide([
163
208
  NodeServices.layer,
164
209
  Kvs,