shadok-ai 0.1.0

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 (66) hide show
  1. package/README.md +196 -0
  2. package/dist/args.d.ts +8 -0
  3. package/dist/args.js +17 -0
  4. package/dist/args.js.map +1 -0
  5. package/dist/channels.d.ts +61 -0
  6. package/dist/channels.js +169 -0
  7. package/dist/channels.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.js +100 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.d.ts +31 -0
  12. package/dist/config.js +59 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/detect.d.ts +17 -0
  15. package/dist/detect.js +41 -0
  16. package/dist/detect.js.map +1 -0
  17. package/dist/extract.d.ts +55 -0
  18. package/dist/extract.js +269 -0
  19. package/dist/extract.js.map +1 -0
  20. package/dist/main.d.ts +2 -0
  21. package/dist/main.js +90 -0
  22. package/dist/main.js.map +1 -0
  23. package/dist/pace.d.ts +33 -0
  24. package/dist/pace.js +53 -0
  25. package/dist/pace.js.map +1 -0
  26. package/dist/retry.d.ts +15 -0
  27. package/dist/retry.js +40 -0
  28. package/dist/retry.js.map +1 -0
  29. package/dist/secrets.d.ts +21 -0
  30. package/dist/secrets.js +71 -0
  31. package/dist/secrets.js.map +1 -0
  32. package/dist/server.d.ts +1 -0
  33. package/dist/server.js +854 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/session.d.ts +74 -0
  36. package/dist/session.js +244 -0
  37. package/dist/session.js.map +1 -0
  38. package/dist/setup-prompt.d.ts +6 -0
  39. package/dist/setup-prompt.js +25 -0
  40. package/dist/setup-prompt.js.map +1 -0
  41. package/dist/supervisor.d.ts +55 -0
  42. package/dist/supervisor.js +61 -0
  43. package/dist/supervisor.js.map +1 -0
  44. package/dist/tail.d.ts +66 -0
  45. package/dist/tail.js +244 -0
  46. package/dist/tail.js.map +1 -0
  47. package/dist/telegram.d.ts +48 -0
  48. package/dist/telegram.js +565 -0
  49. package/dist/telegram.js.map +1 -0
  50. package/dist/tmux.d.ts +69 -0
  51. package/dist/tmux.js +267 -0
  52. package/dist/tmux.js.map +1 -0
  53. package/dist/update-flag.d.ts +13 -0
  54. package/dist/update-flag.js +36 -0
  55. package/dist/update-flag.js.map +1 -0
  56. package/dist/updater.d.ts +18 -0
  57. package/dist/updater.js +45 -0
  58. package/dist/updater.js.map +1 -0
  59. package/dist/usage.d.ts +23 -0
  60. package/dist/usage.js +125 -0
  61. package/dist/usage.js.map +1 -0
  62. package/dist/worktree.d.ts +63 -0
  63. package/dist/worktree.js +153 -0
  64. package/dist/worktree.js.map +1 -0
  65. package/package.json +44 -0
  66. package/public/index.html +2583 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pace.js","sourceRoot":"","sources":["../src/pace.ts"],"names":[],"mappings":"AAEA,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,KAAK,EAAW,CAAC;AAE/E;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAE9B,gFAAgF;AAChF,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAW,CAAC;AAc1D;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,CAAgB,EAAE,WAAmB,EAAE,KAAa;IAC9E,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC7E,MAAM,YAAY,GAAG,CAAC,CAAC,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IAC/C,4EAA4E;IAC5E,8DAA8D;IAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACpG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,CAAe,EAAE,KAAa;IACtD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,GAAwE,IAAI,CAAC;IACtF,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAU,EAAE,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC,IAAI,YAAY,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI;YAAE,SAAS;QAC/D,IAAI,QAAQ,IAAI,WAAW;YAAE,SAAS;QACtC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YACrC,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IACrB,OAAO;QACL,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY;KAC9G,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Detection of transient API errors on the TUI screen, used by the server
