forgeos 0.1.0-alpha.11 → 0.1.0-alpha.13

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 (150) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +22 -1
  3. package/README.md +7 -0
  4. package/docs/changelog.md +1 -1
  5. package/package.json +1 -1
  6. package/src/forge/_generated/actionSubscriptions.json +1 -1
  7. package/src/forge/_generated/actionSubscriptions.ts +3 -3
  8. package/src/forge/_generated/agentAdapterManifest.json +1 -1
  9. package/src/forge/_generated/agentAdapterManifest.ts +3 -3
  10. package/src/forge/_generated/agentContract.json +1 -1
  11. package/src/forge/_generated/agentContract.ts +2 -2
  12. package/src/forge/_generated/agentQuickstart.md +1 -1
  13. package/src/forge/_generated/agentTools.json +1 -1
  14. package/src/forge/_generated/agentTools.md +1 -1
  15. package/src/forge/_generated/agentTools.ts +2 -2
  16. package/src/forge/_generated/aiContext.ts +1 -1
  17. package/src/forge/_generated/aiModels.ts +1 -1
  18. package/src/forge/_generated/aiProviders.ts +1 -1
  19. package/src/forge/_generated/aiRegistry.json +1 -1
  20. package/src/forge/_generated/aiRegistry.ts +3 -3
  21. package/src/forge/_generated/api.json +1 -1
  22. package/src/forge/_generated/api.ts +1 -1
  23. package/src/forge/_generated/appGraph.json +1 -1
  24. package/src/forge/_generated/appGraph.ts +626 -71
  25. package/src/forge/_generated/appMap.md +1 -1
  26. package/src/forge/_generated/artifactManifest.json +1 -1
  27. package/src/forge/_generated/artifactManifest.ts +2 -2
  28. package/src/forge/_generated/authClaims.ts +1 -1
  29. package/src/forge/_generated/authConfig.ts +1 -1
  30. package/src/forge/_generated/authContext.ts +1 -1
  31. package/src/forge/_generated/authRegistry.ts +1 -1
  32. package/src/forge/_generated/buildInfo.json +1 -1
  33. package/src/forge/_generated/buildInfo.ts +4 -4
  34. package/src/forge/_generated/capabilityMap.json +1 -1
  35. package/src/forge/_generated/capabilityMap.md +1 -1
  36. package/src/forge/_generated/capabilityMap.ts +2 -2
  37. package/src/forge/_generated/client.ts +1 -1
  38. package/src/forge/_generated/clientApi.ts +1 -1
  39. package/src/forge/_generated/clientManifest.json +1 -1
  40. package/src/forge/_generated/clientManifest.ts +3 -3
  41. package/src/forge/_generated/clientTypes.ts +1 -1
  42. package/src/forge/_generated/configRegistry.ts +1 -1
  43. package/src/forge/_generated/dataGraph.json +1 -1
  44. package/src/forge/_generated/dataGraph.ts +3 -3
  45. package/src/forge/_generated/db.ts +1 -1
  46. package/src/forge/_generated/dbSecurityManifest.ts +1 -1
  47. package/src/forge/_generated/dbSessionContext.ts +1 -1
  48. package/src/forge/_generated/deployManifest.json +1 -1
  49. package/src/forge/_generated/deployManifest.ts +7 -7
  50. package/src/forge/_generated/devManifest.json +1 -1
  51. package/src/forge/_generated/devManifest.ts +3 -3
  52. package/src/forge/_generated/envSchema.ts +1 -1
  53. package/src/forge/_generated/externalServices.ts +1 -1
  54. package/src/forge/_generated/frontendGraph.ts +1 -1
  55. package/src/forge/_generated/importGuards.ts +1 -1
  56. package/src/forge/_generated/index.ts +1 -1
  57. package/src/forge/_generated/liveProductionManifest.ts +1 -1
  58. package/src/forge/_generated/liveProtocol.ts +1 -1
  59. package/src/forge/_generated/liveQueryRegistry.json +1 -1
  60. package/src/forge/_generated/liveQueryRegistry.ts +3 -3
  61. package/src/forge/_generated/liveTransportConfig.ts +1 -1
  62. package/src/forge/_generated/makeRegistry.json +1 -1
  63. package/src/forge/_generated/makeRegistry.ts +2 -2
  64. package/src/forge/_generated/makeTemplates.ts +1 -1
  65. package/src/forge/_generated/mockMap.ts +1 -1
  66. package/src/forge/_generated/operationPlaybooks.md +1 -1
  67. package/src/forge/_generated/packageGraph.json +1 -1
  68. package/src/forge/_generated/packageGraph.ts +2 -2
  69. package/src/forge/_generated/packageUpgradeRegistry.json +1 -1
  70. package/src/forge/_generated/packageUpgradeRegistry.ts +2 -2
  71. package/src/forge/_generated/permissionMatrix.json +1 -1
  72. package/src/forge/_generated/permissionMatrix.ts +3 -3
  73. package/src/forge/_generated/policyRegistry.json +1 -1
  74. package/src/forge/_generated/policyRegistry.ts +3 -3
  75. package/src/forge/_generated/queryRegistry.json +1 -1
  76. package/src/forge/_generated/queryRegistry.ts +3 -3
  77. package/src/forge/_generated/react.d.ts +1 -1
  78. package/src/forge/_generated/react.ts +1 -1
  79. package/src/forge/_generated/reactManifest.json +1 -1
  80. package/src/forge/_generated/reactManifest.ts +3 -3
  81. package/src/forge/_generated/releaseManifest.json +1 -1
  82. package/src/forge/_generated/releaseManifest.ts +3 -3
  83. package/src/forge/_generated/rlsPolicies.sql +1 -1
  84. package/src/forge/_generated/rlsPolicies.ts +1 -1
  85. package/src/forge/_generated/runtimeGraph.json +1 -1
  86. package/src/forge/_generated/runtimeGraph.ts +3 -3
  87. package/src/forge/_generated/runtimeMatrix.ts +1 -1
  88. package/src/forge/_generated/runtimeRegistry.ts +1 -1
  89. package/src/forge/_generated/runtimeRules.md +1 -1
  90. package/src/forge/_generated/secretRegistry.ts +1 -1
  91. package/src/forge/_generated/secretsContext.ts +1 -1
  92. package/src/forge/_generated/serverApi.ts +1 -1
  93. package/src/forge/_generated/sourceMapManifest.json +1 -1
  94. package/src/forge/_generated/sourceMapManifest.ts +2 -2
  95. package/src/forge/_generated/sqlPlan.ts +1 -1
  96. package/src/forge/_generated/subscriptionManifest.json +1 -1
  97. package/src/forge/_generated/subscriptionManifest.ts +3 -3
  98. package/src/forge/_generated/symbolicationManifest.json +1 -1
  99. package/src/forge/_generated/symbolicationManifest.ts +2 -2
  100. package/src/forge/_generated/telemetryRegistry.json +1 -1
  101. package/src/forge/_generated/telemetryRegistry.ts +3 -3
  102. package/src/forge/_generated/telemetrySinks.json +1 -1
  103. package/src/forge/_generated/telemetrySinks.ts +2 -2
  104. package/src/forge/_generated/tenantScope.json +1 -1
  105. package/src/forge/_generated/tenantScope.ts +3 -3
  106. package/src/forge/_generated/testGraph.json +1 -1
  107. package/src/forge/_generated/testGraph.ts +75 -3
  108. package/src/forge/_generated/testPlanRegistry.json +1 -1
  109. package/src/forge/_generated/testPlanRegistry.ts +2 -2
  110. package/src/forge/_generated/uiRoutes.ts +1 -1
  111. package/src/forge/_generated/uiScenarios.ts +1 -1
  112. package/src/forge/_generated/uiTestManifest.json +1 -1
  113. package/src/forge/_generated/uiTestManifest.ts +2 -2
  114. package/src/forge/_generated/workflowRegistry.json +1 -1
  115. package/src/forge/_generated/workflowRegistry.ts +3 -3
  116. package/src/forge/_generated/workflowSubscriptions.json +1 -1
  117. package/src/forge/_generated/workflowSubscriptions.ts +3 -3
  118. package/src/forge/agent-adapters/index.ts +36 -2
  119. package/src/forge/agent-adapters/types.ts +10 -1
  120. package/src/forge/agent-memory/bridge.ts +228 -0
  121. package/src/forge/agent-memory/context-pack.ts +104 -0
  122. package/src/forge/agent-memory/mcp.ts +224 -0
  123. package/src/forge/agent-memory/normalize.ts +249 -0
  124. package/src/forge/agent-memory/redaction.ts +94 -0
  125. package/src/forge/agent-memory/sources/claude-code.ts +51 -0
  126. package/src/forge/agent-memory/sources/codex.ts +58 -0
  127. package/src/forge/agent-memory/sources/cursor.ts +35 -0
  128. package/src/forge/agent-memory/types.ts +112 -0
  129. package/src/forge/cli/build.ts +19 -3
  130. package/src/forge/cli/commands.ts +56 -0
  131. package/src/forge/cli/dev.ts +17 -8
  132. package/src/forge/cli/main.ts +12 -1
  133. package/src/forge/cli/new.ts +1 -0
  134. package/src/forge/cli/parse.ts +159 -2
  135. package/src/forge/delta/classifier.ts +52 -0
  136. package/src/forge/delta/explain.ts +126 -0
  137. package/src/forge/delta/git-observer.ts +43 -0
  138. package/src/forge/delta/ids.ts +44 -0
  139. package/src/forge/delta/index.ts +6 -0
  140. package/src/forge/delta/recorder.ts +350 -0
  141. package/src/forge/delta/redaction.ts +50 -0
  142. package/src/forge/delta/schema.ts +238 -0
  143. package/src/forge/delta/session.ts +141 -0
  144. package/src/forge/delta/status.ts +68 -0
  145. package/src/forge/delta/store.ts +2573 -0
  146. package/src/forge/delta/timeline.ts +104 -0
  147. package/src/forge/dev/server.ts +39 -0
  148. package/src/forge/dev/types.ts +2 -0
  149. package/src/forge/dev/watch.ts +17 -7
  150. package/src/forge/version.ts +1 -1
