@codeworksh/cli 0.0.1-canary.10.1.g65d5c167

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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/acp-P_1Wqd-Z.mjs +494 -0
  4. package/acp-P_1Wqd-Z.mjs.map +1 -0
  5. package/add-DjJjtu0E.mjs +82 -0
  6. package/add-DjJjtu0E.mjs.map +1 -0
  7. package/catalog-BeNHJEEM.mjs +17 -0
  8. package/catalog-BeNHJEEM.mjs.map +1 -0
  9. package/check-CJtU790x.mjs +54 -0
  10. package/check-CJtU790x.mjs.map +1 -0
  11. package/entries-BXBULTVt.mjs +90 -0
  12. package/entries-BXBULTVt.mjs.map +1 -0
  13. package/error-CxoEKg-4.mjs +610 -0
  14. package/error-CxoEKg-4.mjs.map +1 -0
  15. package/harness-6d8TlAVk.mjs +19 -0
  16. package/harness-6d8TlAVk.mjs.map +1 -0
  17. package/index.mjs +39 -0
  18. package/index.mjs.map +1 -0
  19. package/install-CRsM-5h3.mjs +54 -0
  20. package/install-CRsM-5h3.mjs.map +1 -0
  21. package/link-orVe7_W5.mjs +41 -0
  22. package/link-orVe7_W5.mjs.map +1 -0
  23. package/list-B9t_qFIQ.mjs +77 -0
  24. package/list-B9t_qFIQ.mjs.map +1 -0
  25. package/list-C7YdESnc.mjs +30 -0
  26. package/list-C7YdESnc.mjs.map +1 -0
  27. package/login-zuKhmbS5.mjs +45 -0
  28. package/login-zuKhmbS5.mjs.map +1 -0
  29. package/logout-B0lXwmvv.mjs +29 -0
  30. package/logout-B0lXwmvv.mjs.map +1 -0
  31. package/package-KrQWL_Rw.mjs +6 -0
  32. package/package-KrQWL_Rw.mjs.map +1 -0
  33. package/package.json +54 -0
  34. package/providers-PNt4dpfv.mjs +17 -0
  35. package/providers-PNt4dpfv.mjs.map +1 -0
  36. package/refresh-FjH0oHND.mjs +17 -0
  37. package/refresh-FjH0oHND.mjs.map +1 -0
  38. package/refresh-xxKXjcRX.mjs +35 -0
  39. package/refresh-xxKXjcRX.mjs.map +1 -0
  40. package/reload-B2PxpO2s.mjs +26 -0
  41. package/reload-B2PxpO2s.mjs.map +1 -0
  42. package/remove-Deowzmc7.mjs +37 -0
  43. package/remove-Deowzmc7.mjs.map +1 -0
  44. package/run-DNRnGHYa.mjs +146 -0
  45. package/run-DNRnGHYa.mjs.map +1 -0
  46. package/runtime-BuFe9cOc.mjs +358 -0
  47. package/runtime-BuFe9cOc.mjs.map +1 -0
  48. package/serve-DfW0O2tr.mjs +300 -0
  49. package/serve-DfW0O2tr.mjs.map +1 -0
  50. package/settings-aqM_b9UE.mjs +221 -0
  51. package/settings-aqM_b9UE.mjs.map +1 -0
  52. package/shared-DN18qxOE.mjs +116 -0
  53. package/shared-DN18qxOE.mjs.map +1 -0
  54. package/status-Br21KEeh.mjs +31 -0
  55. package/status-Br21KEeh.mjs.map +1 -0
  56. package/update-qrQr-mJT.mjs +51 -0
  57. package/update-qrQr-mJT.mjs.map +1 -0
