forgeos 0.1.0-alpha.2 → 0.1.0-alpha.3

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 (163) hide show
  1. package/AGENTS.md +38 -3
  2. package/README.md +6 -5
  3. package/package.json +5 -4
  4. package/src/forge/_generated/actionSubscriptions.json +2 -2
  5. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  6. package/src/forge/_generated/agentAdapterManifest.json +2 -2
  7. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  8. package/src/forge/_generated/agentContract.json +2 -2
  9. package/src/forge/_generated/agentContract.ts +183 -50
  10. package/src/forge/_generated/agentQuickstart.md +3 -1
  11. package/src/forge/_generated/agentTools.json +2 -0
  12. package/src/forge/_generated/agentTools.md +16 -0
  13. package/src/forge/_generated/agentTools.ts +12 -0
  14. package/src/forge/_generated/aiContext.ts +67 -1
  15. package/src/forge/_generated/aiModels.json +2 -2
  16. package/src/forge/_generated/aiModels.ts +17 -1
  17. package/src/forge/_generated/aiProviders.json +1 -1
  18. package/src/forge/_generated/aiProviders.ts +1 -1
  19. package/src/forge/_generated/aiRegistry.json +2 -2
  20. package/src/forge/_generated/aiRegistry.ts +7 -5
  21. package/src/forge/_generated/api.json +2 -2
  22. package/src/forge/_generated/api.ts +1 -1
  23. package/src/forge/_generated/appGraph.json +2 -2
  24. package/src/forge/_generated/appGraph.ts +288 -180
  25. package/src/forge/_generated/appMap.md +21 -1
  26. package/src/forge/_generated/artifactManifest.json +2 -2
  27. package/src/forge/_generated/artifactManifest.ts +2 -2
  28. package/src/forge/_generated/authClaims.json +1 -1
  29. package/src/forge/_generated/authClaims.ts +1 -1
  30. package/src/forge/_generated/authConfig.json +1 -1
  31. package/src/forge/_generated/authConfig.ts +1 -1
  32. package/src/forge/_generated/authContext.ts +1 -1
  33. package/src/forge/_generated/authRegistry.json +1 -1
  34. package/src/forge/_generated/authRegistry.ts +1 -1
  35. package/src/forge/_generated/buildInfo.json +2 -2
  36. package/src/forge/_generated/buildInfo.ts +4 -4
  37. package/src/forge/_generated/capabilityMap.json +2 -2
  38. package/src/forge/_generated/capabilityMap.md +1 -1
  39. package/src/forge/_generated/capabilityMap.ts +2 -2
  40. package/src/forge/_generated/client.ts +1 -1
  41. package/src/forge/_generated/clientApi.ts +1 -1
  42. package/src/forge/_generated/clientManifest.json +2 -2
  43. package/src/forge/_generated/clientManifest.ts +3 -3
  44. package/src/forge/_generated/clientTypes.ts +1 -1
  45. package/src/forge/_generated/configRegistry.json +1 -1
  46. package/src/forge/_generated/configRegistry.ts +1 -1
  47. package/src/forge/_generated/dataGraph.json +2 -2
  48. package/src/forge/_generated/dataGraph.ts +3 -3
  49. package/src/forge/_generated/db.json +1 -1
  50. package/src/forge/_generated/db.ts +1 -1
  51. package/src/forge/_generated/dbSecurityManifest.json +1 -1
  52. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  53. package/src/forge/_generated/dbSessionContext.json +1 -1
  54. package/src/forge/_generated/dbSessionContext.ts +1 -1
  55. package/src/forge/_generated/deployManifest.json +2 -2
  56. package/src/forge/_generated/deployManifest.ts +7 -7
  57. package/src/forge/_generated/devManifest.json +2 -2
  58. package/src/forge/_generated/devManifest.ts +18 -3
  59. package/src/forge/_generated/envSchema.json +1 -1
  60. package/src/forge/_generated/envSchema.ts +1 -1
  61. package/src/forge/_generated/frontendGraph.json +1 -1
  62. package/src/forge/_generated/frontendGraph.ts +1 -1
  63. package/src/forge/_generated/importGuards.json +1 -1
  64. package/src/forge/_generated/importGuards.ts +1 -1
  65. package/src/forge/_generated/index.ts +2 -1
  66. package/src/forge/_generated/liveProductionManifest.json +1 -1
  67. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  68. package/src/forge/_generated/liveProtocol.json +1 -1
  69. package/src/forge/_generated/liveProtocol.ts +1 -1
  70. package/src/forge/_generated/liveQueryRegistry.json +2 -2
  71. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  72. package/src/forge/_generated/liveTransportConfig.json +1 -1
  73. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  74. package/src/forge/_generated/makeRegistry.json +2 -2
  75. package/src/forge/_generated/makeRegistry.ts +16 -2
  76. package/src/forge/_generated/makeTemplates.json +2 -2
  77. package/src/forge/_generated/makeTemplates.ts +6 -1
  78. package/src/forge/_generated/mockMap.json +1 -1
  79. package/src/forge/_generated/mockMap.ts +1 -1
  80. package/src/forge/_generated/operationPlaybooks.md +34 -14
  81. package/src/forge/_generated/packageGraph.json +2 -2
  82. package/src/forge/_generated/packageGraph.ts +8808 -4723
  83. package/src/forge/_generated/packageUpgradeRegistry.json +2 -2
  84. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  85. package/src/forge/_generated/permissionMatrix.json +2 -2
  86. package/src/forge/_generated/permissionMatrix.ts +3 -3
  87. package/src/forge/_generated/policyRegistry.json +2 -2
  88. package/src/forge/_generated/policyRegistry.ts +3 -3
  89. package/src/forge/_generated/queryRegistry.json +2 -2
  90. package/src/forge/_generated/queryRegistry.ts +3 -3
  91. package/src/forge/_generated/react.d.ts +1 -1
  92. package/src/forge/_generated/react.ts +1 -1
  93. package/src/forge/_generated/reactManifest.json +2 -2
  94. package/src/forge/_generated/reactManifest.ts +3 -3
  95. package/src/forge/_generated/releaseManifest.json +2 -2
  96. package/src/forge/_generated/releaseManifest.ts +3 -3
  97. package/src/forge/_generated/rlsPolicies.json +1 -1
  98. package/src/forge/_generated/rlsPolicies.sql +1 -1
  99. package/src/forge/_generated/rlsPolicies.ts +1 -1
  100. package/src/forge/_generated/runtimeGraph.json +2 -2
  101. package/src/forge/_generated/runtimeGraph.ts +3 -3
  102. package/src/forge/_generated/runtimeMatrix.json +2 -2
  103. package/src/forge/_generated/runtimeMatrix.ts +8684 -1939
  104. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  105. package/src/forge/_generated/runtimeRules.md +13 -1
  106. package/src/forge/_generated/secretRegistry.json +1 -1
  107. package/src/forge/_generated/secretRegistry.ts +1 -1
  108. package/src/forge/_generated/secretsContext.ts +1 -1
  109. package/src/forge/_generated/serverApi.ts +1 -1
  110. package/src/forge/_generated/sourceMapManifest.json +2 -2
  111. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  112. package/src/forge/_generated/sqlPlan.json +1 -1
  113. package/src/forge/_generated/sqlPlan.ts +1 -1
  114. package/src/forge/_generated/subscriptionManifest.json +2 -2
  115. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  116. package/src/forge/_generated/symbolicationManifest.json +2 -2
  117. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  118. package/src/forge/_generated/telemetryRegistry.json +2 -2
  119. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  120. package/src/forge/_generated/telemetrySinks.json +2 -2
  121. package/src/forge/_generated/telemetrySinks.ts +2 -2
  122. package/src/forge/_generated/tenantScope.json +2 -2
  123. package/src/forge/_generated/tenantScope.ts +3 -3
  124. package/src/forge/_generated/testGraph.json +2 -2
  125. package/src/forge/_generated/testGraph.ts +17 -7
  126. package/src/forge/_generated/testPlanRegistry.json +2 -2
  127. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  128. package/src/forge/_generated/uiRoutes.json +1 -1
  129. package/src/forge/_generated/uiRoutes.ts +1 -1
  130. package/src/forge/_generated/uiScenarios.json +1 -1
  131. package/src/forge/_generated/uiScenarios.ts +1 -1
  132. package/src/forge/_generated/uiTestManifest.json +2 -2
  133. package/src/forge/_generated/uiTestManifest.ts +2 -2
  134. package/src/forge/_generated/workflowRegistry.json +2 -2
  135. package/src/forge/_generated/workflowRegistry.ts +3 -3
  136. package/src/forge/_generated/workflowSubscriptions.json +2 -2
  137. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  138. package/src/forge/cli/ai.ts +186 -1
  139. package/src/forge/cli/commands.ts +5 -0
  140. package/src/forge/cli/parse.ts +30 -3
  141. package/src/forge/compiler/agent-contract/build.ts +281 -8
  142. package/src/forge/compiler/agent-contract/types.ts +41 -0
  143. package/src/forge/compiler/ai-registry/build.ts +62 -1
  144. package/src/forge/compiler/ai-registry/constants.ts +1 -1
  145. package/src/forge/compiler/ai-registry/parse.ts +98 -4
  146. package/src/forge/compiler/app-graph/forge-apis.ts +1 -0
  147. package/src/forge/compiler/dev-manifest/build.ts +3 -0
  148. package/src/forge/compiler/make-registry/build.ts +13 -0
  149. package/src/forge/compiler/orchestrator/plan.ts +11 -0
  150. package/src/forge/compiler/orchestrator/serialize.ts +68 -0
  151. package/src/forge/compiler/types/ai-registry.ts +25 -1
  152. package/src/forge/compiler/types/app-graph.ts +1 -0
  153. package/src/forge/compiler/types/cli.ts +1 -0
  154. package/src/forge/compiler/types/dev-manifest.ts +3 -0
  155. package/src/forge/dev/server.ts +508 -1
  156. package/src/forge/make/index.ts +126 -3
  157. package/src/forge/make/templates.ts +188 -0
  158. package/src/forge/make/types.ts +1 -0
  159. package/src/forge/runtime/ai/context.ts +210 -5
  160. package/src/forge/runtime/ai/types.ts +70 -0
  161. package/src/forge/runtime/context/create-context.ts +30 -6
  162. package/src/forge/server.ts +82 -0
  163. package/src/forge/version.ts +1 -1