@@ -0,0 +1,104 @@
1
+ import { DeltaStore, type DeltaSemanticTimelineResult } from "./store.ts";
2
+
3
+ export interface DeltaTimelineResult {
4
+ ok: true;
5
+ session?: string;
6
+ target?: string;
7
+ rebuilt?: boolean;
8
+ timeline: DeltaSemanticTimelineResult;
9
+ exitCode: 0;
10
+ }
11
+
12
+ export async function runDeltaTimeline(input: {
13
+ workspaceRoot: string;
14
+ target?: string;
15
+ kind?: string;
16
+ session?: string;
17
+ limit?: number;
18
+ rebuild?: boolean;
19
+ }): Promise<DeltaTimelineResult> {
20
+ const store = await DeltaStore.open(input.workspaceRoot);
21
+ try {
22
+ if (input.rebuild) {
23
+ await store.rebuildSemanticTimeline();
24
+ }
25
+ return {
26
+ ok: true,
27
+ session: input.session,
28
+ target: input.target,
29
+ rebuilt: input.rebuild || undefined,
30
+ timeline: await store.semanticTimeline({ target: input.target, kind: input.kind, workSessionId: input.session, limit: input.limit }),
31
+ exitCode: 0,
32
+ };
33
+ } finally {
34
+ await store.close();
35
+ }
36
+ }
37
+
38
+ export function formatDeltaTimelineHuman(result: DeltaTimelineResult): string {
39
+ const timeline = result.timeline;
40
+ if (timeline.events.length === 0) {
41
+ return "Timeline\n\nno semantic timeline events recorded\n";
42
+ }
43
+ const title = timeline.entity
44
+ ? `Timeline - ${timeline.entity.kind}:${timeline.entity.name}`
45
+ : result.session
46
+ ? `Timeline (${result.session})`
47
+ : "Timeline";
48
+ const lines = [title, ""];
49
+ const grouped = new Map<string, typeof timeline.events>();
50
+ for (const event of timeline.events) {
51
+ const key = event.kind;
52
+ grouped.set(key, [...(grouped.get(key) ?? []), event]);
53
+ }
54
+ for (const [kind, events] of grouped) {
55
+ lines.push(formatTimelineSectionTitle(kind));
56
+ for (const event of events) {
57
+ const time = event.timestamp.slice(11, 16);
58
+ const confidence = event.confidence < 0.8 ? ` likely (${event.confidence.toFixed(2)})` : "";
59
+ lines.push(` ${time} ${event.title}${confidence}`);
60
+ const details = event.entities
61
+ .filter((entity) => entity.role !== "primary")
62
+ .slice(0, 4)
63
+ .map((entity) => `${entity.kind}:${entity.name}`);
64
+ if (details.length > 0) {
65
+ lines.push(` ${details.join(", ")}`);
66
+ }
67
+ }
68
+ lines.push("");
69
+ }
70
+ if (Object.keys(timeline.currentState).length > 0) {
71
+ lines.push("Current state");
72
+ for (const [key, value] of Object.entries(timeline.currentState)) {
73
+ if (value !== undefined) {
74
+ lines.push(` ${key}: ${Array.isArray(value) ? value.join(", ") : String(value)}`);
75
+ }
76
+ }
77
+ lines.push("");
78
+ }
79
+ if (timeline.causalEdges.length > 0) {
80
+ lines.push("Causality");
81
+ for (const edge of timeline.causalEdges.slice(0, 8)) {
82
+ lines.push(` ${edge.kind}: ${edge.from} -> ${edge.to} (${edge.confidence.toFixed(2)})`);
83
+ }
84
+ lines.push("");
85
+ }
86
+ if (timeline.openQuestions.length > 0) {
87
+ lines.push("Open questions");
88
+ for (const question of timeline.openQuestions) {
89
+ lines.push(` ${question}`);
90
+ }
91
+ }
92
+ return `${lines.join("\n")}\n`;
93
+ }
94
+
95
+ export function formatDeltaTimelineJson(result: DeltaTimelineResult): string {
96
+ return `${JSON.stringify(result, null, 2)}\n`;
97
+ }
98
+
99
+ function formatTimelineSectionTitle(kind: string): string {
100
+ return kind
101
+ .split(".")
102
+ .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
103
+ .join(" ");
104
+ }
@@ -582,6 +582,7 @@ async function buildAiSdkTools(input: {
582
582
  telemetry: ReturnType<typeof createTelemetryContext> | ReturnType<typeof createNoopTelemetryContext>;
583
583
  env: Record<string, string | undefined>;
584
584
  auth: Awaited<ReturnType<typeof authenticateHeaders>>;
585
+ deltaRecorder?: DevServerOptions["deltaRecorder"];
585
586
  }): Promise<Record<string, unknown>> {
586
587
  const { tool } = await import("ai");
587
588
  return Object.fromEntries(
@@ -632,6 +633,13 @@ async function buildAiSdkTools(input: {
632
633
  latencyMs: Date.now() - startedAt,
633
634
  status: "completed",
634
635
  });
636
+ await input.deltaRecorder?.recordAgentTool({
637
+ toolName: name,
638
+ risk: definition.risk ?? "external",
639
+ status: "completed",
640
+ traceId: input.traceId,
641
+ durationMs: Date.now() - startedAt,
642
+ });
635
643
  return output;
636
644
  } catch (error) {
637
645
  await input.telemetry.capture("forge.ai.tool.failed", {
@@ -644,6 +652,13 @@ async function buildAiSdkTools(input: {
644
652
  status: "failed",
645
653
  error: error instanceof Error ? error.message : String(error),
646
654
  });
655
+ await input.deltaRecorder?.recordAgentTool({
656
+ toolName: name,
657
+ risk: definition.risk ?? "external",
658
+ status: "failed",
659
+ traceId: input.traceId,
660
+ durationMs: Date.now() - startedAt,
661
+ });
647
662
  throw error;
648
663
  }
649
664
  },
@@ -671,6 +686,7 @@ export async function startDevServer(
671
686
  options: DevServerOptions,
672
687
  ): Promise<DevServerHandle> {
673
688
  const workspaceRoot = options.workspaceRoot.replace(/\\/g, "/");
689
+ const deltaRecorder = options.deltaRecorder;
674
690
  const authConfig = loadAuthConfigFromEnv(workspaceRoot, {
675
691
  defaultMode: "dev-headers",
676
692
  });
@@ -1344,6 +1360,7 @@ export async function startDevServer(
1344
1360
  telemetry,
1345
1361
  env: envStore.snapshot(),
1346
1362
  auth,
1363
+ deltaRecorder,
1347
1364
  });
1348
1365
  const { ToolLoopAgent, createAgentUIStreamResponse, hasToolCall, stepCountIs } = await import("ai");
1349
1366
  const stopWhen =
@@ -1714,6 +1731,14 @@ export async function startDevServer(
1714
1731
  const policyDenied = result.diagnostics.some(
1715
1732
  (diagnostic) => diagnostic.code === FORGE_POLICY_DENIED,
1716
1733
  );
1734
+ await deltaRecorder?.recordRuntimeCall({
1735
+ entryName: `${externalInvoke.serviceName}.${externalInvoke.entryName}`,
1736
+ entryKind: externalInvoke.kind,
1737
+ service: externalInvoke.serviceName,
1738
+ result: policyDenied ? "denied" : result.ok ? "success" : "failed",
1739
+ diagnostics: result.diagnostics,
1740
+ traceId: result.traceId,
1741
+ });
1717
1742
  return jsonResponse(
1718
1743
  {
1719
1744
  ok: result.ok,
@@ -1775,6 +1800,13 @@ export async function startDevServer(
1775
1800
  const policyDenied = result.diagnostics.some(
1776
1801
  (diagnostic) => diagnostic.code === FORGE_POLICY_DENIED,
1777
1802
  );
1803
+ await deltaRecorder?.recordRuntimeCall({
1804
+ entryName: queryName,
1805
+ entryKind: "query",
1806
+ result: policyDenied ? "denied" : result.ok ? "success" : "failed",
1807
+ diagnostics: result.diagnostics,
1808
+ traceId: result.traceId,
1809
+ });
1778
1810
 
1779
1811
  return jsonResponse(
1780
1812
  {
@@ -1845,6 +1877,13 @@ export async function startDevServer(
1845
1877
  const policyDenied = result.diagnostics.some(
1846
1878
  (diagnostic) => diagnostic.code === FORGE_POLICY_DENIED,
1847
1879
  );
1880
+ await deltaRecorder?.recordRuntimeCall({
1881
+ entryName,
1882
+ entryKind: entry.kind,
1883
+ result: policyDenied ? "denied" : result.ok ? "success" : "failed",
1884
+ diagnostics: result.diagnostics,
1885
+ traceId: result.traceId,
1886
+ });
1848
1887
 
1849
1888
  if (policyDenied) {
1850
1889
  const denied = result.diagnostics.find(
@@ -1,5 +1,6 @@
1
1
  import type { DevRoute } from "../compiler/types/dev-manifest.ts";
2
2
  import type { DbAdapter } from "../runtime/db/adapter.ts";
3
+ import type { AmbientDeltaRecorder } from "../delta/recorder.ts";
3
4
 
4
5
  export type DevDbMode = "memory" | "pglite" | "postgres" | "none";
5
6
 
@@ -18,6 +19,7 @@ export interface DevServerOptions {
18
19
  mode?: "dev" | "serve";
19
20
  allowDevAuth?: boolean;
20
21
  webUrl?: string;
22
+ deltaRecorder?: AmbientDeltaRecorder;
21
23
  }
22
24
 
23
25
  export interface DevServerDbState {
@@ -21,28 +21,38 @@ export function shouldSkipWatchPath(absolutePath: string): boolean {
21
21
 
22
22
  export function createDebouncedCallback(
23
23
  debounceMs: number,
24
- callback: (changedCount: number) => void | Promise<void>,
25
- ): (increment?: number) => void {
24
+ callback: (changedCount: number, changedPaths: string[]) => void | Promise<void>,
25
+ ): (incrementOrPath?: number | string) => void {
26
26
  let pendingChanges = 0;
27
+ const pendingPaths = new Set<string>();
27
28
  let timer: ReturnType<typeof setTimeout> | null = null;
28
29
 
29
- return (increment = 1) => {
30
- pendingChanges += increment;
30
+ return (incrementOrPath) => {
31
+ if (typeof incrementOrPath === "number") {
32
+ pendingChanges += incrementOrPath;
33
+ } else {
34
+ pendingChanges += 1;
35
+ }
36
+ if (typeof incrementOrPath === "string") {
37
+ pendingPaths.add(incrementOrPath);
38
+ }
31
39
  if (timer !== null) {
32
40
  clearTimeout(timer);
33
41
  }
34
42
  timer = setTimeout(async () => {
35
43
  const count = pendingChanges;
44
+ const paths = [...pendingPaths].sort();
36
45
  pendingChanges = 0;
46
+ pendingPaths.clear();
37
47
  timer = null;
38
- await callback(count);
48
+ await callback(count, paths);
39
49
  }, debounceMs);
40
50
  };
41
51
  }
42
52
 
43
53
  export function startDevWatch(
44
54
  workspaceRoot: string,
45
- onRegenerate: (changedCount: number) => void | Promise<void>,
55
+ onRegenerate: (changedCount: number, changedPaths: string[]) => void | Promise<void>,
46
56
  ): DevWatchHandle {
47
57
  const roots = getSourceRoots(workspaceRoot);
48
58
  const watchers: FSWatcher[] = [];
@@ -71,7 +81,7 @@ export function startDevWatch(
71
81
  return;
72
82
  }
73
83
 
74
- debounced();
84
+ debounced(relativePath);
75
85
  },
76
86
  );
77
87
 
@@ -1,3 +1,3 @@
1
- export const FORGEOS_VERSION = "0.1.0-alpha.11";
1
+ export const FORGEOS_VERSION = "0.1.0-alpha.13";
2
2
  export const GENERATOR_VERSION = FORGEOS_VERSION;
3
3
  export const CLI_VERSION = FORGEOS_VERSION;