@@ -0,0 +1,116 @@
1
+ import { i as Cmd } from "./runtime-BuFe9cOc.mjs";
2
+ import { f as layer, n as OAuthError, t as InvalidInputError } from "./error-CxoEKg-4.mjs";
3
+ import { Effect, Option, Path } from "effect";
4
+ import { Global } from "@codeworksh/harness/effect";
5
+ import { checkOAuthProvider, oauthProviderLabel, summarizeGitHubCopilot, summarizeOpenAICodex } from "@codeworksh/aikit/oauth/summary";
6
+ import { GitHubCopilotOAuthClient, JsonGitHubCopilotAuthStorage } from "@codeworksh/aikit/oauth/github/copilot";
7
+ import { JsonOpenAICodexAuthStorage, OpenAICodexOAuthClient } from "@codeworksh/aikit/oauth/openai/codex";
8
+ import { openBrowser, promptLine } from "@codeworksh/aikit/oauth/interactive";
9
+ //#region src/cli/cmd/handlers/auth/shared.ts
10
+ const announce = (info, browser) => {
11
+ process.stderr.write(`${info.instructions ?? "Complete authentication in your browser."}\n${info.userCode === void 0 ? "" : `Enter code: ${info.userCode}\n`}${info.url}\n`);
12
+ if (browser) openBrowser(info.url, (error) => void process.stderr.write(`Failed to open browser: ${error.message}\n`));
13
+ };
14
+ /** Holds nothing: a server's credentials live on the server, not on this disk. */
15
+ const transient = {
16
+ get: async () => void 0,
17
+ set: async () => {},
18
+ clear: async () => {}
19
+ };
20
+ const codexOps = (storage, path) => {
21
+ const client = new OpenAICodexOAuthClient({ storage });
22
+ return {
23
+ path,
24
+ login: async (options) => {
25
+ const credentials = await client.login({
26
+ device: options.device,
27
+ onAuth: (info) => announce(info, options.browser),
28
+ onProgress: (message) => void process.stderr.write(`${message}\n`),
29
+ onPrompt: (prompt) => promptLine(prompt.message)
30
+ });
31
+ return {
32
+ wire: {
33
+ provider: "openai-codex",
34
+ ...credentials
35
+ },
36
+ summary: summarizeOpenAICodex(credentials)
37
+ };
38
+ },
39
+ stored: async () => {
40
+ const credentials = await storage.get();
41
+ return credentials && summarizeOpenAICodex(credentials);
42
+ },
43
+ refreshed: async () => {
44
+ const credentials = await client.getCredentials();
45
+ return credentials && summarizeOpenAICodex(credentials);
46
+ },
47
+ logout: () => client.logout()
48
+ };
49
+ };
50
+ const copilotOps = (storage, path) => {
51
+ const client = new GitHubCopilotOAuthClient({ storage });
52
+ const read = async () => {
53
+ const credentials = await storage.get();
54
+ return credentials && summarizeGitHubCopilot(credentials);
55
+ };
56
+ return {
57
+ path,
58
+ login: async (options) => {
59
+ const credentials = await client.login({
60
+ ...Option.isSome(options.enterprise) && { enterpriseUrl: options.enterprise.value },
61
+ enableModels: options.enableModels,
62
+ onAuth: (info) => announce(info, options.browser),
63
+ onProgress: (message) => void process.stderr.write(`${message}\n`)
64
+ });
65
+ return {
66
+ wire: {
67
+ provider: "github-copilot",
68
+ ...credentials
69
+ },
70
+ summary: summarizeGitHubCopilot(credentials)
71
+ };
72
+ },
73
+ stored: read,
74
+ refreshed: read,
75
+ logout: () => client.logout()
76
+ };
77
+ };
78
+ const makeOps = (provider, options = {}) => {
79
+ const file = options.path === void 0 ? {} : { path: options.path };
80
+ if (provider === "openai-codex") {
81
+ const storage = options.persist === false ? void 0 : new JsonOpenAICodexAuthStorage(file);
82
+ return codexOps(storage ?? transient, storage?.path ?? "");
83
+ }
84
+ const storage = options.persist === false ? void 0 : new JsonGitHubCopilotAuthStorage(file);
85
+ return copilotOps(storage ?? transient, storage?.path ?? "");
86
+ };
87
+ const attempt = (message, run) => Effect.tryPromise({
88
+ try: run,
89
+ catch: (cause) => new OAuthError({
90
+ message,
91
+ cause
92
+ })
93
+ });
94
+ /** The provider named by the two mutually exclusive flags. */
95
+ const selectProvider = (flags) => {
96
+ const checked = checkOAuthProvider(flags);
97
+ return checked.ok ? Effect.succeed(checked.provider) : Effect.fail(new InvalidInputError({ message: checked.message }));
98
+ };
99
+ /** Reject the local-credential flags when the credentials live on a server. */
100
+ const assertServerScope = (authFile) => Effect.gen(function* () {
101
+ const shared = yield* Cmd.spec;
102
+ if (Option.isSome(authFile) || Option.isSome(shared.home)) return yield* new InvalidInputError({ message: "--auth-file and --home belong on codework serve when using --server" });
103
+ });
104
+ /** Credential operations against this machine's auth.json. */
105
+ const localOps = (provider, authFile) => Effect.gen(function* () {
106
+ const shared = yield* Cmd.spec;
107
+ const path = yield* Path.Path;
108
+ const file = Option.isSome(authFile) ? authFile.value : Option.isSome(shared.home) ? path.join((yield* Global.resolve({ home: shared.home.value })).home, "aikit", "auth.json") : void 0;
109
+ return makeOps(provider, file === void 0 ? {} : { path: file });
110
+ });
111
+ /** Run an effect against the RPC server at `url`, discharging the client. */
112
+ const withServer = (url, program) => program.pipe(Effect.provide(layer(url)), Effect.scoped);
113
+ //#endregion
114
+ export { oauthProviderLabel as a, makeOps as i, attempt as n, selectProvider as o, localOps as r, withServer as s, assertServerScope as t };
115
+
116
+ //# sourceMappingURL=shared-DN18qxOE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-DN18qxOE.mjs","names":["Client.layer"],"sources":["../../src/cli/cmd/handlers/auth/shared.ts"],"sourcesContent":["/* @effect-diagnostics nodeBuiltinImport:off -- OAuth login opens the system browser. */\n/* @effect-diagnostics globalDate:off -- Stored expiry timestamps are rendered for the user. */\n/* oxlint-disable effecttsgo/async-function -- Aikit OAuth callbacks require Promise-returning functions. */\nimport {\n\tGitHubCopilotOAuthClient,\n\tJsonGitHubCopilotAuthStorage,\n\ttype GitHubCopilotAuthStorage,\n} from \"@codeworksh/aikit/oauth/github/copilot\";\nimport {\n\tJsonOpenAICodexAuthStorage,\n\tOpenAICodexOAuthClient,\n\ttype OpenAICodexAuthStorage,\n} from \"@codeworksh/aikit/oauth/openai/codex\";\nimport { openBrowser, promptLine } from \"@codeworksh/aikit/oauth/interactive\";\nimport {\n\tcheckOAuthProvider,\n\toauthProviderLabel,\n\tsummarizeGitHubCopilot,\n\tsummarizeOpenAICodex,\n\ttype OAuthSummary,\n} from \"@codeworksh/aikit/oauth/summary\";\nimport { Global } from \"@codeworksh/harness/effect\";\nimport { Effect, Option, Path } from \"effect\";\nimport { Client } from \"../../../../server/client.ts\";\nimport type { Contract } from \"../../../../server/contract.ts\";\nimport { InvalidInputError, OAuthError } from \"../../../error.ts\";\nimport { Cmd } from \"../../cmd.ts\";\n\nexport type Provider = Contract.OAuthProvider;\n\n// The wire shape and aikit's summary are the same record.\nexport type Summary = Contract.OAuthInfo & OAuthSummary;\n\nconst announce = (\n\tinfo: { url: string; userCode?: string | undefined; instructions?: string | undefined },\n\tbrowser: boolean,\n): void => {\n\tprocess.stderr.write(\n\t\t`${info.instructions ?? \"Complete authentication in your browser.\"}\\n${\n\t\t\tinfo.userCode === undefined ? \"\" : `Enter code: ${info.userCode}\\n`\n\t\t}${info.url}\\n`,\n\t);\n\tif (browser) {\n\t\tvoid openBrowser(info.url, (error) => void process.stderr.write(`Failed to open browser: ${error.message}\\n`));\n\t}\n};\n\nexport interface LoginOptions {\n\treadonly browser: boolean;\n\treadonly device: boolean;\n\treadonly enterprise: Option.Option<string>;\n\treadonly enableModels: boolean;\n}\n\nexport interface Ops {\n\treadonly path: string;\n\treadonly login: (options: LoginOptions) => Promise<{ wire: Contract.OAuthCredentials; summary: Summary }>;\n\treadonly stored: () => Promise<Summary | undefined>;\n\treadonly refreshed: () => Promise<Summary | undefined>;\n\treadonly logout: () => Promise<void>;\n}\n\n/** Holds nothing: a server's credentials live on the server, not on this disk. */\nconst transient: OpenAICodexAuthStorage & GitHubCopilotAuthStorage = {\n\tget: async () => undefined,\n\tset: async () => {},\n\tclear: async () => {},\n};\n\nconst codexOps = (storage: OpenAICodexAuthStorage, path: string): Ops => {\n\tconst client = new OpenAICodexOAuthClient({ storage });\n\treturn {\n\t\tpath,\n\t\tlogin: async (options) => {\n\t\t\tconst credentials = await client.login({\n\t\t\t\tdevice: options.device,\n\t\t\t\tonAuth: (info) => announce(info, options.browser),\n\t\t\t\tonProgress: (message) => void process.stderr.write(`${message}\\n`),\n\t\t\t\tonPrompt: (prompt) => promptLine(prompt.message),\n\t\t\t});\n\t\t\treturn { wire: { provider: \"openai-codex\", ...credentials }, summary: summarizeOpenAICodex(credentials) };\n\t\t},\n\t\tstored: async () => {\n\t\t\tconst credentials = await storage.get();\n\t\t\treturn credentials && summarizeOpenAICodex(credentials);\n\t\t},\n\t\trefreshed: async () => {\n\t\t\tconst credentials = await client.getCredentials();\n\t\t\treturn credentials && summarizeOpenAICodex(credentials);\n\t\t},\n\t\tlogout: () => client.logout(),\n\t};\n};\n\nconst copilotOps = (storage: GitHubCopilotAuthStorage, path: string): Ops => {\n\tconst client = new GitHubCopilotOAuthClient({ storage });\n\tconst read = async () => {\n\t\tconst credentials = await storage.get();\n\t\treturn credentials && summarizeGitHubCopilot(credentials);\n\t};\n\treturn {\n\t\tpath,\n\t\tlogin: async (options) => {\n\t\t\tconst credentials = await client.login({\n\t\t\t\t...(Option.isSome(options.enterprise) && { enterpriseUrl: options.enterprise.value }),\n\t\t\t\tenableModels: options.enableModels,\n\t\t\t\tonAuth: (info) => announce(info, options.browser),\n\t\t\t\tonProgress: (message) => void process.stderr.write(`${message}\\n`),\n\t\t\t});\n\t\t\treturn { wire: { provider: \"github-copilot\", ...credentials }, summary: summarizeGitHubCopilot(credentials) };\n\t\t},\n\t\tstored: read,\n\t\t// GitHub OAuth tokens never expire, so there is nothing to refresh.\n\t\trefreshed: read,\n\t\tlogout: () => client.logout(),\n\t};\n};\n\nexport const makeOps = (provider: Provider, options: { path?: string | undefined; persist?: boolean } = {}): Ops => {\n\tconst file = options.path === undefined ? {} : { path: options.path };\n\tif (provider === \"openai-codex\") {\n\t\tconst storage = options.persist === false ? undefined : new JsonOpenAICodexAuthStorage(file);\n\t\treturn codexOps(storage ?? transient, storage?.path ?? \"\");\n\t}\n\tconst storage = options.persist === false ? undefined : new JsonGitHubCopilotAuthStorage(file);\n\treturn copilotOps(storage ?? transient, storage?.path ?? \"\");\n};\n\nexport const attempt = <A>(message: string, run: () => Promise<A>) =>\n\tEffect.tryPromise({ try: run, catch: (cause) => new OAuthError({ message, cause }) });\n\n/** The provider named by the two mutually exclusive flags. */\nexport const selectProvider = (flags: {\n\treadonly openaiCodex: boolean;\n\treadonly githubCopilot: boolean;\n}): Effect.Effect<Provider, InvalidInputError> => {\n\tconst checked = checkOAuthProvider(flags);\n\treturn checked.ok\n\t\t? Effect.succeed(checked.provider)\n\t\t: Effect.fail(new InvalidInputError({ message: checked.message }));\n};\n\n/** Reject the local-credential flags when the credentials live on a server. */\nexport const assertServerScope = (authFile: Option.Option<string>) =>\n\tEffect.gen(function* () {\n\t\tconst shared = yield* Cmd.spec;\n\t\tif (Option.isSome(authFile) || Option.isSome(shared.home)) {\n\t\t\treturn yield* new InvalidInputError({\n\t\t\t\tmessage: \"--auth-file and --home belong on codework serve when using --server\",\n\t\t\t});\n\t\t}\n\t});\n\n/** Credential operations against this machine's auth.json. */\nexport const localOps = (provider: Provider, authFile: Option.Option<string>) =>\n\tEffect.gen(function* () {\n\t\tconst shared = yield* Cmd.spec;\n\t\tconst path = yield* Path.Path;\n\t\tconst file = Option.isSome(authFile)\n\t\t\t? authFile.value\n\t\t\t: Option.isSome(shared.home)\n\t\t\t\t? path.join((yield* Global.resolve({ home: shared.home.value })).home, \"aikit\", \"auth.json\")\n\t\t\t\t: undefined;\n\t\treturn makeOps(provider, file === undefined ? {} : { path: file });\n\t});\n\n/** Run an effect against the RPC server at `url`, discharging the client. */\nexport const withServer = <A, E, R>(url: string, program: Effect.Effect<A, E, R>) =>\n\tprogram.pipe(Effect.provide(Client.layer(url)), Effect.scoped);\n\nexport { Client, oauthProviderLabel };\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, i as reportFailure, n as OAuthError, p as make } from "./error-CxoEKg-4.mjs";
3
+ import { a as oauthProviderLabel, n as attempt, o as selectProvider, r as localOps, s as withServer, t as assertServerScope } from "./shared-DN18qxOE.mjs";
4
+ import { Effect, Option } from "effect";
5
+ import { formatOAuthSummary, oauthNotice } from "@codeworksh/aikit/oauth/summary";
6
+ //#region src/cli/cmd/handlers/auth/status.ts
7
+ var status_default = handler(Cmd.commands.auth.commands.status, Effect.fn("CLI.auth.status")(function* ({ server, openaiCodex, githubCopilot, authFile, json }) {
8
+ return yield* Effect.gen(function* () {
9
+ const provider = yield* selectProvider({
10
+ openaiCodex,
11
+ githubCopilot
12
+ });
13
+ const name = oauthProviderLabel(provider);
14
+ if (Option.isSome(server)) {
15
+ yield* assertServerScope(authFile);
16
+ return yield* withServer(server.value, Effect.gen(function* () {
17
+ const info = yield* (yield* make)["auth.status"]({ provider });
18
+ if (info === null) return yield* new OAuthError({ message: oauthNotice("missing", provider, "the server") });
19
+ yield* writeOut(formatOAuthSummary(info, { json }));
20
+ }));
21
+ }
22
+ const ops = yield* localOps(provider, authFile);
23
+ const summary = yield* attempt(`failed to read ${name} credentials`, () => ops.stored());
24
+ if (summary === void 0) return yield* new OAuthError({ message: oauthNotice("missing", provider, ops.path) });
25
+ yield* writeOut(formatOAuthSummary(summary, { json }));
26
+ }).pipe(Effect.catch(reportFailure));
27
+ }));
28
+ //#endregion
29
+ export { status_default as default };
30
+
31
+ //# sourceMappingURL=status-Br21KEeh.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-Br21KEeh.mjs","names":["Runtime.handler","Client.make"],"sources":["../../src/cli/cmd/handlers/auth/status.ts"],"sourcesContent":["import { formatOAuthSummary, oauthNotice } from \"@codeworksh/aikit/oauth/summary\";\nimport { Effect, Option } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { OAuthError, reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport {\n\tassertServerScope,\n\tattempt,\n\tClient,\n\tlocalOps,\n\toauthProviderLabel,\n\tselectProvider,\n\twithServer,\n} from \"./shared.ts\";\n\nexport default Runtime.handler(\n\tCmd.commands.auth.commands.status,\n\tEffect.fn(\"CLI.auth.status\")(function* ({ server, openaiCodex, githubCopilot, authFile, json }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst provider = yield* selectProvider({ openaiCodex, githubCopilot });\n\t\t\tconst name = oauthProviderLabel(provider);\n\n\t\t\tif (Option.isSome(server)) {\n\t\t\t\tyield* assertServerScope(authFile);\n\t\t\t\treturn yield* withServer(\n\t\t\t\t\tserver.value,\n\t\t\t\t\tEffect.gen(function* () {\n\t\t\t\t\t\tconst rpc = yield* Client.make;\n\t\t\t\t\t\tconst info = yield* rpc[\"auth.status\"]({ provider });\n\t\t\t\t\t\tif (info === null) {\n\t\t\t\t\t\t\treturn yield* new OAuthError({ message: oauthNotice(\"missing\", provider, \"the server\") });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tyield* writeOut(formatOAuthSummary(info, { json }));\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst ops = yield* localOps(provider, authFile);\n\t\t\tconst summary = yield* attempt(`failed to read ${name} credentials`, () => ops.stored());\n\t\t\tif (summary === undefined) {\n\t\t\t\treturn yield* new OAuthError({ message: oauthNotice(\"missing\", provider, ops.path) });\n\t\t\t}\n\t\t\tyield* writeOut(formatOAuthSummary(summary, { json }));\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;AAgBA,IAAA,iBAAeA,QACd,IAAI,SAAS,KAAK,SAAS,QAC3B,OAAO,GAAG,iBAAiB,CAAC,CAAC,WAAW,EAAE,QAAQ,aAAa,eAAe,UAAU,QAAQ;CA4B/F,OAAO,OA3BS,OAAO,IAAI,aAAa;EACvC,MAAM,WAAW,OAAO,eAAe;GAAE;GAAa;EAAc,CAAC;EACrE,MAAM,OAAO,mBAAmB,QAAQ;EAExC,IAAI,OAAO,OAAO,MAAM,GAAG;GAC1B,OAAO,kBAAkB,QAAQ;GACjC,OAAO,OAAO,WACb,OAAO,OACP,OAAO,IAAI,aAAa;IAEvB,MAAM,OAAO,QAAO,OADDC,KAAAA,CACK,cAAc,CAAC,EAAE,SAAS,CAAC;IACnD,IAAI,SAAS,MACZ,OAAO,OAAO,IAAI,WAAW,EAAE,SAAS,YAAY,WAAW,UAAU,YAAY,EAAE,CAAC;IAEzF,OAAO,SAAS,mBAAmB,MAAM,EAAE,KAAK,CAAC,CAAC;GACnD,CAAC,CACF;EACD;EAEA,MAAM,MAAM,OAAO,SAAS,UAAU,QAAQ;EAC9C,MAAM,UAAU,OAAO,QAAQ,kBAAkB,KAAK,qBAAqB,IAAI,OAAO,CAAC;EACvF,IAAI,YAAY,KAAA,GACf,OAAO,OAAO,IAAI,WAAW,EAAE,SAAS,YAAY,WAAW,UAAU,IAAI,IAAI,EAAE,CAAC;EAErF,OAAO,SAAS,mBAAmB,SAAS,EAAE,KAAK,CAAC,CAAC;CACtD,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}
@@ -0,0 +1,51 @@
1
+ import { i as Cmd, t as handler } from "./runtime-BuFe9cOc.mjs";
2
+ import { d as writeOut, i as reportFailure } from "./error-CxoEKg-4.mjs";
3
+ import { a as targeted, i as read, n as local, r as probe, t as fetchable } from "./entries-BXBULTVt.mjs";
4
+ import { Effect, Option } from "effect";
5
+ import { Plugin } from "@codeworksh/harness/effect";
6
+ //#region src/cli/cmd/handlers/plugin/update.ts
7
+ /**
8
+ * Take whatever `check` found.
9
+ *
10
+ * Only a plugin that is **already installed** is refreshed: "not installed" is not "outdated", and
11
+ * `plugin install` is the verb for that. Each refresh publishes a new generation, which a running
12
+ * session picks up at its next exchange -- so this command never has to reach into a server.
13
+ */
14
+ var update_default = handler(Cmd.commands.plugin.commands.update, Effect.fn("CLI.plugin.update")(function* ({ spec }) {
15
+ return yield* Effect.gen(function* () {
16
+ const shared = yield* Cmd.spec;
17
+ const { entries, cache, hostDir } = yield* read(shared);
18
+ const selected = yield* targeted(entries, spec, hostDir);
19
+ if (selected.length === 0 && Option.isSome(spec)) return;
20
+ let updated = 0;
21
+ let failed = 0;
22
+ for (const entry of selected) {
23
+ const target = fetchable(entry.target);
24
+ if (target === void 0) {
25
+ yield* local(entry, spec);
26
+ continue;
27
+ }
28
+ const result = yield* Plugin.update(target, cache, {
29
+ probe: probe(cache, entry.from),
30
+ from: entry.from,
31
+ validate: (fetched) => Plugin.definition(fetched.entrypoint, entry.reference).pipe(Effect.asVoid)
32
+ }).pipe(Effect.result);
33
+ if (result._tag === "Failure") {
34
+ failed += 1;
35
+ yield* writeOut(`${entry.reference} error[${result.failure.reason}]: ${result.failure.message}\n`);
36
+ continue;
37
+ }
38
+ if (result.success._tag === "updated") {
39
+ updated += 1;
40
+ yield* writeOut(`Updated ${entry.reference} to ${result.success.entry.revision ?? "a new revision"}\n`);
41
+ }
42
+ }
43
+ if (Option.isSome(spec) && selected.every((entry) => fetchable(entry.target) === void 0)) return;
44
+ yield* writeOut(updated === 0 ? "Nothing to update.\n" : `${updated} updated.\n`);
45
+ if (failed > 0) process.exitCode = 1;
46
+ }).pipe(Effect.catch(reportFailure));
47
+ }));
48
+ //#endregion
49
+ export { update_default as default };
50
+
51
+ //# sourceMappingURL=update-qrQr-mJT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-qrQr-mJT.mjs","names":["Runtime.handler"],"sources":["../../src/cli/cmd/handlers/plugin/update.ts"],"sourcesContent":["import { Plugin } from \"@codeworksh/harness/effect\";\nimport { Effect, Option } from \"effect\";\nimport { Runtime } from \"../../../../framework/runtime.ts\";\nimport { reportFailure } from \"../../../error.ts\";\nimport { writeOut } from \"../../../output.ts\";\nimport { Cmd } from \"../../cmd.ts\";\nimport { fetchable, local, probe, read, targeted } from \"./entries.ts\";\n\n/**\n * Take whatever `check` found.\n *\n * Only a plugin that is **already installed** is refreshed: \"not installed\" is not \"outdated\", and\n * `plugin install` is the verb for that. Each refresh publishes a new generation, which a running\n * session picks up at its next exchange -- so this command never has to reach into a server.\n */\nexport default Runtime.handler(\n\tCmd.commands.plugin.commands.update,\n\tEffect.fn(\"CLI.plugin.update\")(function* ({ spec }) {\n\t\tconst program = Effect.gen(function* () {\n\t\t\tconst shared = yield* Cmd.spec;\n\t\t\tconst { entries, cache, hostDir } = yield* read(shared);\n\t\t\tconst selected = yield* targeted(entries, spec, hostDir);\n\t\t\tif (selected.length === 0 && Option.isSome(spec)) return;\n\n\t\t\tlet updated = 0;\n\t\t\tlet failed = 0;\n\t\t\tfor (const entry of selected) {\n\t\t\t\tconst target = fetchable(entry.target);\n\t\t\t\t// A local plugin has no revision to compare and is never copied into the store.\n\t\t\t\tif (target === undefined) {\n\t\t\t\t\tyield* local(entry, spec);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst result = yield* Plugin.update(target, cache, {\n\t\t\t\t\tprobe: probe(cache, entry.from),\n\t\t\t\t\tfrom: entry.from,\n\t\t\t\t\t// Validated while staged, so a refresh that fetches something broken leaves\n\t\t\t\t\t// the generation already in use as the answer. Preserve the loader's reason:\n\t\t\t\t\t// an import failure or invalid definition is not a missing entrypoint.\n\t\t\t\t\tvalidate: (fetched) => Plugin.definition(fetched.entrypoint, entry.reference).pipe(Effect.asVoid),\n\t\t\t\t}).pipe(Effect.result);\n\n\t\t\t\tif (result._tag === \"Failure\") {\n\t\t\t\t\tfailed += 1;\n\t\t\t\t\tyield* writeOut(`${entry.reference} error[${result.failure.reason}]: ${result.failure.message}\\n`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (result.success._tag === \"updated\") {\n\t\t\t\t\tupdated += 1;\n\t\t\t\t\tyield* writeOut(`Updated ${entry.reference} to ${result.success.entry.revision ?? \"a new revision\"}\\n`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// A spec that named only local plugins compared nothing, so there is nothing to sum up.\n\t\t\tif (Option.isSome(spec) && selected.every((entry) => fetchable(entry.target) === undefined)) return;\n\t\t\tyield* writeOut(updated === 0 ? \"Nothing to update.\\n\" : `${updated} updated.\\n`);\n\t\t\tif (failed > 0) process.exitCode = 1;\n\t\t});\n\n\t\treturn yield* program.pipe(Effect.catch(reportFailure));\n\t}),\n);\n"],"mappings":";;;;;;;;;;;;;AAeA,IAAA,iBAAeA,QACd,IAAI,SAAS,OAAO,SAAS,QAC7B,OAAO,GAAG,mBAAmB,CAAC,CAAC,WAAW,EAAE,QAAQ;CA2CnD,OAAO,OA1CS,OAAO,IAAI,aAAa;EACvC,MAAM,SAAS,OAAO,IAAI;EAC1B,MAAM,EAAE,SAAS,OAAO,YAAY,OAAO,KAAK,MAAM;EACtD,MAAM,WAAW,OAAO,SAAS,SAAS,MAAM,OAAO;EACvD,IAAI,SAAS,WAAW,KAAK,OAAO,OAAO,IAAI,GAAG;EAElD,IAAI,UAAU;EACd,IAAI,SAAS;EACb,KAAK,MAAM,SAAS,UAAU;GAC7B,MAAM,SAAS,UAAU,MAAM,MAAM;GAErC,IAAI,WAAW,KAAA,GAAW;IACzB,OAAO,MAAM,OAAO,IAAI;IACxB;GACD;GAEA,MAAM,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO;IAClD,OAAO,MAAM,OAAO,MAAM,IAAI;IAC9B,MAAM,MAAM;IAIZ,WAAW,YAAY,OAAO,WAAW,QAAQ,YAAY,MAAM,SAAS,CAAC,CAAC,KAAK,OAAO,MAAM;GACjG,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM;GAErB,IAAI,OAAO,SAAS,WAAW;IAC9B,UAAU;IACV,OAAO,SAAS,GAAG,MAAM,UAAU,UAAU,OAAO,QAAQ,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;IAClG;GACD;GACA,IAAI,OAAO,QAAQ,SAAS,WAAW;IACtC,WAAW;IACX,OAAO,SAAS,WAAW,MAAM,UAAU,MAAM,OAAO,QAAQ,MAAM,YAAY,iBAAiB,GAAG;GACvG;EACD;EAGA,IAAI,OAAO,OAAO,IAAI,KAAK,SAAS,OAAO,UAAU,UAAU,MAAM,MAAM,MAAM,KAAA,CAAS,GAAG;EAC7F,OAAO,SAAS,YAAY,IAAI,yBAAyB,GAAG,QAAQ,YAAY;EAChF,IAAI,SAAS,GAAG,QAAQ,WAAW;CACpC,CAEoB,CAAC,CAAC,KAAK,OAAO,MAAM,aAAa,CAAC;AACvD,CAAC,CACF"}