@@ -51,10 +51,80 @@ export interface ForgeGenerateStructuredInput<T> {
51
51
  schema: ForgeFlexibleSchema<T>;
52
52
  }
53
53
 
54
+ export type ForgeAiToolRisk = "read" | "write" | "external" | "destructive";
55
+
56
+ export interface ForgeAiToolRuntimeContext {
57
+ secrets: {
58
+ get(name: string): string;
59
+ optional(name: string): string | undefined;
60
+ has(name: string): boolean;
61
+ };
62
+ env: Record<string, string | undefined>;
63
+ telemetry?: {
64
+ traceId?: string;
65
+ capture(name: string, properties?: Record<string, unknown>): Promise<void>;
66
+ };
67
+ auth?: unknown;
68
+ }
69
+
70
+ export interface ForgeAiToolDefinition<TArgs = unknown, TResult = unknown> {
71
+ description: string;
72
+ inputSchema: unknown;
73
+ outputSchema?: unknown;
74
+ strict?: boolean;
75
+ needsApproval?: boolean | ((args: TArgs) => boolean | Promise<boolean>);
76
+ risk?: ForgeAiToolRisk;
77
+ handler: (
78
+ ctx: ForgeAiToolRuntimeContext,
79
+ args: TArgs,
80
+ ) => TResult | Promise<TResult>;
81
+ }
82
+
83
+ export type ForgeAgentStopWhen =
84
+ | { kind: "stepCount"; maxSteps: number }
85
+ | { kind: "toolCall"; toolName: string };
86
+
87
+ export interface ForgeRunAgentInput {
88
+ provider?: ForgeAiProvider;
89
+ model: string;
90
+ prompt: string;
91
+ instructions: string;
92
+ purpose?: string;
93
+ tools?: Record<string, ForgeAiToolDefinition>;
94
+ stopWhen?: ForgeAgentStopWhen;
95
+ maxSteps?: number;
96
+ temperature?: number;
97
+ maxTokens?: number;
98
+ }
99
+
100
+ export interface ForgeRunAgentResult {
101
+ text: string;
102
+ provider: ForgeAiProvider;
103
+ model: string;
104
+ purpose?: string;
105
+ usage: ForgeAiUsage;
106
+ latencyMs: number;
107
+ toolCalls: Array<{
108
+ toolName: string;
109
+ input: unknown;
110
+ }>;
111
+ toolResults: Array<{
112
+ toolName: string;
113
+ output: unknown;
114
+ }>;
115
+ steps: number;
116
+ estimatedCostUsd?: number;
117
+ }
118
+
54
119
  export interface AiContext {
55
120
  generateText(input: ForgeGenerateTextInput): Promise<ForgeGenerateTextResult>;
56
121
  streamText(input: ForgeStreamTextInput): Promise<ForgeStreamTextResult>;
57
122
  generateStructured<T>(input: ForgeGenerateStructuredInput<T>): Promise<T>;
123
+ runAgent(input: ForgeRunAgentInput): Promise<ForgeRunAgentResult>;
124
+ }
125
+
126
+ export interface AgentRuntimeContext {
127
+ run(input: ForgeRunAgentInput): Promise<ForgeRunAgentResult>;
58
128
  }