3
+ * to auto-retry a turn that died on one (529 Overloaded, 5xx, timeout…).
4
+ * Pure functions, kept separate from server.ts so they can be tested.
5
+ */
6
+ /** Auto-retry backoff: first, second and third attempt. */
7
+ export declare const RETRY_DELAYS_MS: readonly number[];
8
+ /** The screen lines (trimmed) showing a transient API error. */
9
+ export declare function findTransientErrors(screen: string): string[];
10
+ /**
11
+ * Multiset difference: the lines of `after` in excess of `before`. Used to
12
+ * ignore an old error still visible on screen from a previous turn — only
13
+ * a NEW occurrence triggers a retry.
14
+ */
15
+ export declare function newTransientErrors(before: string[], after: string[]): string[];
package/dist/retry.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Detection of transient API errors on the TUI screen, used by the server
3
+ * to auto-retry a turn that died on one (529 Overloaded, 5xx, timeout…).
4
+ * Pure functions, kept separate from server.ts so they can be tested.
5
+ */
6
+ /** Auto-retry backoff: first, second and third attempt. */
7
+ export const RETRY_DELAYS_MS = [15_000, 30_000, 60_000];
8
+ /**
9
+ * A line worth retrying: "API Error" followed (same line) by a transient
10
+ * cause — 5xx/429 status, overload, timeout or connection failure. Client
11
+ * errors (400/401/403, invalid_request…) intentionally do not match.
12
+ */
13
+ const TRANSIENT_ERROR = /API Error\b[^\n]*?(?:\b(?:5\d\d|429)\b|overloaded|timed? ?out|connection|ECONNRESET|ETIMEDOUT|fetch failed)/i;
14
+ /** The screen lines (trimmed) showing a transient API error. */
15
+ export function findTransientErrors(screen) {
16
+ return screen
17
+ .split("\n")
18
+ .map((l) => l.trim())
19
+ .filter((l) => TRANSIENT_ERROR.test(l));
20
+ }
21
+ /**
22
+ * Multiset difference: the lines of `after` in excess of `before`. Used to
23
+ * ignore an old error still visible on screen from a previous turn — only
24
+ * a NEW occurrence triggers a retry.
25
+ */
26
+ export function newTransientErrors(before, after) {
27
+ const counts = new Map();
28
+ for (const l of before)
29
+ counts.set(l, (counts.get(l) ?? 0) + 1);
30
+ const fresh = [];
31
+ for (const l of after) {
32
+ const c = counts.get(l) ?? 0;
33
+ if (c > 0)
34
+ counts.set(l, c - 1);
35
+ else
36
+ fresh.push(l);
37
+ }
38
+ return fresh;
39
+ }
40
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,eAAe,GACnB,8GAA8G,CAAC;AAEjH,gEAAgE;AAChE,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,MAAM;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAgB,EAAE,KAAe;IAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;;YAC3B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Per-repo secrets, stored OUTSIDE any repo at ~/.shadok-ai/secrets.json (600)
3
+ * and injected as environment variables into an agent's `claude` process at
4
+ * spawn — never written into the working directory. Keyed by the main repo root
5
+ * so all worktrees of a repo share its secrets.
6
+ */
7
+ export type SecretStore = Record<string, Record<string, string>>;
8
+ export declare function loadStore(): SecretStore;
9
+ /** Set repo[key]=value in a store, returning a new store (no mutation). */
10
+ export declare function mergeSecret(store: SecretStore, repo: string, key: string, value: string): SecretStore;
11
+ /** Remove repo[key], dropping the repo entry when it becomes empty. */
12
+ export declare function dropSecret(store: SecretStore, repo: string, key: string): SecretStore;
13
+ /** The main repo root for a cwd (worktree-safe); the cwd if it isn't a repo. */
14
+ export declare function resolveRepo(cwd: string): string;
15
+ export declare function secretsForRepo(repo: string): Record<string, string>;
16
+ /** Secrets to inject for an agent running in `cwd` (resolved to its repo). */
17
+ export declare function secretsForCwd(cwd: string): Record<string, string>;
18
+ /** Key names for a repo (never the values). */
19
+ export declare function secretKeys(repo: string): string[];
20
+ export declare function setSecret(repo: string, key: string, value: string): void;
21
+ export declare function deleteSecret(repo: string, key: string): void;
@@ -0,0 +1,71 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ const FILE = path.join(os.homedir(), ".shadok-ai", "secrets.json");
6
+ export function loadStore() {
7
+ try {
8
+ const v = JSON.parse(fs.readFileSync(FILE, "utf8"));
9
+ return v && typeof v === "object" && !Array.isArray(v) ? v : {};
10
+ }
11
+ catch {
12
+ return {};
13
+ }
14
+ }
15
+ function saveStore(s) {
16
+ fs.mkdirSync(path.dirname(FILE), { recursive: true });
17
+ fs.writeFileSync(FILE, JSON.stringify(s, null, 2), { mode: 0o600 });
18
+ fs.chmodSync(FILE, 0o600); // enforce 600 even if the file pre-existed
19
+ }
20
+ // ── Pure cores (unit-tested) ─────────────────────────────────────────────
21
+ /** Set repo[key]=value in a store, returning a new store (no mutation). */
22
+ export function mergeSecret(store, repo, key, value) {
23
+ return { ...store, [repo]: { ...(store[repo] ?? {}), [key]: value } };
24
+ }
25
+ /** Remove repo[key], dropping the repo entry when it becomes empty. */
26
+ export function dropSecret(store, repo, key) {
27
+ if (!store[repo] || !(key in store[repo]))
28
+ return store;
29
+ const repoSecrets = { ...store[repo] };
30
+ delete repoSecrets[key];
31
+ const next = { ...store };
32
+ if (Object.keys(repoSecrets).length)
33
+ next[repo] = repoSecrets;
34
+ else
35
+ delete next[repo];
36
+ return next;
37
+ }
38
+ // ── Repo resolution ──────────────────────────────────────────────────────
39
+ /** The main repo root for a cwd (worktree-safe); the cwd if it isn't a repo. */
40
+ export function resolveRepo(cwd) {
41
+ try {
42
+ const common = execFileSync("git", ["-C", cwd, "rev-parse", "--git-common-dir"], {
43
+ encoding: "utf8",
44
+ stdio: ["ignore", "pipe", "ignore"],
45
+ }).trim();
46
+ const abs = path.isAbsolute(common) ? common : path.resolve(cwd, common);
47
+ return path.dirname(abs);
48
+ }
49
+ catch {
50
+ return cwd;
51
+ }
52
+ }
53
+ // ── Store API ────────────────────────────────────────────────────────────
54
+ export function secretsForRepo(repo) {
55
+ return loadStore()[repo] ?? {};
56
+ }
57
+ /** Secrets to inject for an agent running in `cwd` (resolved to its repo). */
58
+ export function secretsForCwd(cwd) {
59
+ return secretsForRepo(resolveRepo(cwd));
60
+ }
61
+ /** Key names for a repo (never the values). */
62
+ export function secretKeys(repo) {
63
+ return Object.keys(secretsForRepo(repo));
64
+ }
65
+ export function setSecret(repo, key, value) {
66
+ saveStore(mergeSecret(loadStore(), repo, key, value));
67
+ }
68
+ export function deleteSecret(repo, key) {
69
+ saveStore(dropSecret(loadStore(), repo, key));
70
+ }
71
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};