forgeos 0.1.0-alpha.13 → 0.1.0-alpha.14

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 (225) hide show
  1. package/AGENTS.md +6 -5
  2. package/CHANGELOG.md +12 -0
  3. package/adapters/java/README.md +68 -0
  4. package/adapters/java/pom.xml +34 -0
  5. package/adapters/java/src/main/java/dev/forgeos/adapter/Auth.java +20 -0
  6. package/adapters/java/src/main/java/dev/forgeos/adapter/Diagnostic.java +16 -0
  7. package/adapters/java/src/main/java/dev/forgeos/adapter/Entry.java +38 -0
  8. package/adapters/java/src/main/java/dev/forgeos/adapter/EntryKind.java +16 -0
  9. package/adapters/java/src/main/java/dev/forgeos/adapter/ErrorInfo.java +4 -0
  10. package/adapters/java/src/main/java/dev/forgeos/adapter/Forge.java +94 -0
  11. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeCall.java +12 -0
  12. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeContext.java +11 -0
  13. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHandler.java +8 -0
  14. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeHttpHandler.java +179 -0
  15. package/adapters/java/src/main/java/dev/forgeos/adapter/ForgeRegistry.java +121 -0
  16. package/adapters/java/src/main/java/dev/forgeos/adapter/Json.java +14 -0
  17. package/adapters/java/src/main/java/dev/forgeos/adapter/Manifest.java +14 -0
  18. package/adapters/java/src/main/java/dev/forgeos/adapter/RequestEnvelope.java +6 -0
  19. package/adapters/java/src/main/java/dev/forgeos/adapter/ResponseEnvelope.java +25 -0
  20. package/adapters/java/src/main/java/dev/forgeos/adapter/Risk.java +18 -0
  21. package/adapters/java/src/main/java/dev/forgeos/adapter/Schemas.java +36 -0
  22. package/adapters/java/src/main/java/dev/forgeos/adapter/Service.java +65 -0
  23. package/adapters/java/src/main/java/dev/forgeos/adapter/TransactionMode.java +18 -0
  24. package/adapters/java/src/main/java/dev/forgeos/adapter/TypedForgeHandler.java +6 -0
  25. package/adapters/java/target/classes/dev/forgeos/adapter/Auth.class +0 -0
  26. package/adapters/java/target/classes/dev/forgeos/adapter/Diagnostic.class +0 -0
  27. package/adapters/java/target/classes/dev/forgeos/adapter/Entry.class +0 -0
  28. package/adapters/java/target/classes/dev/forgeos/adapter/EntryKind.class +0 -0
  29. package/adapters/java/target/classes/dev/forgeos/adapter/ErrorInfo.class +0 -0
  30. package/adapters/java/target/classes/dev/forgeos/adapter/Forge.class +0 -0
  31. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeCall.class +0 -0
  32. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeContext.class +0 -0
  33. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHandler.class +0 -0
  34. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeHttpHandler.class +0 -0
  35. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$EntryOption.class +0 -0
  36. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegisteredEntry.class +0 -0
  37. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry$RegistryOption.class +0 -0
  38. package/adapters/java/target/classes/dev/forgeos/adapter/ForgeRegistry.class +0 -0
  39. package/adapters/java/target/classes/dev/forgeos/adapter/Json.class +0 -0
  40. package/adapters/java/target/classes/dev/forgeos/adapter/Manifest.class +0 -0
  41. package/adapters/java/target/classes/dev/forgeos/adapter/RequestEnvelope.class +0 -0
  42. package/adapters/java/target/classes/dev/forgeos/adapter/ResponseEnvelope.class +0 -0
  43. package/adapters/java/target/classes/dev/forgeos/adapter/Risk.class +0 -0
  44. package/adapters/java/target/classes/dev/forgeos/adapter/Schemas.class +0 -0
  45. package/adapters/java/target/classes/dev/forgeos/adapter/Service.class +0 -0
  46. package/adapters/java/target/classes/dev/forgeos/adapter/TransactionMode.class +0 -0
  47. package/adapters/java/target/classes/dev/forgeos/adapter/TypedForgeHandler.class +0 -0
  48. package/adapters/java/target/forge-java-adapter-0.1.0-alpha.11.jar +0 -0
  49. package/adapters/java/target/maven-archiver/pom.properties +3 -0
  50. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +23 -0
  51. package/adapters/java/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +20 -0
  52. package/adapters/java-spring-boot-starter/README.md +32 -0
  53. package/adapters/java-spring-boot-starter/pom.xml +36 -0
  54. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeCommand.java +22 -0
  55. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeExternalService.java +15 -0
  56. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeQuery.java +16 -0
  57. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.java +18 -0
  58. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.java +16 -0
  59. package/adapters/java-spring-boot-starter/src/main/java/dev/forgeos/adapter/spring/ForgeSpringRuntime.java +104 -0
  60. package/adapters/java-spring-boot-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  61. package/adapters/java-spring-boot-starter/target/classes/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +1 -0
  62. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeCommand.class +0 -0
  63. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeExternalService.class +0 -0
  64. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeQuery.class +0 -0
  65. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeServiceBeanCondition.class +0 -0
  66. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringAutoConfiguration.class +0 -0
  67. package/adapters/java-spring-boot-starter/target/classes/dev/forgeos/adapter/spring/ForgeSpringRuntime.class +0 -0
  68. package/adapters/java-spring-boot-starter/target/forge-java-spring-boot-starter-0.1.0-alpha.11.jar +0 -0
  69. package/adapters/java-spring-boot-starter/target/maven-archiver/pom.properties +3 -0
  70. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +6 -0
  71. package/adapters/java-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +6 -0
  72. package/docs/forge-protocol.md +33 -0
  73. package/examples/java-billing/pom.xml +52 -0
  74. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/CreateInvoiceInput.java +4 -0
  75. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Invoice.java +11 -0
  76. package/examples/java-billing/src/main/java/dev/forgeos/examples/billing/Main.java +127 -0
  77. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/CreateInvoiceInput.class +0 -0
  78. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Invoice.class +0 -0
  79. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$EmptyInput.class +0 -0
  80. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main$Options.class +0 -0
  81. package/examples/java-billing/target/classes/dev/forgeos/examples/billing/Main.class +0 -0
  82. package/examples/java-billing/target/java-billing-0.1.0-alpha.11-all.jar +0 -0
  83. package/examples/java-billing/target/java-billing-0.1.0-alpha.11.jar +0 -0
  84. package/examples/java-billing/target/maven-archiver/pom.properties +3 -0
  85. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +5 -0
  86. package/examples/java-billing/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +3 -0
  87. package/package.json +4 -1
  88. package/src/forge/_generated/actionSubscriptions.json +1 -1
  89. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  90. package/src/forge/_generated/agentAdapterManifest.json +1 -1
  91. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  92. package/src/forge/_generated/agentContract.json +1 -1
  93. package/src/forge/_generated/agentContract.ts +1274 -7
  94. package/src/forge/_generated/agentQuickstart.md +1 -1
  95. package/src/forge/_generated/agentTools.json +1 -1
  96. package/src/forge/_generated/agentTools.md +1 -1
  97. package/src/forge/_generated/agentTools.ts +2 -2
  98. package/src/forge/_generated/aiContext.ts +1 -1
  99. package/src/forge/_generated/aiModels.ts +1 -1
  100. package/src/forge/_generated/aiProviders.ts +1 -1
  101. package/src/forge/_generated/aiRegistry.json +1 -1
  102. package/src/forge/_generated/aiRegistry.ts +3 -3
  103. package/src/forge/_generated/api.json +1 -1
  104. package/src/forge/_generated/api.ts +1 -1
  105. package/src/forge/_generated/appGraph.json +1 -1
  106. package/src/forge/_generated/appGraph.ts +107 -78
  107. package/src/forge/_generated/appMap.md +1 -1
  108. package/src/forge/_generated/artifactManifest.json +1 -1
  109. package/src/forge/_generated/artifactManifest.ts +2 -2
  110. package/src/forge/_generated/authClaims.ts +1 -1
  111. package/src/forge/_generated/authConfig.ts +1 -1
  112. package/src/forge/_generated/authContext.ts +1 -1
  113. package/src/forge/_generated/authRegistry.ts +1 -1
  114. package/src/forge/_generated/buildInfo.json +1 -1
  115. package/src/forge/_generated/buildInfo.ts +4 -4
  116. package/src/forge/_generated/capabilityMap.json +1 -1
  117. package/src/forge/_generated/capabilityMap.md +1 -1
  118. package/src/forge/_generated/capabilityMap.ts +2 -2
  119. package/src/forge/_generated/client.ts +1 -1
  120. package/src/forge/_generated/clientApi.ts +1 -1
  121. package/src/forge/_generated/clientManifest.json +1 -1
  122. package/src/forge/_generated/clientManifest.ts +14 -3
  123. package/src/forge/_generated/clientTypes.ts +1 -1
  124. package/src/forge/_generated/configRegistry.ts +1 -1
  125. package/src/forge/_generated/dataGraph.json +1 -1
  126. package/src/forge/_generated/dataGraph.ts +3 -3
  127. package/src/forge/_generated/db.ts +1 -1
  128. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  129. package/src/forge/_generated/dbSessionContext.ts +1 -1
  130. package/src/forge/_generated/deployManifest.json +1 -1
  131. package/src/forge/_generated/deployManifest.ts +7 -7
  132. package/src/forge/_generated/devManifest.json +1 -1
  133. package/src/forge/_generated/devManifest.ts +3 -3
  134. package/src/forge/_generated/envSchema.ts +1 -1
  135. package/src/forge/_generated/externalServices.ts +1 -1
  136. package/src/forge/_generated/frontendGraph.ts +1 -1
  137. package/src/forge/_generated/importGuards.json +1 -1
  138. package/src/forge/_generated/importGuards.ts +35 -1
  139. package/src/forge/_generated/index.ts +3 -1
  140. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  141. package/src/forge/_generated/liveProtocol.ts +1 -1
  142. package/src/forge/_generated/liveQueryRegistry.json +1 -1
  143. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  144. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  145. package/src/forge/_generated/makeRegistry.json +1 -1
  146. package/src/forge/_generated/makeRegistry.ts +8 -8
  147. package/src/forge/_generated/makeTemplates.json +1 -1
  148. package/src/forge/_generated/makeTemplates.ts +2 -2
  149. package/src/forge/_generated/mockMap.ts +1 -1
  150. package/src/forge/_generated/operationPlaybooks.md +6 -6
  151. package/src/forge/_generated/packageGraph.json +1 -1
  152. package/src/forge/_generated/packageGraph.ts +52412 -2
  153. package/src/forge/_generated/packageUpgradeRegistry.json +1 -1
  154. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  155. package/src/forge/_generated/permissionMatrix.json +1 -1
  156. package/src/forge/_generated/permissionMatrix.ts +3 -3
  157. package/src/forge/_generated/policyRegistry.json +1 -1
  158. package/src/forge/_generated/policyRegistry.ts +3 -3
  159. package/src/forge/_generated/queryRegistry.json +1 -1
  160. package/src/forge/_generated/queryRegistry.ts +3 -3
  161. package/src/forge/_generated/react.d.ts +1 -1
  162. package/src/forge/_generated/react.ts +1 -1
  163. package/src/forge/_generated/reactManifest.json +1 -1
  164. package/src/forge/_generated/reactManifest.ts +3 -3
  165. package/src/forge/_generated/releaseManifest.json +1 -1
  166. package/src/forge/_generated/releaseManifest.ts +3 -3
  167. package/src/forge/_generated/rlsPolicies.sql +1 -1
  168. package/src/forge/_generated/rlsPolicies.ts +1 -1
  169. package/src/forge/_generated/runtimeGraph.json +1 -1
  170. package/src/forge/_generated/runtimeGraph.ts +3 -3
  171. package/src/forge/_generated/runtimeMatrix.json +1 -1
  172. package/src/forge/_generated/runtimeMatrix.ts +70357 -1
  173. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  174. package/src/forge/_generated/runtimeRules.md +1 -1
  175. package/src/forge/_generated/secretRegistry.ts +1 -1
  176. package/src/forge/_generated/secretsContext.ts +1 -1
  177. package/src/forge/_generated/serverApi.ts +1 -1
  178. package/src/forge/_generated/sourceMapManifest.json +1 -1
  179. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  180. package/src/forge/_generated/sqlPlan.ts +1 -1
  181. package/src/forge/_generated/subscriptionManifest.json +1 -1
  182. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  183. package/src/forge/_generated/symbolicationManifest.json +1 -1
  184. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  185. package/src/forge/_generated/telemetryRegistry.json +1 -1
  186. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  187. package/src/forge/_generated/telemetrySinks.json +1 -1
  188. package/src/forge/_generated/telemetrySinks.ts +2 -2
  189. package/src/forge/_generated/tenantScope.json +1 -1
  190. package/src/forge/_generated/tenantScope.ts +3 -3
  191. package/src/forge/_generated/testGraph.json +1 -1
  192. package/src/forge/_generated/testGraph.ts +71 -5
  193. package/src/forge/_generated/testPlanRegistry.json +1 -1
  194. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  195. package/src/forge/_generated/uiRoutes.ts +1 -1
  196. package/src/forge/_generated/uiScenarios.ts +1 -1
  197. package/src/forge/_generated/uiTestManifest.json +1 -1
  198. package/src/forge/_generated/uiTestManifest.ts +2 -2
  199. package/src/forge/_generated/vue.d.ts +25 -0
  200. package/src/forge/_generated/vue.ts +30 -0
  201. package/src/forge/_generated/vueManifest.json +1 -0
  202. package/src/forge/_generated/vueManifest.ts +19 -0
  203. package/src/forge/_generated/workflowRegistry.json +1 -1
  204. package/src/forge/_generated/workflowRegistry.ts +3 -3
  205. package/src/forge/_generated/workflowSubscriptions.json +1 -1
  206. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  207. package/src/forge/agent-adapters/index.ts +1 -1
  208. package/src/forge/cli/parse.ts +1 -1
  209. package/src/forge/cli/verify.ts +2 -0
  210. package/src/forge/compiler/agent-contract/build.ts +10 -9
  211. package/src/forge/compiler/client-sdk/build-manifest.ts +55 -0
  212. package/src/forge/compiler/client-sdk/render-client.ts +66 -1
  213. package/src/forge/compiler/diagnostics/create.ts +6 -1
  214. package/src/forge/compiler/emitter/barrel.ts +3 -0
  215. package/src/forge/compiler/frontend-graph/build.ts +85 -13
  216. package/src/forge/compiler/make-registry/build.ts +6 -7
  217. package/src/forge/compiler/orchestrator/plan.ts +13 -0
  218. package/src/forge/compiler/orchestrator/serialize.ts +6 -0
  219. package/src/forge/compiler/types/frontend-graph.ts +2 -2
  220. package/src/forge/intent/index.ts +11 -6
  221. package/src/forge/make/index.ts +23 -3
  222. package/src/forge/make/templates.ts +153 -0
  223. package/src/forge/make/types.ts +2 -1
  224. package/src/forge/version.ts +1 -1
  225. package/src/forge/vue/index.ts +407 -0