59
129
 
60
130
  export interface AiTelemetryEnvelope {
@@ -13,7 +13,7 @@ import { loadEnvFiles } from "../secrets/env-loader.ts";
13
13
  import { loadEnvSchema, loadSecretRegistry } from "../secrets/check.ts";
14
14
  import { createRuntimeSecretsBundle } from "../secrets/runtime-bundle.ts";
15
15
  import { createAiContext } from "../ai/context.ts";
16
- import type { AiContext } from "../ai/types.ts";
16
+ import type { AgentRuntimeContext, AiContext } from "../ai/types.ts";
17
17
  import { isMockAiEnabled } from "../ai/state.ts";
18
18
  import { currentReleaseInfo, type RuntimeReleaseInfo } from "../release/runtime.ts";
19
19
 
@@ -26,6 +26,7 @@ export interface ForgeContext {
26
26
  secrets: SecretsContext;
27
27
  config: ConfigContext;
28
28
  ai: AiContext;
29
+ agent: AgentRuntimeContext;
29
30
  release: RuntimeReleaseInfo;
30
31
  }
31
32
 
@@ -67,11 +68,16 @@ function buildSecretsConfigAndAi(
67
68
  runtimeKind: RuntimeContext,
68
69
  store: RuntimeEnvStore,
69
70
  telemetry: TelemetryContext,
70
- options?: { mockAi?: boolean },
71
+ options?: {
72
+ mockAi?: boolean;
73
+ auth?: AuthContext;
74
+ env?: Record<string, string | undefined>;
75
+ },
71
76
  ): {
72
77
  secrets: SecretsContext;
73
78
  config: ConfigContext;
74
79
  ai: AiContext;
80
+ agent: AgentRuntimeContext;
75
81
  env: Record<string, string | undefined>;
76
82
  } {
77
83
  const registry = workspaceRoot ? loadSecretRegistry(workspaceRoot) : null;
@@ -93,12 +99,20 @@ function buildSecretsConfigAndAi(
93
99
  tenantId:
94
100
  undefined,
95
101
  },
102
+ toolContext: {
103
+ env: options?.env ?? store.snapshot(),
104
+ auth: options?.auth,
105
+ },
96
106
  });
