@aui.io/apollo 0.1.4

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 (194) hide show
  1. package/bin/apollo.js +13 -0
  2. package/node_modules/@aui.io/apollo-cli/bin/apollo.js +79 -0
  3. package/node_modules/@aui.io/apollo-cli/dist/src/commands/auth.d.ts +4 -0
  4. package/node_modules/@aui.io/apollo-cli/dist/src/commands/auth.js +99 -0
  5. package/node_modules/@aui.io/apollo-cli/dist/src/commands/auth.js.map +1 -0
  6. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.d.ts +3 -0
  7. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js +234 -0
  8. package/node_modules/@aui.io/apollo-cli/dist/src/commands/bundles.js.map +1 -0
  9. package/node_modules/@aui.io/apollo-cli/dist/src/commands/env.d.ts +3 -0
  10. package/node_modules/@aui.io/apollo-cli/dist/src/commands/env.js +34 -0
  11. package/node_modules/@aui.io/apollo-cli/dist/src/commands/env.js.map +1 -0
  12. package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.d.ts +3 -0
  13. package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.js +175 -0
  14. package/node_modules/@aui.io/apollo-cli/dist/src/commands/hierarchy.js.map +1 -0
  15. package/node_modules/@aui.io/apollo-cli/dist/src/commands/mockdb.d.ts +3 -0
  16. package/node_modules/@aui.io/apollo-cli/dist/src/commands/mockdb.js +251 -0
  17. package/node_modules/@aui.io/apollo-cli/dist/src/commands/mockdb.js.map +1 -0
  18. package/node_modules/@aui.io/apollo-cli/dist/src/commands/operate.d.ts +3 -0
  19. package/node_modules/@aui.io/apollo-cli/dist/src/commands/operate.js +138 -0
  20. package/node_modules/@aui.io/apollo-cli/dist/src/commands/operate.js.map +1 -0
  21. package/node_modules/@aui.io/apollo-cli/dist/src/commands/profile.d.ts +3 -0
  22. package/node_modules/@aui.io/apollo-cli/dist/src/commands/profile.js +51 -0
  23. package/node_modules/@aui.io/apollo-cli/dist/src/commands/profile.js.map +1 -0
  24. package/node_modules/@aui.io/apollo-cli/dist/src/commands/prompts.d.ts +6 -0
  25. package/node_modules/@aui.io/apollo-cli/dist/src/commands/prompts.js +20 -0
  26. package/node_modules/@aui.io/apollo-cli/dist/src/commands/prompts.js.map +1 -0
  27. package/node_modules/@aui.io/apollo-cli/dist/src/commands/runtime.d.ts +6 -0
  28. package/node_modules/@aui.io/apollo-cli/dist/src/commands/runtime.js +2 -0
  29. package/node_modules/@aui.io/apollo-cli/dist/src/commands/runtime.js.map +1 -0
  30. package/node_modules/@aui.io/apollo-cli/dist/src/commands/shell.d.ts +10 -0
  31. package/node_modules/@aui.io/apollo-cli/dist/src/commands/shell.js +36 -0
  32. package/node_modules/@aui.io/apollo-cli/dist/src/commands/shell.js.map +1 -0
  33. package/node_modules/@aui.io/apollo-cli/dist/src/commands/status.d.ts +3 -0
  34. package/node_modules/@aui.io/apollo-cli/dist/src/commands/status.js +57 -0
  35. package/node_modules/@aui.io/apollo-cli/dist/src/commands/status.js.map +1 -0
  36. package/node_modules/@aui.io/apollo-cli/dist/src/commands/upgrade.d.ts +3 -0
  37. package/node_modules/@aui.io/apollo-cli/dist/src/commands/upgrade.js +35 -0
  38. package/node_modules/@aui.io/apollo-cli/dist/src/commands/upgrade.js.map +1 -0
  39. package/node_modules/@aui.io/apollo-cli/dist/src/commands/workspace.d.ts +3 -0
  40. package/node_modules/@aui.io/apollo-cli/dist/src/commands/workspace.js +170 -0
  41. package/node_modules/@aui.io/apollo-cli/dist/src/commands/workspace.js.map +1 -0
  42. package/node_modules/@aui.io/apollo-cli/dist/src/index.d.ts +10 -0
  43. package/node_modules/@aui.io/apollo-cli/dist/src/index.js +107 -0
  44. package/node_modules/@aui.io/apollo-cli/dist/src/index.js.map +1 -0
  45. package/node_modules/@aui.io/apollo-cli/dist/src/meta.d.ts +4 -0
  46. package/node_modules/@aui.io/apollo-cli/dist/src/meta.js +65 -0
  47. package/node_modules/@aui.io/apollo-cli/dist/src/meta.js.map +1 -0
  48. package/node_modules/@aui.io/apollo-cli/dist/src/output/welcome.d.ts +13 -0
  49. package/node_modules/@aui.io/apollo-cli/dist/src/output/welcome.js +53 -0
  50. package/node_modules/@aui.io/apollo-cli/dist/src/output/welcome.js.map +1 -0
  51. package/node_modules/@aui.io/apollo-cli/package.json +47 -0
  52. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.d.ts +6 -0
  53. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js +23 -0
  54. package/node_modules/@aui.io/apollo-core/dist/src/api/agent-settings.js.map +1 -0
  55. package/node_modules/@aui.io/apollo-core/dist/src/api/client-types.d.ts +23 -0
  56. package/node_modules/@aui.io/apollo-core/dist/src/api/client-types.js +2 -0
  57. package/node_modules/@aui.io/apollo-core/dist/src/api/client-types.js.map +1 -0
  58. package/node_modules/@aui.io/apollo-core/dist/src/api/identity.d.ts +48 -0
  59. package/node_modules/@aui.io/apollo-core/dist/src/api/identity.js +131 -0
  60. package/node_modules/@aui.io/apollo-core/dist/src/api/identity.js.map +1 -0
  61. package/node_modules/@aui.io/apollo-core/dist/src/api/management.d.ts +92 -0
  62. package/node_modules/@aui.io/apollo-core/dist/src/api/management.js +126 -0
  63. package/node_modules/@aui.io/apollo-core/dist/src/api/management.js.map +1 -0
  64. package/node_modules/@aui.io/apollo-core/dist/src/api/mock-db.d.ts +65 -0
  65. package/node_modules/@aui.io/apollo-core/dist/src/api/mock-db.js +183 -0
  66. package/node_modules/@aui.io/apollo-core/dist/src/api/mock-db.js.map +1 -0
  67. package/node_modules/@aui.io/apollo-core/dist/src/api/runtime-api.d.ts +98 -0
  68. package/node_modules/@aui.io/apollo-core/dist/src/api/runtime-api.js +70 -0
  69. package/node_modules/@aui.io/apollo-core/dist/src/api/runtime-api.js.map +1 -0
  70. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.d.ts +40 -0
  71. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js +205 -0
  72. package/node_modules/@aui.io/apollo-core/dist/src/api/transport.js.map +1 -0
  73. package/node_modules/@aui.io/apollo-core/dist/src/argv.d.ts +5 -0
  74. package/node_modules/@aui.io/apollo-core/dist/src/argv.js +43 -0
  75. package/node_modules/@aui.io/apollo-core/dist/src/argv.js.map +1 -0
  76. package/node_modules/@aui.io/apollo-core/dist/src/bundle/baseline.d.ts +17 -0
  77. package/node_modules/@aui.io/apollo-core/dist/src/bundle/baseline.js +48 -0
  78. package/node_modules/@aui.io/apollo-core/dist/src/bundle/baseline.js.map +1 -0
  79. package/node_modules/@aui.io/apollo-core/dist/src/bundle/files.d.ts +7 -0
  80. package/node_modules/@aui.io/apollo-core/dist/src/bundle/files.js +69 -0
  81. package/node_modules/@aui.io/apollo-core/dist/src/bundle/files.js.map +1 -0
  82. package/node_modules/@aui.io/apollo-core/dist/src/bundle/materialize.d.ts +14 -0
  83. package/node_modules/@aui.io/apollo-core/dist/src/bundle/materialize.js +196 -0
  84. package/node_modules/@aui.io/apollo-core/dist/src/bundle/materialize.js.map +1 -0
  85. package/node_modules/@aui.io/apollo-core/dist/src/bundle/validate.d.ts +30 -0
  86. package/node_modules/@aui.io/apollo-core/dist/src/bundle/validate.js +36 -0
  87. package/node_modules/@aui.io/apollo-core/dist/src/bundle/validate.js.map +1 -0
  88. package/node_modules/@aui.io/apollo-core/dist/src/config/index.d.ts +11 -0
  89. package/node_modules/@aui.io/apollo-core/dist/src/config/index.js +193 -0
  90. package/node_modules/@aui.io/apollo-core/dist/src/config/index.js.map +1 -0
  91. package/node_modules/@aui.io/apollo-core/dist/src/config/mockdb-keys.d.ts +14 -0
  92. package/node_modules/@aui.io/apollo-core/dist/src/config/mockdb-keys.js +54 -0
  93. package/node_modules/@aui.io/apollo-core/dist/src/config/mockdb-keys.js.map +1 -0
  94. package/node_modules/@aui.io/apollo-core/dist/src/config/store.d.ts +18 -0
  95. package/node_modules/@aui.io/apollo-core/dist/src/config/store.js +99 -0
  96. package/node_modules/@aui.io/apollo-core/dist/src/config/store.js.map +1 -0
  97. package/node_modules/@aui.io/apollo-core/dist/src/config/types.d.ts +62 -0
  98. package/node_modules/@aui.io/apollo-core/dist/src/config/types.js +2 -0
  99. package/node_modules/@aui.io/apollo-core/dist/src/config/types.js.map +1 -0
  100. package/node_modules/@aui.io/apollo-core/dist/src/errors/index.d.ts +42 -0
  101. package/node_modules/@aui.io/apollo-core/dist/src/errors/index.js +74 -0
  102. package/node_modules/@aui.io/apollo-core/dist/src/errors/index.js.map +1 -0
  103. package/node_modules/@aui.io/apollo-core/dist/src/index.d.ts +32 -0
  104. package/node_modules/@aui.io/apollo-core/dist/src/index.js +32 -0
  105. package/node_modules/@aui.io/apollo-core/dist/src/index.js.map +1 -0
  106. package/node_modules/@aui.io/apollo-core/dist/src/output/index.d.ts +29 -0
  107. package/node_modules/@aui.io/apollo-core/dist/src/output/index.js +49 -0
  108. package/node_modules/@aui.io/apollo-core/dist/src/output/index.js.map +1 -0
  109. package/node_modules/@aui.io/apollo-core/dist/src/services/auth.d.ts +10 -0
  110. package/node_modules/@aui.io/apollo-core/dist/src/services/auth.js +83 -0
  111. package/node_modules/@aui.io/apollo-core/dist/src/services/auth.js.map +1 -0
  112. package/node_modules/@aui.io/apollo-core/dist/src/services/bundles.d.ts +37 -0
  113. package/node_modules/@aui.io/apollo-core/dist/src/services/bundles.js +161 -0
  114. package/node_modules/@aui.io/apollo-core/dist/src/services/bundles.js.map +1 -0
  115. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.d.ts +15 -0
  116. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js +95 -0
  117. package/node_modules/@aui.io/apollo-core/dist/src/services/clients.js.map +1 -0
  118. package/node_modules/@aui.io/apollo-core/dist/src/services/env.service.d.ts +11 -0
  119. package/node_modules/@aui.io/apollo-core/dist/src/services/env.service.js +19 -0
  120. package/node_modules/@aui.io/apollo-core/dist/src/services/env.service.js.map +1 -0
  121. package/node_modules/@aui.io/apollo-core/dist/src/services/hierarchy.d.ts +29 -0
  122. package/node_modules/@aui.io/apollo-core/dist/src/services/hierarchy.js +117 -0
  123. package/node_modules/@aui.io/apollo-core/dist/src/services/hierarchy.js.map +1 -0
  124. package/node_modules/@aui.io/apollo-core/dist/src/services/messaging.d.ts +17 -0
  125. package/node_modules/@aui.io/apollo-core/dist/src/services/messaging.js +99 -0
  126. package/node_modules/@aui.io/apollo-core/dist/src/services/messaging.js.map +1 -0
  127. package/node_modules/@aui.io/apollo-core/dist/src/services/mockdb.d.ts +71 -0
  128. package/node_modules/@aui.io/apollo-core/dist/src/services/mockdb.js +274 -0
  129. package/node_modules/@aui.io/apollo-core/dist/src/services/mockdb.js.map +1 -0
  130. package/node_modules/@aui.io/apollo-core/dist/src/services/profile.service.d.ts +16 -0
  131. package/node_modules/@aui.io/apollo-core/dist/src/services/profile.service.js +29 -0
  132. package/node_modules/@aui.io/apollo-core/dist/src/services/profile.service.js.map +1 -0
  133. package/node_modules/@aui.io/apollo-core/dist/src/services/status.service.d.ts +26 -0
  134. package/node_modules/@aui.io/apollo-core/dist/src/services/status.service.js +109 -0
  135. package/node_modules/@aui.io/apollo-core/dist/src/services/status.service.js.map +1 -0
  136. package/node_modules/@aui.io/apollo-core/dist/src/services/upgrade.d.ts +23 -0
  137. package/node_modules/@aui.io/apollo-core/dist/src/services/upgrade.js +74 -0
  138. package/node_modules/@aui.io/apollo-core/dist/src/services/upgrade.js.map +1 -0
  139. package/node_modules/@aui.io/apollo-core/dist/src/services/workspace.service.d.ts +44 -0
  140. package/node_modules/@aui.io/apollo-core/dist/src/services/workspace.service.js +148 -0
  141. package/node_modules/@aui.io/apollo-core/dist/src/services/workspace.service.js.map +1 -0
  142. package/node_modules/@aui.io/apollo-core/dist/src/skills/install.d.ts +6 -0
  143. package/node_modules/@aui.io/apollo-core/dist/src/skills/install.js +48 -0
  144. package/node_modules/@aui.io/apollo-core/dist/src/skills/install.js.map +1 -0
  145. package/node_modules/@aui.io/apollo-core/dist/src/workspace/store.d.ts +33 -0
  146. package/node_modules/@aui.io/apollo-core/dist/src/workspace/store.js +246 -0
  147. package/node_modules/@aui.io/apollo-core/dist/src/workspace/store.js.map +1 -0
  148. package/node_modules/@aui.io/apollo-core/package.json +48 -0
  149. package/node_modules/@aui.io/apollo-tui/bin/apollo-tui.js +5 -0
  150. package/node_modules/@aui.io/apollo-tui/dist/src/components/glyph.d.ts +19 -0
  151. package/node_modules/@aui.io/apollo-tui/dist/src/components/glyph.js +41 -0
  152. package/node_modules/@aui.io/apollo-tui/dist/src/components/glyph.js.map +1 -0
  153. package/node_modules/@aui.io/apollo-tui/dist/src/index.d.ts +5 -0
  154. package/node_modules/@aui.io/apollo-tui/dist/src/index.js +46 -0
  155. package/node_modules/@aui.io/apollo-tui/dist/src/index.js.map +1 -0
  156. package/node_modules/@aui.io/apollo-tui/dist/src/lib/attractor.d.ts +82 -0
  157. package/node_modules/@aui.io/apollo-tui/dist/src/lib/attractor.js +231 -0
  158. package/node_modules/@aui.io/apollo-tui/dist/src/lib/attractor.js.map +1 -0
  159. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.d.ts +34 -0
  160. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js +100 -0
  161. package/node_modules/@aui.io/apollo-tui/dist/src/lib/commands.js.map +1 -0
  162. package/node_modules/@aui.io/apollo-tui/dist/src/lib/scope.d.ts +14 -0
  163. package/node_modules/@aui.io/apollo-tui/dist/src/lib/scope.js +25 -0
  164. package/node_modules/@aui.io/apollo-tui/dist/src/lib/scope.js.map +1 -0
  165. package/node_modules/@aui.io/apollo-tui/dist/src/lib/sheet.d.ts +25 -0
  166. package/node_modules/@aui.io/apollo-tui/dist/src/lib/sheet.js +99 -0
  167. package/node_modules/@aui.io/apollo-tui/dist/src/lib/sheet.js.map +1 -0
  168. package/node_modules/@aui.io/apollo-tui/dist/src/lib/tabs.d.ts +10 -0
  169. package/node_modules/@aui.io/apollo-tui/dist/src/lib/tabs.js +19 -0
  170. package/node_modules/@aui.io/apollo-tui/dist/src/lib/tabs.js.map +1 -0
  171. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.d.ts +1 -0
  172. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js +449 -0
  173. package/node_modules/@aui.io/apollo-tui/dist/src/opentui-app.js.map +1 -0
  174. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/bundle.d.ts +1 -0
  175. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/bundle.js +4 -0
  176. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/bundle.js.map +1 -0
  177. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/chat.d.ts +1 -0
  178. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/chat.js +4 -0
  179. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/chat.js.map +1 -0
  180. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/index.d.ts +5 -0
  181. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/index.js +6 -0
  182. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/index.js.map +1 -0
  183. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/mockdb.d.ts +1 -0
  184. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/mockdb.js +4 -0
  185. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/mockdb.js.map +1 -0
  186. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/overview.d.ts +1 -0
  187. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/overview.js +4 -0
  188. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/overview.js.map +1 -0
  189. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/scope.d.ts +1 -0
  190. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/scope.js +4 -0
  191. package/node_modules/@aui.io/apollo-tui/dist/src/tabs/scope.js.map +1 -0
  192. package/node_modules/@aui.io/apollo-tui/package.json +53 -0
  193. package/package.json +42 -0
  194. package/scripts/setup-shell.mjs +68 -0