@@ -0,0 +1,407 @@
1
+ import {
2
+ computed,
3
+ inject,
4
+ onScopeDispose,
5
+ provide,
6
+ shallowRef,
7
+ toValue,
8
+ watch,
9
+ } from "vue";
10
+ import type { App, InjectionKey, MaybeRefOrGetter, ShallowRef } from "vue";
11
+
12
+ export type ForgeVueAuth = {
13
+ userId?: string;
14
+ tenantId?: string;
15
+ role?: string;
16
+ token?: string;
17
+ getToken?: () => string | Promise<string>;
18
+ headers?: Record<string, string>;
19
+ [key: string]: unknown;
20
+ };
21
+
22
+ export type ForgeVueAuthProvider =
23
+ | ForgeVueAuth
24
+ | (() => Promise<ForgeVueAuth>);
25
+
26
+ export type ForgeVueClientConfig = {
27
+ url: string;
28
+ auth?: ForgeVueAuthProvider;
29
+ };
30
+
31
+ export type ForgeDevAuthConfig =
32
+ | boolean
33
+ | {
34
+ userId?: string;
35
+ tenantId?: string;
36
+ role?: string;
37
+ headers?: Record<string, string>;
38
+ };
39
+
40
+ export type ForgeVuePluginOptions = ForgeVueClientConfig & {
41
+ devAuth?: ForgeDevAuthConfig;
42
+ };
43
+
44
+ export type ForgeVueError = Error & {
45
+ code?: string;
46
+ status?: number;
47
+ traceId?: string;
48
+ details?: unknown;
49
+ };
50
+
51
+ export type LiveSnapshot<T> = {
52
+ subscriptionId: string;
53
+ revision: number;
54
+ data: T;
55
+ traceId?: string;
56
+ };
57
+
58
+ export type ForgeVueClient = {
59
+ lastTraceId?: string;
60
+ query(name: string, args: unknown): Promise<unknown>;
61
+ command(name: string, args: unknown): Promise<unknown>;
62
+ liveQuery(
63
+ name: string,
64
+ args: unknown,
65
+ onSnapshot: (snapshot: LiveSnapshot<unknown>) => void,
66
+ onError?: (error: ForgeVueError) => void,
67
+ options?: { signal?: AbortSignal },
68
+ ): () => void;
69
+ };
70
+
71
+ export type UseForgeQueryOptions = {
72
+ enabled?: MaybeRefOrGetter<boolean>;
73
+ };
74
+
75
+ export type UseForgeQueryResult<T> = {
76
+ data: Readonly<ShallowRef<T | undefined>>;
77
+ error: Readonly<ShallowRef<ForgeVueError | null>>;
78
+ loading: Readonly<ShallowRef<boolean>>;
79
+ refetch: () => Promise<void>;
80
+ traceId: Readonly<ShallowRef<string | undefined>>;
81
+ };
82
+
83
+ export type UseForgeCommandOptions<TResult> = {
84
+ onSuccess?: (result: TResult) => void;
85
+ onError?: (error: ForgeVueError) => void;
86
+ };
87
+
88
+ export type UseForgeCommandResult<TArgs, TResult> = {
89
+ run: (args: TArgs) => Promise<TResult>;
90
+ loading: Readonly<ShallowRef<boolean>>;
91
+ error: Readonly<ShallowRef<ForgeVueError | null>>;
92
+ result: Readonly<ShallowRef<TResult | undefined>>;
93
+ traceId: Readonly<ShallowRef<string | undefined>>;
94
+ reset: () => void;
95
+ };
96
+
97
+ export type UseForgeLiveQueryOptions = {
98
+ enabled?: MaybeRefOrGetter<boolean>;
99
+ };
100
+
101
+ export type UseForgeLiveQueryResult<T> = {
102
+ data: Readonly<ShallowRef<T | undefined>>;
103
+ error: Readonly<ShallowRef<ForgeVueError | null>>;
104
+ loading: Readonly<ShallowRef<boolean>>;
105
+ connected: Readonly<ShallowRef<boolean>>;
106
+ revision: Readonly<ShallowRef<number | undefined>>;
107
+ traceId: Readonly<ShallowRef<string | undefined>>;
108
+ reconnect: () => void;
109
+ };
110
+
111
+ type ForgeVueContext<TClient extends ForgeVueClient> = {
112
+ client: TClient;
113
+ auth?: ForgeVueAuthProvider;
114
+ };
115
+
116
+ export type ForgeVueBindings<TClient extends ForgeVueClient = ForgeVueClient> = {
117
+ ForgeVuePlugin: {
118
+ install(app: App, options: ForgeVuePluginOptions): void;
119
+ };
120
+ provideForge: (options: ForgeVuePluginOptions) => TClient;
121
+ useForgeClient: () => TClient;
122
+ useForgeAuth: () => ForgeVueAuth | undefined;
123
+ useForgeQuery: <TResult = unknown>(
124
+ name: MaybeRefOrGetter<string>,
125
+ args: MaybeRefOrGetter<unknown>,
126
+ options?: UseForgeQueryOptions,
127
+ ) => UseForgeQueryResult<TResult>;
128
+ useForgeCommand: <TArgs = unknown, TResult = unknown>(
129
+ name: MaybeRefOrGetter<string>,
130
+ options?: UseForgeCommandOptions<TResult>,
131
+ ) => UseForgeCommandResult<TArgs, TResult>;
132
+ useForgeLiveQuery: <TResult = unknown>(
133
+ name: MaybeRefOrGetter<string>,
134
+ args: MaybeRefOrGetter<unknown>,
135
+ options?: UseForgeLiveQueryOptions,
136
+ ) => UseForgeLiveQueryResult<TResult>;
137
+ };
138
+
139
+ function stableStringify(value: unknown): string {
140
+ const seen = new WeakSet<object>();
141
+
142
+ function normalize(input: unknown): unknown {
143
+ if (input === null || typeof input !== "object") {
144
+ return input;
145
+ }
146
+ if (seen.has(input)) {
147
+ return "[Circular]";
148
+ }
149
+ seen.add(input);
150
+ if (Array.isArray(input)) {
151
+ return input.map(normalize);
152
+ }
153
+ const record = input as Record<string, unknown>;
154
+ return Object.keys(record)
155
+ .sort()
156
+ .reduce<Record<string, unknown>>((acc, key) => {
157
+ acc[key] = normalize(record[key]);
158
+ return acc;
159
+ }, {});
160
+ }
161
+
162
+ return JSON.stringify(normalize(value));
163
+ }
164
+
165
+ function toForgeError(error: unknown): ForgeVueError {
166
+ if (error instanceof Error) {
167
+ return error as ForgeVueError;
168
+ }
169
+ const wrapped = new Error(String(error)) as ForgeVueError;
170
+ wrapped.code = "FORGE_VUE_ERROR";
171
+ return wrapped;
172
+ }
173
+
174
+ function resolveDevAuth(devAuth: ForgeDevAuthConfig | undefined): ForgeVueAuthProvider | undefined {
175
+ if (!devAuth) {
176
+ return undefined;
177
+ }
178
+ const config = typeof devAuth === "object" ? devAuth : {};
179
+ return {
180
+ userId: config.userId ?? "dev-user",
181
+ tenantId: config.tenantId ?? "dev-tenant",
182
+ role: config.role ?? "owner",
183
+ headers: config.headers,
184
+ };
185
+ }
186
+
187
+ function readonlyRef<T>(ref: ShallowRef<T>): Readonly<ShallowRef<T>> {
188
+ return ref;
189
+ }
190
+
191
+ export function createForgeVueBindings<TClient extends ForgeVueClient>(
192
+ createForgeClient: (config: ForgeVueClientConfig) => TClient,
193
+ ): ForgeVueBindings<TClient> {
194
+ const forgeVueKey: InjectionKey<ForgeVueContext<TClient>> = Symbol("ForgeVue");
195
+
196
+ function createContext(options: ForgeVuePluginOptions): ForgeVueContext<TClient> {
197
+ const auth = options.auth ?? resolveDevAuth(options.devAuth);
198
+ return {
199
+ client: createForgeClient({ url: options.url, auth }),
200
+ auth,
201
+ };
202
+ }
203
+
204
+ const ForgeVuePlugin = {
205
+ install(app: App, options: ForgeVuePluginOptions): void {
206
+ app.provide(forgeVueKey, createContext(options));
207
+ },
208
+ };
209
+
210
+ function provideForge(options: ForgeVuePluginOptions): TClient {
211
+ const context = createContext(options);
212
+ provide(forgeVueKey, context);
213
+ return context.client;
214
+ }
215
+
216
+ function useContextValue(): ForgeVueContext<TClient> {
217
+ const value = inject(forgeVueKey);
218
+ if (!value) {
219
+ const error = new Error("useForgeClient must be used after provideForge or ForgeVuePlugin.") as ForgeVueError;
220
+ error.code = "FORGE_VUE_PROVIDER_MISSING";
221
+ throw error;
222
+ }
223
+ return value;
224
+ }
225
+
226
+ function useForgeClient(): TClient {
227
+ return useContextValue().client;
228
+ }
229
+
230
+ function useForgeAuth(): ForgeVueAuth | undefined {
231
+ const { auth } = useContextValue();
232
+ return typeof auth === "function" ? undefined : auth;
233
+ }
234
+
235
+ function useForgeQuery<TResult = unknown>(
236
+ name: MaybeRefOrGetter<string>,
237
+ args: MaybeRefOrGetter<unknown>,
238
+ options?: UseForgeQueryOptions,
239
+ ): UseForgeQueryResult<TResult> {
240
+ const client = useForgeClient();
241
+ const data = shallowRef<TResult | undefined>();
242
+ const error = shallowRef<ForgeVueError | null>(null);
243
+ const loading = shallowRef(false);
244
+ const traceId = shallowRef<string | undefined>();
245
+ const enabled = computed(() => toValue(options?.enabled ?? true) !== false);
246
+ const argsKey = computed(() => stableStringify(toValue(args)));
247
+
248
+ async function refetch(): Promise<void> {
249
+ if (!enabled.value) {
250
+ return;
251
+ }
252
+ loading.value = true;
253
+ error.value = null;
254
+ try {
255
+ data.value = (await client.query(toValue(name), toValue(args))) as TResult;
256
+ traceId.value = client.lastTraceId;
257
+ } catch (caught) {
258
+ error.value = toForgeError(caught);
259
+ } finally {
260
+ loading.value = false;
261
+ }
262
+ }
263
+
264
+ watch(
265
+ [() => toValue(name), argsKey, enabled],
266
+ () => {
267
+ void refetch();
268
+ },
269
+ { immediate: true },
270
+ );
271
+
272
+ return {
273
+ data: readonlyRef(data),
274
+ error: readonlyRef(error),
275
+ loading: readonlyRef(loading),
276
+ refetch,
277
+ traceId: readonlyRef(traceId),
278
+ };
279
+ }
280
+
281
+ function useForgeCommand<TArgs = unknown, TResult = unknown>(
282
+ name: MaybeRefOrGetter<string>,
283
+ options?: UseForgeCommandOptions<TResult>,
284
+ ): UseForgeCommandResult<TArgs, TResult> {
285
+ const client = useForgeClient();
286
+ const result = shallowRef<TResult | undefined>();
287
+ const error = shallowRef<ForgeVueError | null>(null);
288
+ const loading = shallowRef(false);
289
+ const traceId = shallowRef<string | undefined>();
290
+
291
+ async function run(args: TArgs): Promise<TResult> {
292
+ loading.value = true;
293
+ error.value = null;
294
+ try {
295
+ const value = (await client.command(toValue(name), args)) as TResult;
296
+ result.value = value;
297
+ traceId.value = client.lastTraceId;
298
+ options?.onSuccess?.(value);
299
+ return value;
300
+ } catch (caught) {
301
+ const forgeError = toForgeError(caught);
302
+ error.value = forgeError;
303
+ options?.onError?.(forgeError);
304
+ throw forgeError;
305
+ } finally {
306
+ loading.value = false;
307
+ }
308
+ }
309
+
310
+ function reset(): void {
311
+ result.value = undefined;
312
+ error.value = null;
313
+ traceId.value = undefined;
314
+ loading.value = false;
315
+ }
316
+
317
+ return {
318
+ run,
319
+ loading: readonlyRef(loading),
320
+ error: readonlyRef(error),
321
+ result: readonlyRef(result),
322
+ traceId: readonlyRef(traceId),
323
+ reset,
324
+ };
325
+ }
326
+
327
+ function useForgeLiveQuery<TResult = unknown>(
328
+ name: MaybeRefOrGetter<string>,
329
+ args: MaybeRefOrGetter<unknown>,
330
+ options?: UseForgeLiveQueryOptions,
331
+ ): UseForgeLiveQueryResult<TResult> {
332
+ const client = useForgeClient();
333
+ const data = shallowRef<TResult | undefined>();
334
+ const error = shallowRef<ForgeVueError | null>(null);
335
+ const loading = shallowRef(true);
336
+ const connected = shallowRef(false);
337
+ const revision = shallowRef<number | undefined>();
338
+ const traceId = shallowRef<string | undefined>();
339
+ const reconnectNonce = shallowRef(0);
340
+ const enabled = computed(() => toValue(options?.enabled ?? true) !== false);
341
+ const argsKey = computed(() => stableStringify(toValue(args)));
342
+ let unsubscribe: (() => void) | undefined;
343
+
344
+ function close(): void {
345
+ unsubscribe?.();
346
+ unsubscribe = undefined;
347
+ connected.value = false;
348
+ }
349
+
350
+ function connect(): void {
351
+ close();
352
+ if (!enabled.value) {
353
+ loading.value = false;
354
+ return;
355
+ }
356
+ loading.value = true;
357
+ error.value = null;
358
+ unsubscribe = client.liveQuery(
359
+ toValue(name),
360
+ toValue(args),
361
+ (snapshot) => {
362
+ data.value = snapshot.data as TResult;
363
+ revision.value = snapshot.revision;
364
+ traceId.value = snapshot.traceId;
365
+ connected.value = true;
366
+ loading.value = false;
367
+ },
368
+ (caught) => {
369
+ error.value = toForgeError(caught);
370
+ connected.value = false;
371
+ loading.value = false;
372
+ },
373
+ );
374
+ }
375
+
376
+ function reconnect(): void {
377
+ reconnectNonce.value += 1;
378
+ }
379
+
380
+ watch(
381
+ [() => toValue(name), argsKey, enabled, reconnectNonce],
382
+ connect,
383
+ { immediate: true },
384
+ );
385
+ onScopeDispose(close);
386
+
387
+ return {
388
+ data: readonlyRef(data),
389
+ error: readonlyRef(error),
390
+ loading: readonlyRef(loading),
391
+ connected: readonlyRef(connected),
392
+ revision: readonlyRef(revision),
393
+ traceId: readonlyRef(traceId),
394
+ reconnect,
395
+ };
396
+ }
397
+
398
+ return {
399
+ ForgeVuePlugin,
400
+ provideForge,
401
+ useForgeClient,
402
+ useForgeAuth,
403
+ useForgeQuery,
404
+ useForgeCommand,
405
+ useForgeLiveQuery,
406
+ };
407
+ }