refactor(cli): drop redundant explicit Effect.ensuring(store.dispose) (#25503)
This commit is contained in:
@@ -11,7 +11,6 @@ import { Permission } from "../../../permission"
|
|||||||
import { iife } from "../../../util/iife"
|
import { iife } from "../../../util/iife"
|
||||||
import { effectCmd, fail } from "../../effect-cmd"
|
import { effectCmd, fail } from "../../effect-cmd"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
import { InstanceRef } from "@/effect/instance-ref"
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
import type { InstanceContext } from "@/project/instance"
|
import type { InstanceContext } from "@/project/instance"
|
||||||
|
|
||||||
export const AgentCommand = effectCmd({
|
export const AgentCommand = effectCmd({
|
||||||
@@ -35,8 +34,7 @@ export const AgentCommand = effectCmd({
|
|||||||
handler: Effect.fn("Cli.debug.agent")(function* (args) {
|
handler: Effect.fn("Cli.debug.agent")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const ctx = yield* InstanceRef
|
||||||
if (!ctx) return
|
if (!ctx) return
|
||||||
const store = yield* InstanceStore.Service
|
return yield* run(args, ctx)
|
||||||
return yield* run(args, ctx).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -2,20 +2,13 @@ import { EOL } from "os"
|
|||||||
import { Effect } from "effect"
|
import { Effect } from "effect"
|
||||||
import { Config } from "@/config/config"
|
import { Config } from "@/config/config"
|
||||||
import { effectCmd } from "../../effect-cmd"
|
import { effectCmd } from "../../effect-cmd"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
export const ConfigCommand = effectCmd({
|
export const ConfigCommand = effectCmd({
|
||||||
command: "config",
|
command: "config",
|
||||||
describe: "show resolved configuration",
|
describe: "show resolved configuration",
|
||||||
builder: (yargs) => yargs,
|
builder: (yargs) => yargs,
|
||||||
handler: Effect.fn("Cli.debug.config")(function* () {
|
handler: Effect.fn("Cli.debug.config")(function* () {
|
||||||
const ctx = yield* InstanceRef
|
const config = yield* Config.Service.use((cfg) => cfg.get())
|
||||||
if (!ctx) return
|
process.stdout.write(JSON.stringify(config, null, 2) + EOL)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const config = yield* Config.Service.use((cfg) => cfg.get())
|
|
||||||
process.stdout.write(JSON.stringify(config, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import { File } from "../../../file"
|
|||||||
import { Ripgrep } from "@/file/ripgrep"
|
import { Ripgrep } from "@/file/ripgrep"
|
||||||
import { effectCmd } from "../../effect-cmd"
|
import { effectCmd } from "../../effect-cmd"
|
||||||
import { cmd } from "../cmd"
|
import { cmd } from "../cmd"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
const FileSearchCommand = effectCmd({
|
const FileSearchCommand = effectCmd({
|
||||||
command: "search <query>",
|
command: "search <query>",
|
||||||
@@ -17,13 +15,8 @@ const FileSearchCommand = effectCmd({
|
|||||||
description: "Search query",
|
description: "Search query",
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.debug.file.search")(function* (args) {
|
handler: Effect.fn("Cli.debug.file.search")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const results = yield* File.Service.use((svc) => svc.search({ query: args.query }))
|
||||||
if (!ctx) return
|
process.stdout.write(results.join(EOL) + EOL)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const results = yield* File.Service.use((svc) => svc.search({ query: args.query }))
|
|
||||||
process.stdout.write(results.join(EOL) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -37,13 +30,8 @@ const FileReadCommand = effectCmd({
|
|||||||
description: "File path to read",
|
description: "File path to read",
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.debug.file.read")(function* (args) {
|
handler: Effect.fn("Cli.debug.file.read")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const content = yield* File.Service.use((svc) => svc.read(args.path))
|
||||||
if (!ctx) return
|
process.stdout.write(JSON.stringify(content, null, 2) + EOL)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const content = yield* File.Service.use((svc) => svc.read(args.path))
|
|
||||||
process.stdout.write(JSON.stringify(content, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -52,13 +40,8 @@ const FileStatusCommand = effectCmd({
|
|||||||
describe: "show file status information",
|
describe: "show file status information",
|
||||||
builder: (yargs) => yargs,
|
builder: (yargs) => yargs,
|
||||||
handler: Effect.fn("Cli.debug.file.status")(function* () {
|
handler: Effect.fn("Cli.debug.file.status")(function* () {
|
||||||
const ctx = yield* InstanceRef
|
const status = yield* File.Service.use((svc) => svc.status())
|
||||||
if (!ctx) return
|
process.stdout.write(JSON.stringify(status, null, 2) + EOL)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const status = yield* File.Service.use((svc) => svc.status())
|
|
||||||
process.stdout.write(JSON.stringify(status, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -72,13 +55,8 @@ const FileListCommand = effectCmd({
|
|||||||
description: "File path to list",
|
description: "File path to list",
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.debug.file.list")(function* (args) {
|
handler: Effect.fn("Cli.debug.file.list")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const files = yield* File.Service.use((svc) => svc.list(args.path))
|
||||||
if (!ctx) return
|
process.stdout.write(JSON.stringify(files, null, 2) + EOL)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const files = yield* File.Service.use((svc) => svc.list(args.path))
|
|
||||||
process.stdout.write(JSON.stringify(files, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -92,13 +70,8 @@ const FileTreeCommand = effectCmd({
|
|||||||
default: process.cwd(),
|
default: process.cwd(),
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.debug.file.tree")(function* (args) {
|
handler: Effect.fn("Cli.debug.file.tree")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const tree = yield* Effect.orDie(Ripgrep.Service.use((svc) => svc.tree({ cwd: args.dir, limit: 200 })))
|
||||||
if (!ctx) return
|
console.log(JSON.stringify(tree, null, 2))
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const tree = yield* Effect.orDie(Ripgrep.Service.use((svc) => svc.tree({ cwd: args.dir, limit: 200 })))
|
|
||||||
console.log(JSON.stringify(tree, null, 2))
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import { effectCmd } from "../../effect-cmd"
|
|||||||
import { cmd } from "../cmd"
|
import { cmd } from "../cmd"
|
||||||
import * as Log from "@opencode-ai/core/util/log"
|
import * as Log from "@opencode-ai/core/util/log"
|
||||||
import { EOL } from "os"
|
import { EOL } from "os"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
export const LSPCommand = cmd({
|
export const LSPCommand = cmd({
|
||||||
command: "lsp",
|
command: "lsp",
|
||||||
@@ -20,18 +18,13 @@ const DiagnosticsCommand = effectCmd({
|
|||||||
describe: "get diagnostics for a file",
|
describe: "get diagnostics for a file",
|
||||||
builder: (yargs) => yargs.positional("file", { type: "string", demandOption: true }),
|
builder: (yargs) => yargs.positional("file", { type: "string", demandOption: true }),
|
||||||
handler: Effect.fn("Cli.debug.lsp.diagnostics")(function* (args) {
|
handler: Effect.fn("Cli.debug.lsp.diagnostics")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const out = yield* LSP.Service.use((lsp) =>
|
||||||
if (!ctx) return
|
Effect.gen(function* () {
|
||||||
const store = yield* InstanceStore.Service
|
yield* lsp.touchFile(args.file, "full")
|
||||||
return yield* Effect.gen(function* () {
|
return yield* lsp.diagnostics()
|
||||||
const out = yield* LSP.Service.use((lsp) =>
|
}),
|
||||||
Effect.gen(function* () {
|
)
|
||||||
yield* lsp.touchFile(args.file, "full")
|
process.stdout.write(JSON.stringify(out, null, 2) + EOL)
|
||||||
return yield* lsp.diagnostics()
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
process.stdout.write(JSON.stringify(out, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -40,14 +33,9 @@ export const SymbolsCommand = effectCmd({
|
|||||||
describe: "search workspace symbols",
|
describe: "search workspace symbols",
|
||||||
builder: (yargs) => yargs.positional("query", { type: "string", demandOption: true }),
|
builder: (yargs) => yargs.positional("query", { type: "string", demandOption: true }),
|
||||||
handler: Effect.fn("Cli.debug.lsp.symbols")(function* (args) {
|
handler: Effect.fn("Cli.debug.lsp.symbols")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
using _ = Log.Default.time("symbols")
|
||||||
if (!ctx) return
|
const results = yield* LSP.Service.use((lsp) => lsp.workspaceSymbol(args.query))
|
||||||
const store = yield* InstanceStore.Service
|
process.stdout.write(JSON.stringify(results, null, 2) + EOL)
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
using _ = Log.Default.time("symbols")
|
|
||||||
const results = yield* LSP.Service.use((lsp) => lsp.workspaceSymbol(args.query))
|
|
||||||
process.stdout.write(JSON.stringify(results, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -56,13 +44,8 @@ export const DocumentSymbolsCommand = effectCmd({
|
|||||||
describe: "get symbols from a document",
|
describe: "get symbols from a document",
|
||||||
builder: (yargs) => yargs.positional("uri", { type: "string", demandOption: true }),
|
builder: (yargs) => yargs.positional("uri", { type: "string", demandOption: true }),
|
||||||
handler: Effect.fn("Cli.debug.lsp.documentSymbols")(function* (args) {
|
handler: Effect.fn("Cli.debug.lsp.documentSymbols")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
using _ = Log.Default.time("document-symbols")
|
||||||
if (!ctx) return
|
const results = yield* LSP.Service.use((lsp) => lsp.documentSymbol(args.uri))
|
||||||
const store = yield* InstanceStore.Service
|
process.stdout.write(JSON.stringify(results, null, 2) + EOL)
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
using _ = Log.Default.time("document-symbols")
|
|
||||||
const results = yield* LSP.Service.use((lsp) => lsp.documentSymbol(args.uri))
|
|
||||||
process.stdout.write(JSON.stringify(results, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { Ripgrep } from "../../../file/ripgrep"
|
|||||||
import { effectCmd } from "../../effect-cmd"
|
import { effectCmd } from "../../effect-cmd"
|
||||||
import { cmd } from "../cmd"
|
import { cmd } from "../cmd"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
import { InstanceRef } from "@/effect/instance-ref"
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
export const RipgrepCommand = cmd({
|
export const RipgrepCommand = cmd({
|
||||||
command: "rg",
|
command: "rg",
|
||||||
@@ -23,13 +22,10 @@ const TreeCommand = effectCmd({
|
|||||||
handler: Effect.fn("Cli.debug.rg.tree")(function* (args) {
|
handler: Effect.fn("Cli.debug.rg.tree")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const ctx = yield* InstanceRef
|
||||||
if (!ctx) return
|
if (!ctx) return
|
||||||
const store = yield* InstanceStore.Service
|
const tree = yield* Effect.orDie(
|
||||||
return yield* Effect.gen(function* () {
|
Ripgrep.Service.use((svc) => svc.tree({ cwd: ctx.directory, limit: args.limit })),
|
||||||
const tree = yield* Effect.orDie(
|
)
|
||||||
Ripgrep.Service.use((svc) => svc.tree({ cwd: ctx.directory, limit: args.limit })),
|
process.stdout.write(tree + EOL)
|
||||||
)
|
|
||||||
process.stdout.write(tree + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -53,22 +49,19 @@ const FilesCommand = effectCmd({
|
|||||||
handler: Effect.fn("Cli.debug.rg.files")(function* (args) {
|
handler: Effect.fn("Cli.debug.rg.files")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const ctx = yield* InstanceRef
|
||||||
if (!ctx) return
|
if (!ctx) return
|
||||||
const store = yield* InstanceStore.Service
|
const rg = yield* Ripgrep.Service
|
||||||
return yield* Effect.gen(function* () {
|
const files = yield* rg
|
||||||
const rg = yield* Ripgrep.Service
|
.files({
|
||||||
const files = yield* rg
|
cwd: ctx.directory,
|
||||||
.files({
|
glob: args.glob ? [args.glob] : undefined,
|
||||||
cwd: ctx.directory,
|
})
|
||||||
glob: args.glob ? [args.glob] : undefined,
|
.pipe(
|
||||||
})
|
Stream.take(args.limit ?? Infinity),
|
||||||
.pipe(
|
Stream.runCollect,
|
||||||
Stream.take(args.limit ?? Infinity),
|
Effect.map((c) => [...c]),
|
||||||
Stream.runCollect,
|
Effect.orDie,
|
||||||
Effect.map((c) => [...c]),
|
)
|
||||||
Effect.orDie,
|
process.stdout.write(files.join(EOL) + EOL)
|
||||||
)
|
|
||||||
process.stdout.write(files.join(EOL) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -93,19 +86,16 @@ const SearchCommand = effectCmd({
|
|||||||
handler: Effect.fn("Cli.debug.rg.search")(function* (args) {
|
handler: Effect.fn("Cli.debug.rg.search")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const ctx = yield* InstanceRef
|
||||||
if (!ctx) return
|
if (!ctx) return
|
||||||
const store = yield* InstanceStore.Service
|
const results = yield* Effect.orDie(
|
||||||
return yield* Effect.gen(function* () {
|
Ripgrep.Service.use((svc) =>
|
||||||
const results = yield* Effect.orDie(
|
svc.search({
|
||||||
Ripgrep.Service.use((svc) =>
|
cwd: ctx.directory,
|
||||||
svc.search({
|
pattern: args.pattern,
|
||||||
cwd: ctx.directory,
|
glob: args.glob as string[] | undefined,
|
||||||
pattern: args.pattern,
|
limit: args.limit,
|
||||||
glob: args.glob as string[] | undefined,
|
}),
|
||||||
limit: args.limit,
|
),
|
||||||
}),
|
)
|
||||||
),
|
process.stdout.write(JSON.stringify(results.items, null, 2) + EOL)
|
||||||
)
|
|
||||||
process.stdout.write(JSON.stringify(results.items, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -2,21 +2,14 @@ import { EOL } from "os"
|
|||||||
import { Effect } from "effect"
|
import { Effect } from "effect"
|
||||||
import { Skill } from "../../../skill"
|
import { Skill } from "../../../skill"
|
||||||
import { effectCmd } from "../../effect-cmd"
|
import { effectCmd } from "../../effect-cmd"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
export const SkillCommand = effectCmd({
|
export const SkillCommand = effectCmd({
|
||||||
command: "skill",
|
command: "skill",
|
||||||
describe: "list all available skills",
|
describe: "list all available skills",
|
||||||
builder: (yargs) => yargs,
|
builder: (yargs) => yargs,
|
||||||
handler: Effect.fn("Cli.debug.skill")(function* () {
|
handler: Effect.fn("Cli.debug.skill")(function* () {
|
||||||
const ctx = yield* InstanceRef
|
const skill = yield* Skill.Service
|
||||||
if (!ctx) return
|
const skills = yield* skill.all()
|
||||||
const store = yield* InstanceStore.Service
|
process.stdout.write(JSON.stringify(skills, null, 2) + EOL)
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const skill = yield* Skill.Service
|
|
||||||
const skills = yield* skill.all()
|
|
||||||
process.stdout.write(JSON.stringify(skills, null, 2) + EOL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ import { Effect } from "effect"
|
|||||||
import { Snapshot } from "../../../snapshot"
|
import { Snapshot } from "../../../snapshot"
|
||||||
import { effectCmd } from "../../effect-cmd"
|
import { effectCmd } from "../../effect-cmd"
|
||||||
import { cmd } from "../cmd"
|
import { cmd } from "../cmd"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
export const SnapshotCommand = cmd({
|
export const SnapshotCommand = cmd({
|
||||||
command: "snapshot",
|
command: "snapshot",
|
||||||
@@ -16,13 +14,8 @@ const TrackCommand = effectCmd({
|
|||||||
command: "track",
|
command: "track",
|
||||||
describe: "track current snapshot state",
|
describe: "track current snapshot state",
|
||||||
handler: Effect.fn("Cli.debug.snapshot.track")(function* () {
|
handler: Effect.fn("Cli.debug.snapshot.track")(function* () {
|
||||||
const ctx = yield* InstanceRef
|
const out = yield* Snapshot.Service.use((svc) => svc.track())
|
||||||
if (!ctx) return
|
console.log(out)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const out = yield* Snapshot.Service.use((svc) => svc.track())
|
|
||||||
console.log(out)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -36,13 +29,8 @@ const PatchCommand = effectCmd({
|
|||||||
demandOption: true,
|
demandOption: true,
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.debug.snapshot.patch")(function* (args) {
|
handler: Effect.fn("Cli.debug.snapshot.patch")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const out = yield* Snapshot.Service.use((svc) => svc.patch(args.hash))
|
||||||
if (!ctx) return
|
console.log(out)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const out = yield* Snapshot.Service.use((svc) => svc.patch(args.hash))
|
|
||||||
console.log(out)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -56,12 +44,7 @@ const DiffCommand = effectCmd({
|
|||||||
demandOption: true,
|
demandOption: true,
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.debug.snapshot.diff")(function* (args) {
|
handler: Effect.fn("Cli.debug.snapshot.diff")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const out = yield* Snapshot.Service.use((svc) => svc.diff(args.hash))
|
||||||
if (!ctx) return
|
console.log(out)
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const out = yield* Snapshot.Service.use((svc) => svc.diff(args.hash))
|
|
||||||
console.log(out)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import { UI } from "../ui"
|
|||||||
import * as prompts from "@clack/prompts"
|
import * as prompts from "@clack/prompts"
|
||||||
import { EOL } from "os"
|
import { EOL } from "os"
|
||||||
import { Effect } from "effect"
|
import { Effect } from "effect"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
function redact(kind: string, id: string, value: string) {
|
function redact(kind: string, id: string, value: string) {
|
||||||
return value.trim() ? `[redacted:${kind}:${id}]` : value
|
return value.trim() ? `[redacted:${kind}:${id}]` : value
|
||||||
@@ -234,10 +232,7 @@ export const ExportCommand = effectCmd({
|
|||||||
type: "boolean",
|
type: "boolean",
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.export")(function* (args) {
|
handler: Effect.fn("Cli.export")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
return yield* run(args)
|
||||||
if (!ctx) return
|
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* run(args).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { CliError, effectCmd } from "../effect-cmd"
|
|||||||
import { Database } from "@/storage/db"
|
import { Database } from "@/storage/db"
|
||||||
import { SessionTable, MessageTable, PartTable } from "../../session/session.sql"
|
import { SessionTable, MessageTable, PartTable } from "../../session/session.sql"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
import { InstanceRef } from "@/effect/instance-ref"
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
import { ShareNext } from "@/share/share-next"
|
import { ShareNext } from "@/share/share-next"
|
||||||
import { EOL } from "os"
|
import { EOL } from "os"
|
||||||
import { Filesystem } from "@/util/filesystem"
|
import { Filesystem } from "@/util/filesystem"
|
||||||
@@ -88,13 +87,9 @@ export const ImportCommand = effectCmd({
|
|||||||
demandOption: true,
|
demandOption: true,
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.import")(function* (args) {
|
handler: Effect.fn("Cli.import")(function* (args) {
|
||||||
// effectCmd always provides InstanceRef via InstanceStore.Service.provide; this is an invariant.
|
|
||||||
const ctx = yield* InstanceRef
|
const ctx = yield* InstanceRef
|
||||||
if (!ctx) return yield* Effect.die("InstanceRef not provided")
|
if (!ctx) return yield* Effect.die("InstanceRef not provided")
|
||||||
const store = yield* InstanceStore.Service
|
return yield* runImport(args.file, ctx.project.id)
|
||||||
// Ensure store.dispose runs disposers and emits server.instance.disposed
|
|
||||||
// on every exit path: success, early return, typed failure, defect, interrupt.
|
|
||||||
return yield* runImport(args.file, ctx.project.id).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ import { Process } from "@/util/process"
|
|||||||
import { EOL } from "os"
|
import { EOL } from "os"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
import { which } from "../../util/which"
|
import { which } from "../../util/which"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
|
|
||||||
function pagerCmd(): string[] {
|
function pagerCmd(): string[] {
|
||||||
const lessOptions = ["-R", "-S"]
|
const lessOptions = ["-R", "-S"]
|
||||||
@@ -59,17 +57,12 @@ export const SessionDeleteCommand = effectCmd({
|
|||||||
demandOption: true,
|
demandOption: true,
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.session.delete")(function* (args) {
|
handler: Effect.fn("Cli.session.delete")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const svc = yield* Session.Service
|
||||||
if (!ctx) return
|
const sessionID = SessionID.make(args.sessionID)
|
||||||
const store = yield* InstanceStore.Service
|
// Match legacy try/catch — Session.get surfaces NotFoundError as a defect.
|
||||||
return yield* Effect.gen(function* () {
|
yield* svc.get(sessionID).pipe(Effect.catchCause(() => fail(`Session not found: ${args.sessionID}`)))
|
||||||
const svc = yield* Session.Service
|
yield* svc.remove(sessionID)
|
||||||
const sessionID = SessionID.make(args.sessionID)
|
UI.println(UI.Style.TEXT_SUCCESS_BOLD + `Session ${args.sessionID} deleted` + UI.Style.TEXT_NORMAL)
|
||||||
// Match legacy try/catch — Session.get surfaces NotFoundError as a defect.
|
|
||||||
yield* svc.get(sessionID).pipe(Effect.catchCause(() => fail(`Session not found: ${args.sessionID}`)))
|
|
||||||
yield* svc.remove(sessionID)
|
|
||||||
UI.println(UI.Style.TEXT_SUCCESS_BOLD + `Session ${args.sessionID} deleted` + UI.Style.TEXT_NORMAL)
|
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -90,39 +83,34 @@ export const SessionListCommand = effectCmd({
|
|||||||
default: "table",
|
default: "table",
|
||||||
}),
|
}),
|
||||||
handler: Effect.fn("Cli.session.list")(function* (args) {
|
handler: Effect.fn("Cli.session.list")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const sessions = yield* Session.Service.use((svc) => svc.list({ roots: true, limit: args.maxCount }))
|
||||||
if (!ctx) return
|
|
||||||
const store = yield* InstanceStore.Service
|
|
||||||
return yield* Effect.gen(function* () {
|
|
||||||
const sessions = yield* Session.Service.use((svc) => svc.list({ roots: true, limit: args.maxCount }))
|
|
||||||
|
|
||||||
if (sessions.length === 0) return
|
if (sessions.length === 0) return
|
||||||
|
|
||||||
const output = args.format === "json" ? formatSessionJSON(sessions) : formatSessionTable(sessions)
|
const output = args.format === "json" ? formatSessionJSON(sessions) : formatSessionTable(sessions)
|
||||||
|
|
||||||
const shouldPaginate = process.stdout.isTTY && !args.maxCount && args.format === "table"
|
const shouldPaginate = process.stdout.isTTY && !args.maxCount && args.format === "table"
|
||||||
|
|
||||||
if (shouldPaginate) {
|
if (shouldPaginate) {
|
||||||
yield* Effect.promise(async () => {
|
yield* Effect.promise(async () => {
|
||||||
const proc = Process.spawn(pagerCmd(), {
|
const proc = Process.spawn(pagerCmd(), {
|
||||||
stdin: "pipe",
|
stdin: "pipe",
|
||||||
stdout: "inherit",
|
stdout: "inherit",
|
||||||
stderr: "inherit",
|
stderr: "inherit",
|
||||||
})
|
|
||||||
|
|
||||||
if (!proc.stdin) {
|
|
||||||
console.log(output)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
proc.stdin.write(output)
|
|
||||||
proc.stdin.end()
|
|
||||||
await proc.exited
|
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
console.log(output)
|
if (!proc.stdin) {
|
||||||
}
|
console.log(output)
|
||||||
}).pipe(Effect.ensuring(store.dispose(ctx)))
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
proc.stdin.write(output)
|
||||||
|
proc.stdin.end()
|
||||||
|
await proc.exited
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
console.log(output)
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import { Database } from "@/storage/db"
|
|||||||
import { SessionTable } from "../../session/session.sql"
|
import { SessionTable } from "../../session/session.sql"
|
||||||
import { Project } from "@/project/project"
|
import { Project } from "@/project/project"
|
||||||
import { InstanceRef } from "@/effect/instance-ref"
|
import { InstanceRef } from "@/effect/instance-ref"
|
||||||
import { InstanceStore } from "@/project/instance-store"
|
|
||||||
import { AppRuntime } from "@/effect/app-runtime"
|
import { AppRuntime } from "@/effect/app-runtime"
|
||||||
|
|
||||||
interface SessionStats {
|
interface SessionStats {
|
||||||
@@ -70,8 +69,7 @@ export const StatsCommand = effectCmd({
|
|||||||
handler: Effect.fn("Cli.stats")(function* (args) {
|
handler: Effect.fn("Cli.stats")(function* (args) {
|
||||||
const ctx = yield* InstanceRef
|
const ctx = yield* InstanceRef
|
||||||
if (!ctx) return
|
if (!ctx) return
|
||||||
const store = yield* InstanceStore.Service
|
return yield* run(args, ctx.project)
|
||||||
return yield* run(args, ctx.project).pipe(Effect.ensuring(store.dispose(ctx)))
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user