@@ -0,0 +1,148 @@
1
+ import { homedir } from "node:os";
2
+ import path from "node:path";
3
+ import { readUserConfig, writeUserConfig, } from "../config/index.js";
4
+ import { ConfigError } from "../errors/index.js";
5
+ import { createWorkspace, readWorkspace, } from "../workspace/store.js";
6
+ /**
7
+ * Suggested display name for a new workspace: `<profile>-<env>` for the
8
+ * default root (`~/apollo/<profile>/<env>`), otherwise the directory name.
9
+ */
10
+ export function defaultWorkspaceName(context, root, homeDir = homedir()) {
11
+ const absolute = path.resolve(root);
12
+ const defaultRoot = path.join(homeDir, "apollo", context.profile, context.environment);
13
+ return absolute === defaultRoot
14
+ ? `${context.profile}-${context.environment}`
15
+ : path.basename(absolute);
16
+ }
17
+ export async function onboardWorkspace(context, requested, options) {
18
+ const homeDir = options.homeDir ?? homedir();
19
+ const config = await readUserConfig(homeDir);
20
+ const existing = workspacePreferences(config, context.profile, context.environment).active;
21
+ if (!requested && existing)
22
+ return existing;
23
+ if (!/^[a-zA-Z0-9._-]{1,64}$/.test(context.profile)) {
24
+ throw new ConfigError("Profile names must use 1-64 letters, numbers, dots, underscores, or hyphens.");
25
+ }
26
+ const defaultRoot = options.defaultRoot ??
27
+ path.join(homeDir, "apollo", context.profile, context.environment);
28
+ if (!requested && !options.interactive) {
29
+ throw new ConfigError("A workspace is required for first login to this profile and environment.", `Pass --workspace ${defaultRoot}.`);
30
+ }
31
+ const selected = requested ?? (await options.prompt("Apollo workspace", defaultRoot));
32
+ return (await selectWorkspace(context, selected, {
33
+ create: true,
34
+ homeDir,
35
+ })).path;
36
+ }
37
+ export function workspacePreferences(config, profile, environment) {
38
+ return config.workspaces?.[profile]?.[environment] ?? {};
39
+ }
40
+ export async function selectWorkspace(context, root, options = {}) {
41
+ const absolute = path.resolve(root);
42
+ const homeDir = options.homeDir ?? homedir();
43
+ const manifest = options.create
44
+ ? await createWorkspace(absolute, options.name ?? defaultWorkspaceName(context, absolute, homeDir))
45
+ : await readWorkspace(absolute);
46
+ if (!manifest)
47
+ throw new ConfigError(`${absolute} is not an Apollo workspace.`);
48
+ const config = await readUserConfig(homeDir);
49
+ const current = workspacePreferences(config, context.profile, context.environment);
50
+ const known = [...new Set([...(current.known ?? []), absolute])].sort();
51
+ config.workspaces ??= {};
52
+ config.workspaces[context.profile] ??= {};
53
+ config.workspaces[context.profile][context.environment] = {
54
+ active: absolute,
55
+ known,
56
+ };
57
+ await writeUserConfig(homeDir, config);
58
+ return summary(absolute, true, manifest);
59
+ }
60
+ /**
61
+ * Resolve a `workspace use` target: a known workspace's display name, or a
62
+ * path. Names win when they match exactly (case-insensitive).
63
+ */
64
+ export async function resolveWorkspacePath(context, target, homeDir = homedir()) {
65
+ const workspaces = await listWorkspaces(context, homeDir);
66
+ const wanted = target.trim().toLowerCase();
67
+ const byName = workspaces.find((item) => (item.name ?? path.basename(item.path)).toLowerCase() === wanted);
68
+ return byName ? byName.path : target;
69
+ }
70
+ /**
71
+ * Drop a workspace (by name or path) from the known list; clears the default
72
+ * marker if it pointed there. Files on disk are untouched.
73
+ */
74
+ export async function forgetWorkspace(context, target, homeDir = homedir()) {
75
+ const resolved = path.resolve(await resolveWorkspacePath(context, target, homeDir));
76
+ const config = await readUserConfig(homeDir);
77
+ const preferences = workspacePreferences(config, context.profile, context.environment);
78
+ const wasDefault = preferences.active === resolved;
79
+ const known = (preferences.known ?? []).filter((item) => item !== resolved);
80
+ if (!wasDefault && known.length === (preferences.known ?? []).length) {
81
+ throw new ConfigError(`"${target}" is not a known workspace.`, "Check `apollo workspace list`.");
82
+ }
83
+ config.workspaces ??= {};
84
+ config.workspaces[context.profile] ??= {};
85
+ config.workspaces[context.profile][context.environment] = {
86
+ ...(wasDefault || !preferences.active ? {} : { active: preferences.active }),
87
+ known,
88
+ };
89
+ await writeUserConfig(homeDir, config);
90
+ return { path: resolved, was_default: wasDefault };
91
+ }
92
+ /** The default workspace recorded by `workspace use`/`create` (login suggestion). */
93
+ export async function defaultWorkspacePath(context, homeDir = homedir()) {
94
+ const config = await readUserConfig(homeDir);
95
+ const active = workspacePreferences(config, context.profile, context.environment).active;
96
+ if (!active) {
97
+ throw new ConfigError(`Profile "${context.profile}" has no default workspace for ${context.environment}.`, "Run `apollo workspace use <path|name>` or `apollo workspace create <path>`.");
98
+ }
99
+ return active;
100
+ }
101
+ export async function currentWorkspace(context) {
102
+ if (!context.workspaceRoot) {
103
+ throw new ConfigError("You are not inside an Apollo workspace.", "cd into one (see `apollo workspace list`) or run `apollo workspace create <path>`.");
104
+ }
105
+ const manifest = await readWorkspace(context.workspaceRoot, false);
106
+ return manifest
107
+ ? summary(context.workspaceRoot, true, manifest)
108
+ : {
109
+ path: context.workspaceRoot,
110
+ active: true,
111
+ agent_count: null,
112
+ };
113
+ }
114
+ export async function listWorkspaces(context, homeDir = homedir()) {
115
+ const config = await readUserConfig(homeDir);
116
+ const preferences = workspacePreferences(config, context.profile, context.environment);
117
+ const roots = new Set(preferences.known ?? []);
118
+ if (preferences.active)
119
+ roots.add(preferences.active);
120
+ const results = [];
121
+ for (const root of [...roots].sort()) {
122
+ if (!path.isAbsolute(root)) {
123
+ throw new ConfigError(`Configured workspace path must be absolute: ${root}`);
124
+ }
125
+ const manifest = await readWorkspace(root, false);
126
+ results.push(manifest
127
+ ? summary(root, root === preferences.active, manifest)
128
+ : {
129
+ path: root,
130
+ active: root === preferences.active,
131
+ agent_count: null,
132
+ });
133
+ }
134
+ return results;
135
+ }
136
+ function summary(root, active, manifest) {
137
+ return {
138
+ path: root,
139
+ ...(manifest.name ? { name: manifest.name } : {}),
140
+ active,
141
+ agent_count: manifest.agents.length,
142
+ ...(manifest.active_agent_id ? { active_agent_id: manifest.active_agent_id } : {}),
143
+ ...(manifest.active_project_id
144
+ ? { active_project_id: manifest.active_project_id }
145
+ : {}),
146
+ };
147
+ }
148
+ //# sourceMappingURL=workspace.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.service.js","sourceRoot":"","sources":["../../../src/services/workspace.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RuntimeApiClient } from "../api/runtime-api.js";
2
+ export type SkillTarget = "cursor" | "claude" | "opencode";
3
+ export declare function installSkills(client: RuntimeApiClient, projectRoot: string, targets: SkillTarget[]): Promise<{
4
+ skills: string[];
5
+ targets: SkillTarget[];
6
+ }>;
@@ -0,0 +1,48 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ const TARGET_DIRECTORIES = {
4
+ cursor: ".cursor/skills",
5
+ claude: ".claude/skills",
6
+ opencode: ".opencode/skills",
7
+ };
8
+ function safeSegment(value) {
9
+ if (!/^[a-zA-Z0-9._-]+$/.test(value)) {
10
+ throw new Error(`Unsafe skill path segment: ${value}`);
11
+ }
12
+ return value;
13
+ }
14
+ function safeReference(value) {
15
+ const normalised = path.posix.normalize(value.replaceAll("\\", "/"));
16
+ if (path.posix.isAbsolute(normalised) ||
17
+ normalised === ".." ||
18
+ normalised.startsWith("../")) {
19
+ throw new Error(`Unsafe skill reference path: ${value}`);
20
+ }
21
+ return normalised;
22
+ }
23
+ async function fetchSkillFiles(client, skill) {
24
+ const main = await client.getSkill(skill.id);
25
+ const files = { "SKILL.md": main.content };
26
+ for (const reference of skill.extra_files) {
27
+ const remote = await client.getSkill(skill.id, reference);
28
+ files[safeReference(reference)] = remote.content;
29
+ }
30
+ return files;
31
+ }
32
+ export async function installSkills(client, projectRoot, targets) {
33
+ const index = await client.listSkills();
34
+ for (const skill of index) {
35
+ const id = safeSegment(skill.id);
36
+ const files = await fetchSkillFiles(client, skill);
37
+ for (const target of targets) {
38
+ const destination = path.join(projectRoot, TARGET_DIRECTORIES[target], id);
39
+ for (const [relativePath, content] of Object.entries(files)) {
40
+ const targetPath = path.join(destination, relativePath);
41
+ await mkdir(path.dirname(targetPath), { recursive: true });
42
+ await writeFile(targetPath, content, "utf8");
43
+ }
44
+ }
45
+ }
46
+ return { skills: index.map((skill) => skill.id), targets };
47
+ }
48
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/skills/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAM7B,MAAM,kBAAkB,GAAgC;IACtD,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,kBAAkB;CAC7B,CAAC;AAEF,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACrE,IACE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QACjC,UAAU,KAAK,IAAI;QACnB,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAC5B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,MAAwB,EACxB,KAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,KAAK,GAA2B,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACnE,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAC1D,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAwB,EACxB,WAAmB,EACnB,OAAsB;IAEtB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAExC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3E,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;gBACxD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3D,MAAM,SAAS,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,33 @@
1
+ export declare const WORKSPACE_FILE = ".apollo-workspace.json";
2
+ export interface WorkspaceAgent {
3
+ agent_id: string;
4
+ name: string;
5
+ path: string;
6
+ }
7
+ export interface WorkspaceManifest {
8
+ config_version: 1;
9
+ /** Human-friendly display name (shown in lists/pickers, usable in `workspace use`). */
10
+ name?: string;
11
+ active_agent_id?: string;
12
+ active_project_id?: string;
13
+ agents: WorkspaceAgent[];
14
+ }
15
+ export declare function workspaceFile(root: string): string;
16
+ /**
17
+ * Walk up from `start` looking for a workspace manifest — the workspace you
18
+ * are standing in wins over the configured active pointer (nearest marker
19
+ * wins, mirroring `.apollorc` discovery).
20
+ */
21
+ export declare function findWorkspaceRoot(start: string): Promise<string | undefined>;
22
+ export declare function createWorkspace(root: string, name?: string): Promise<WorkspaceManifest>;
23
+ export declare function readWorkspace(root: string, required?: boolean): Promise<WorkspaceManifest | null>;
24
+ export declare function writeWorkspace(root: string, manifest: WorkspaceManifest): Promise<void>;
25
+ export declare function registerAgent(root: string, agent: WorkspaceAgent): Promise<WorkspaceManifest>;
26
+ export declare function selectAgent(root: string, agentId: string): Promise<WorkspaceAgent>;
27
+ export declare function setActiveProject(root: string, projectId: string): Promise<WorkspaceManifest>;
28
+ export declare function clearActiveAgent(root: string): Promise<void>;
29
+ export declare function allocateAgentDirectory(root: string, name: string, agentId: string): Promise<{
30
+ absolute: string;
31
+ relative: string;
32
+ }>;
33
+ export declare function resolveAgentPath(root: string, relativePath: string): string;
@@ -0,0 +1,246 @@
1
+ import { access, mkdir, readFile, rename, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { ConfigError } from "../errors/index.js";
4
+ export const WORKSPACE_FILE = ".apollo-workspace.json";
5
+ export function workspaceFile(root) {
6
+ return path.join(path.resolve(root), WORKSPACE_FILE);
7
+ }
8
+ /**
9
+ * Walk up from `start` looking for a workspace manifest — the workspace you
10
+ * are standing in wins over the configured active pointer (nearest marker
11
+ * wins, mirroring `.apollorc` discovery).
12
+ */
13
+ export async function findWorkspaceRoot(start) {
14
+ let directory = path.resolve(start);
15
+ for (;;) {
16
+ if (await exists(path.join(directory, WORKSPACE_FILE)))
17
+ return directory;
18
+ const parent = path.dirname(directory);
19
+ if (parent === directory)
20
+ return undefined;
21
+ directory = parent;
22
+ }
23
+ }
24
+ export async function createWorkspace(root, name) {
25
+ const absoluteRoot = path.resolve(root);
26
+ await mkdir(absoluteRoot, { recursive: true, mode: 0o700 });
27
+ const existing = await readWorkspace(absoluteRoot, false);
28
+ if (existing)
29
+ return existing;
30
+ const manifest = {
31
+ config_version: 1,
32
+ ...(name ? { name } : {}),
33
+ agents: [],
34
+ };
35
+ await writeWorkspace(absoluteRoot, manifest);
36
+ return manifest;
37
+ }
38
+ export async function readWorkspace(root, required = true) {
39
+ const target = workspaceFile(root);
40
+ let raw;
41
+ try {
42
+ raw = JSON.parse(await readFile(target, "utf8"));
43
+ }
44
+ catch (error) {
45
+ if (error.code === "ENOENT") {
46
+ if (!required)
47
+ return null;
48
+ throw new ConfigError(`${path.resolve(root)} is not an Apollo workspace.`, "Run `apollo workspace create <path>` first.");
49
+ }
50
+ if (error instanceof SyntaxError) {
51
+ throw new ConfigError(`Invalid JSON in ${target}.`);
52
+ }
53
+ throw error;
54
+ }
55
+ return validateManifest(raw, target);
56
+ }
57
+ export async function writeWorkspace(root, manifest) {
58
+ const absoluteRoot = path.resolve(root);
59
+ const validated = validateManifest(manifest, workspaceFile(absoluteRoot));
60
+ await mkdir(absoluteRoot, { recursive: true, mode: 0o700 });
61
+ const target = workspaceFile(absoluteRoot);
62
+ const temporary = `${target}.${process.pid}.tmp`;
63
+ await writeFile(temporary, `${JSON.stringify(validated, null, 2)}\n`, {
64
+ encoding: "utf8",
65
+ mode: 0o644,
66
+ });
67
+ await rename(temporary, target);
68
+ }
69
+ export async function registerAgent(root, agent) {
70
+ const manifest = await requireWorkspace(root);
71
+ validateAgent(agent, workspaceFile(root));
72
+ const pathOwner = manifest.agents.find((item) => item.path === agent.path && item.agent_id !== agent.agent_id);
73
+ if (pathOwner) {
74
+ throw new ConfigError(`Workspace path ${agent.path} is already registered to agent ${pathOwner.agent_id}.`);
75
+ }
76
+ const agents = manifest.agents.filter((item) => item.agent_id !== agent.agent_id);
77
+ agents.push(agent);
78
+ agents.sort((left, right) => left.name.localeCompare(right.name));
79
+ const next = {
80
+ config_version: 1,
81
+ ...(manifest.name ? { name: manifest.name } : {}),
82
+ active_agent_id: agent.agent_id,
83
+ agents,
84
+ };
85
+ await writeWorkspace(root, next);
86
+ return next;
87
+ }
88
+ export async function selectAgent(root, agentId) {
89
+ const manifest = await requireWorkspace(root);
90
+ const agent = manifest.agents.find((item) => item.agent_id === agentId);
91
+ if (!agent) {
92
+ throw new ConfigError(`Agent ${agentId} has no artifacts in this workspace.`, `Run \`apollo agent import ${agentId}\` first.`);
93
+ }
94
+ await writeWorkspace(root, {
95
+ config_version: 1,
96
+ ...(manifest.name ? { name: manifest.name } : {}),
97
+ agents: manifest.agents,
98
+ active_agent_id: agentId,
99
+ });
100
+ return agent;
101
+ }
102
+ export async function setActiveProject(root, projectId) {
103
+ const manifest = await requireWorkspace(root);
104
+ const next = {
105
+ config_version: 1,
106
+ ...(manifest.name ? { name: manifest.name } : {}),
107
+ agents: manifest.agents,
108
+ active_project_id: projectId,
109
+ };
110
+ await writeWorkspace(root, next);
111
+ return next;
112
+ }
113
+ export async function clearActiveAgent(root) {
114
+ const manifest = await requireWorkspace(root);
115
+ await writeWorkspace(root, {
116
+ config_version: 1,
117
+ ...(manifest.name ? { name: manifest.name } : {}),
118
+ agents: manifest.agents,
119
+ });
120
+ }
121
+ export async function allocateAgentDirectory(root, name, agentId) {
122
+ const manifest = await requireWorkspace(root);
123
+ const existing = manifest.agents.find((item) => item.agent_id === agentId);
124
+ if (existing) {
125
+ return {
126
+ absolute: resolveAgentPath(root, existing.path),
127
+ relative: existing.path,
128
+ };
129
+ }
130
+ const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") ||
131
+ "agent";
132
+ const shortId = agentId.replace(/[^a-zA-Z0-9]/g, "").slice(0, 8) || "unknown";
133
+ const base = `${slug}-${shortId}`;
134
+ let suffix = 1;
135
+ let relative = path.posix.join("agents", base);
136
+ const used = new Set(manifest.agents.map((item) => item.path));
137
+ while (used.has(relative) || (await exists(resolveAgentPath(root, relative)))) {
138
+ suffix += 1;
139
+ relative = path.posix.join("agents", `${base}-${suffix}`);
140
+ }
141
+ return { absolute: resolveAgentPath(root, relative), relative };
142
+ }
143
+ export function resolveAgentPath(root, relativePath) {
144
+ const safe = validateRelativePath(relativePath);
145
+ const absoluteRoot = path.resolve(root);
146
+ const resolved = path.resolve(absoluteRoot, safe);
147
+ if (!resolved.startsWith(`${absoluteRoot}${path.sep}`)) {
148
+ throw new ConfigError(`Agent path escapes the workspace: ${relativePath}`);
149
+ }
150
+ return resolved;
151
+ }
152
+ function validateManifest(raw, source) {
153
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
154
+ throw new ConfigError(`Invalid workspace manifest in ${source}.`);
155
+ }
156
+ const value = raw;
157
+ if (value.config_version !== 1) {
158
+ throw new ConfigError(`Unsupported workspace config_version ${String(value.config_version)} in ${source}.`);
159
+ }
160
+ if (!Array.isArray(value.agents)) {
161
+ throw new ConfigError(`Workspace agents must be an array in ${source}.`);
162
+ }
163
+ let name;
164
+ if (value.name !== undefined) {
165
+ if (typeof value.name !== "string" || value.name.trim() === "" || value.name.length > 64) {
166
+ throw new ConfigError(`Workspace name must be 1-64 characters in ${source}.`);
167
+ }
168
+ name = value.name.trim();
169
+ }
170
+ const agents = value.agents.map((agent) => validateAgent(agent, source));
171
+ const ids = new Set();
172
+ const paths = new Set();
173
+ for (const agent of agents) {
174
+ if (ids.has(agent.agent_id)) {
175
+ throw new ConfigError(`Duplicate agent ${agent.agent_id} in ${source}.`);
176
+ }
177
+ if (paths.has(agent.path)) {
178
+ throw new ConfigError(`Duplicate agent path ${agent.path} in ${source}.`);
179
+ }
180
+ ids.add(agent.agent_id);
181
+ paths.add(agent.path);
182
+ }
183
+ const active = typeof value.active_agent_id === "string"
184
+ ? value.active_agent_id
185
+ : undefined;
186
+ if (active && !ids.has(active)) {
187
+ throw new ConfigError(`Active agent ${active} is not registered in ${source}.`);
188
+ }
189
+ const activeProject = typeof value.active_project_id === "string"
190
+ ? value.active_project_id
191
+ : undefined;
192
+ if (active && activeProject) {
193
+ throw new ConfigError(`Workspace cannot set both active_agent_id and active_project_id in ${source}.`);
194
+ }
195
+ return {
196
+ config_version: 1,
197
+ ...(name ? { name } : {}),
198
+ ...(active ? { active_agent_id: active } : {}),
199
+ ...(activeProject ? { active_project_id: activeProject } : {}),
200
+ agents,
201
+ };
202
+ }
203
+ function validateAgent(raw, source) {
204
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
205
+ throw new ConfigError(`Invalid agent entry in ${source}.`);
206
+ }
207
+ const value = raw;
208
+ for (const key of ["agent_id", "name", "path"]) {
209
+ if (typeof value[key] !== "string" || value[key] === "") {
210
+ throw new ConfigError(`Workspace agent ${key} is required in ${source}.`);
211
+ }
212
+ }
213
+ return {
214
+ agent_id: value.agent_id,
215
+ name: value.name,
216
+ path: validateRelativePath(value.path),
217
+ };
218
+ }
219
+ function validateRelativePath(value) {
220
+ const normalized = path.posix.normalize(value.replaceAll("\\", "/"));
221
+ if (path.posix.isAbsolute(normalized) ||
222
+ normalized === "." ||
223
+ normalized === ".." ||
224
+ normalized.startsWith("../")) {
225
+ throw new ConfigError(`Invalid workspace agent path: ${value}`);
226
+ }
227
+ return normalized;
228
+ }
229
+ async function requireWorkspace(root) {
230
+ const manifest = await readWorkspace(root);
231
+ if (!manifest)
232
+ throw new ConfigError(`${root} is not an Apollo workspace.`);
233
+ return manifest;
234
+ }
235
+ async function exists(target) {
236
+ try {
237
+ await access(target);
238
+ return true;
239
+ }
240
+ catch (error) {
241
+ if (error.code === "ENOENT")
242
+ return false;
243
+ throw error;
244
+ }
245
+ }
246
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/workspace/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@aui.io/apollo-core",
3
+ "version": "0.1.4",
4
+ "private": true,
5
+ "description": "Shared Apollo console core — API clients, config, and services",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=20"
9
+ },
10
+ "main": "./dist/src/index.js",
11
+ "types": "./dist/src/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/src/index.d.ts",
15
+ "import": "./dist/src/index.js"
16
+ },
17
+ "./*": {
18
+ "types": "./dist/src/*",
19
+ "import": "./dist/src/*"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+ssh://git@bitbucket.org/getstuff/runtime-v2.git",
28
+ "directory": "console/core"
29
+ },
30
+ "homepage": "https://bitbucket.org/getstuff/runtime-v2/src/main/console/core/",
31
+ "scripts": {
32
+ "build": "tsc -p tsconfig.json",
33
+ "lint": "eslint .",
34
+ "test": "vitest run"
35
+ },
36
+ "dependencies": {
37
+ "picocolors": "^1.1.1",
38
+ "yaml": "^2.9.0"
39
+ },
40
+ "devDependencies": {
41
+ "@eslint/js": "^9.39.5",
42
+ "@types/node": "^24.13.3",
43
+ "eslint": "^9.39.5",
44
+ "typescript": "^5.9.3",
45
+ "typescript-eslint": "^8.65.0",
46
+ "vitest": "^3.2.7"
47
+ }
48
+ }
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { main } from "../dist/src/index.js";
4
+
5
+ process.exitCode = await main(process.argv.slice(2));
@@ -0,0 +1,19 @@
1
+ export interface GlyphOptions {
2
+ reducedMotion?: boolean;
3
+ /** Frame size in character cells (defaults: 14×7; compact accents use less). */
4
+ width?: number;
5
+ height?: number;
6
+ /** Subtle typographic accent: thin outline, no node blobs or trails. */
7
+ compact?: boolean;
8
+ }
9
+ /** Stateful glyph frame provider for Overview / demo. */
10
+ export declare class GlyphController {
11
+ private sim;
12
+ private reduced;
13
+ private trails;
14
+ private readonly size;
15
+ constructor(seed: string, options?: GlyphOptions);
16
+ setWorking(working: boolean): void;
17
+ frame(): string[];
18
+ private pushTrail;
19
+ }
@@ -0,0 +1,41 @@
1
+ import { GlyphSimulator, IDLE_CONFIG, WORKING_CONFIG, prefersReducedMotion, renderGlyphFrame, } from "../lib/attractor.js";
2
+ const TRAIL_FRAMES = 2;
3
+ /** Stateful glyph frame provider for Overview / demo. */
4
+ export class GlyphController {
5
+ sim;
6
+ reduced;
7
+ trails = [];
8
+ size;
9
+ constructor(seed, options = {}) {
10
+ this.sim = new GlyphSimulator(seed, IDLE_CONFIG);
11
+ this.reduced = options.reducedMotion ?? prefersReducedMotion();
12
+ this.size = {
13
+ ...(options.width !== undefined ? { width: options.width } : {}),
14
+ ...(options.height !== undefined ? { height: options.height } : {}),
15
+ ...(options.compact !== undefined ? { compact: options.compact } : {}),
16
+ };
17
+ }
18
+ setWorking(working) {
19
+ const config = working ? WORKING_CONFIG : IDLE_CONFIG;
20
+ this.sim.setConfig(config);
21
+ }
22
+ frame() {
23
+ if (this.reduced) {
24
+ return renderGlyphFrame([], { staticMode: true, ...this.size });
25
+ }
26
+ const nodes = this.sim.tick();
27
+ const frame = renderGlyphFrame(nodes, {
28
+ ...this.size,
29
+ ...(this.size.compact ? {} : { trails: this.trails.flat() }),
30
+ });
31
+ if (!this.size.compact)
32
+ this.pushTrail(nodes);
33
+ return frame;
34
+ }
35
+ pushTrail(nodes) {
36
+ this.trails.push(nodes.map((n) => ({ x: n.x, y: n.y })));
37
+ if (this.trails.length > TRAIL_FRAMES)
38
+ this.trails.shift();
39
+ }
40
+ }
41
+ //# sourceMappingURL=glyph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glyph.js","sourceRoot":"","sources":["../../../src/components/glyph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAW7B,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB,yDAAyD;AACzD,MAAM,OAAO,eAAe;IAClB,GAAG,CAAiB;IACpB,OAAO,CAAU;IACjB,MAAM,GAAiC,EAAE,CAAC;IACjC,IAAI,CAAyD;IAE9E,YAAY,IAAY,EAAE,UAAwB,EAAE;QAClD,IAAI,CAAC,GAAG,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,aAAa,IAAI,oBAAoB,EAAE,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,OAAgB;QACzB,MAAM,MAAM,GAAoB,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,gBAAgB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,EAAE;YACpC,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;SAC7D,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,SAAS,CAAC,KAAkB;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,YAAY;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { GlyphController } from "./components/glyph.js";
2
+ export { GlyphSimulator, IDLE_CONFIG, WORKING_CONFIG, renderGlyphFrame, seedFromString, stepAttractor, } from "./lib/attractor.js";
3
+ export { SLASH_COMMANDS, filterCommands, resolveCommand } from "./lib/commands.js";
4
+ export { TABS } from "./lib/tabs.js";
5
+ export declare function main(argv?: string[]): Promise<number>;