107
+ const agent: AgentRuntimeContext = {
108
+ run: (input) => ai.runAgent(input),
109
+ };
97
110
 
98
111
  return {
99
112
  secrets: bundle.secrets,
100
113
  config: bundle.config,
101
114
  ai,
115
+ agent,
102
116
  env: store.snapshot(),
103
117
  };
104
118
  }
@@ -123,12 +137,16 @@ export function createForgeContext(
123
137
  (options?.workspaceRoot
124
138
  ? getRuntimeEnvStore(options.workspaceRoot)
125
139
  : getRuntimeEnvStore());
126
- const { secrets, config, ai, env } = buildSecretsConfigAndAi(
140
+ const { secrets, config, ai, agent, env } = buildSecretsConfigAndAi(
127
141
  options?.workspaceRoot,
128
142
  runtimeKind,
129
143
  store,
130
144
  telemetry,
131
- { mockAi: options?.mockAi },
145
+ {
146
+ mockAi: options?.mockAi,
147
+ auth,
148
+ env: options?.env,
149
+ },
132
150
  );
133
151
 
134
152
  return {
@@ -139,6 +157,7 @@ export function createForgeContext(
139
157
  secrets,
140
158
  config,
141
159
  ai,
160
+ agent,
142
161
  release: currentReleaseInfo(),
143
162
  emit: async (eventType, payload) => {
144
163
  const enriched =
@@ -178,12 +197,16 @@ export function createActionContext(
178
197
  (options?.workspaceRoot
179
198
  ? getRuntimeEnvStore(options.workspaceRoot)
180
199
  : getRuntimeEnvStore());
181
- const { secrets, config, ai, env } = buildSecretsConfigAndAi(
200
+ const { secrets, config, ai, agent, env } = buildSecretsConfigAndAi(
182
201
  options?.workspaceRoot,
183
202
  runtimeKind,
184
203
  store,
185
204
  telemetry,
186
- { mockAi: options?.mockAi },
205
+ {
206
+ mockAi: options?.mockAi,
207
+ auth,
208
+ env: options?.env,
209
+ },
187
210
  );
188
211
 
189
212
  return {
@@ -194,6 +217,7 @@ export function createActionContext(
194
217
  secrets,
195
218
  config,
196
219
  ai,
220
+ agent,
197
221
  release: currentReleaseInfo(),
198
222
  emit: async () => {
199
223
  /* actions invoked by outbox worker do not emit */
@@ -11,11 +11,50 @@ export interface ForgeTelemetry {
11
11
  capture(name: string, payload?: Record<string, unknown>): Promise<void> | void;
12
12
  }
13
13
 
14
+ export type ForgeAiProvider = "openai" | "anthropic" | "gateway";
15
+
16
+ export interface ForgeAiUsage {
17
+ promptTokens: number;
18
+ completionTokens: number;
19
+ totalTokens: number;
20
+ }
21
+
22
+ export interface ForgeRunAgentInput {
23
+ provider?: ForgeAiProvider;
24
+ model: string;
25
+ prompt: string;
26
+ instructions: string;
27
+ purpose?: string;
28
+ tools?: Record<string, ForgeAiToolDefinition>;
29
+ stopWhen?: ForgeAgentStopWhen;
30
+ maxSteps?: number;
31
+ temperature?: number;
32
+ maxTokens?: number;
33
+ }
34
+
35
+ export interface ForgeRunAgentResult {
36
+ text: string;
37
+ provider: ForgeAiProvider;
38
+ model: string;
39
+ purpose?: string;
40
+ usage: ForgeAiUsage;
41
+ latencyMs: number;
42
+ toolCalls: Array<{ toolName: string; input: unknown }>;
43
+ toolResults: Array<{ toolName: string; output: unknown }>;
44
+ steps: number;
45
+ estimatedCostUsd?: number;
46
+ }
47
+
48
+ export interface ForgeAgentRuntime {
49
+ run(input: ForgeRunAgentInput): Promise<ForgeRunAgentResult>;
50
+ }
51
+
14
52
  export interface ForgeContext {
15
53
  db: ForgeRecord;
16
54
  emit(event: string, payload?: Record<string, unknown>): Promise<void> | void;
17
55
  telemetry: ForgeTelemetry;
18
56
  secrets: ForgeRecord;
57
+ agent?: ForgeAgentRuntime;
19
58
  auth?: {
20
59
  userId?: string;
21
60
  tenantId?: string;
@@ -44,6 +83,41 @@ export type ForgeActionDefinition<TEvent = unknown, TResult = unknown> = Record<
44
83
  handler: (ctx: ForgeContext, event: TEvent) => TResult | Promise<TResult>;
45
84
  };
46
85
 
86
+ export type ForgeAiToolRisk = "read" | "write" | "external" | "destructive";
87
+
88
+ export interface ForgeAiToolRuntimeContext {
89
+ secrets: ForgeRecord;
90
+ env: Record<string, string | undefined>;
91
+ telemetry: ForgeTelemetry;
92
+ auth?: ForgeContext["auth"];
93
+ }
94
+
95
+ export type ForgeAiToolDefinition<TArgs = unknown, TResult = unknown> = Record<string, unknown> & {
96
+ description: string;
97
+ inputSchema: unknown;
98
+ outputSchema?: unknown;
99
+ strict?: boolean;
100
+ needsApproval?: boolean | ((args: TArgs) => boolean | Promise<boolean>);
101
+ risk?: ForgeAiToolRisk;
102
+ handler: (
103
+ ctx: ForgeAiToolRuntimeContext,
104
+ args: TArgs,
105
+ ) => TResult | Promise<TResult>;
106
+ };
107
+
108
+ export type ForgeAgentStopWhen =
109
+ | { kind: "stepCount"; maxSteps: number }
110
+ | { kind: "toolCall"; toolName: string };
111
+
112
+ export type ForgeAgentDefinition = Record<string, unknown> & {
113
+ provider?: "openai" | "anthropic" | "gateway";
114
+ model: string;
115
+ instructions: string;
116
+ tools?: Record<string, ForgeAiToolDefinition> | string[];
117
+ stopWhen?: ForgeAgentStopWhen;
118
+ maxSteps?: number;
119
+ };
120
+
47
121
  export function defineTable<T extends Record<string, unknown>>(definition: T): T {
48
122
  return definition;
49
123
  }
@@ -80,6 +154,14 @@ export function action<T extends ForgeActionDefinition>(definition: T): ForgeDef
80
154
  return definition;
81
155
  }
82
156
 
157
+ export function aiTool<T extends ForgeAiToolDefinition>(definition: T): ForgeDefinition<T> {
158
+ return definition;
159
+ }
160
+
161
+ export function agent<T extends ForgeAgentDefinition>(definition: T): ForgeDefinition<T> {
162
+ return definition;
163
+ }
164
+
83
165
  export function event(name: string): { kind: "event"; name: string } {
84
166
  return { kind: "event", name };
85
167
  }
@@ -1,3 +1,3 @@
1
- export const FORGEOS_VERSION = "0.1.0-alpha.2";
1
+ export const FORGEOS_VERSION = "0.1.0-alpha.3";
2
2
  export const GENERATOR_VERSION = FORGEOS_VERSION;
3
3
  export const CLI_VERSION = FORGEOS_VERSION;