@limo-labs/deity 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +519 -0
- package/dist/src/component.d.ts +19 -0
- package/dist/src/component.d.ts.map +1 -0
- package/dist/src/component.js +2 -0
- package/dist/src/component.js.map +1 -0
- package/dist/src/context/context-scope.d.ts +24 -0
- package/dist/src/context/context-scope.d.ts.map +1 -0
- package/dist/src/context/context-scope.js +19 -0
- package/dist/src/context/context-scope.js.map +1 -0
- package/dist/src/context/memory-view.d.ts +62 -0
- package/dist/src/context/memory-view.d.ts.map +1 -0
- package/dist/src/context/memory-view.js +104 -0
- package/dist/src/context/memory-view.js.map +1 -0
- package/dist/src/context/scoped-context.d.ts +51 -0
- package/dist/src/context/scoped-context.d.ts.map +1 -0
- package/dist/src/context/scoped-context.js +74 -0
- package/dist/src/context/scoped-context.js.map +1 -0
- package/dist/src/context/scoped-execution-context.d.ts +55 -0
- package/dist/src/context/scoped-execution-context.d.ts.map +1 -0
- package/dist/src/context/scoped-execution-context.js +78 -0
- package/dist/src/context/scoped-execution-context.js.map +1 -0
- package/dist/src/conversation/conversation-manager.d.ts +272 -0
- package/dist/src/conversation/conversation-manager.d.ts.map +1 -0
- package/dist/src/conversation/conversation-manager.js +11 -0
- package/dist/src/conversation/conversation-manager.js.map +1 -0
- package/dist/src/conversation/conversation-pruner.d.ts +190 -0
- package/dist/src/conversation/conversation-pruner.d.ts.map +1 -0
- package/dist/src/conversation/conversation-pruner.js +274 -0
- package/dist/src/conversation/conversation-pruner.js.map +1 -0
- package/dist/src/conversation/conversation-tree.d.ts +185 -0
- package/dist/src/conversation/conversation-tree.d.ts.map +1 -0
- package/dist/src/conversation/conversation-tree.js +288 -0
- package/dist/src/conversation/conversation-tree.js.map +1 -0
- package/dist/src/conversation/file-conversation-store.d.ts +93 -0
- package/dist/src/conversation/file-conversation-store.d.ts.map +1 -0
- package/dist/src/conversation/file-conversation-store.js +284 -0
- package/dist/src/conversation/file-conversation-store.js.map +1 -0
- package/dist/src/conversation/in-memory-conversation-store.d.ts +36 -0
- package/dist/src/conversation/in-memory-conversation-store.d.ts.map +1 -0
- package/dist/src/conversation/in-memory-conversation-store.js +146 -0
- package/dist/src/conversation/in-memory-conversation-store.js.map +1 -0
- package/dist/src/copilot-adapter.d.ts +33 -0
- package/dist/src/copilot-adapter.d.ts.map +1 -0
- package/dist/src/copilot-adapter.js +119 -0
- package/dist/src/copilot-adapter.js.map +1 -0
- package/dist/src/file-trace-enhanced.d.ts +123 -0
- package/dist/src/file-trace-enhanced.d.ts.map +1 -0
- package/dist/src/file-trace-enhanced.js +177 -0
- package/dist/src/file-trace-enhanced.js.map +1 -0
- package/dist/src/file-trace.d.ts +24 -0
- package/dist/src/file-trace.d.ts.map +1 -0
- package/dist/src/file-trace.js +60 -0
- package/dist/src/file-trace.js.map +1 -0
- package/dist/src/index.d.ts +63 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +40 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/json-store.d.ts +27 -0
- package/dist/src/json-store.d.ts.map +1 -0
- package/dist/src/json-store.js +93 -0
- package/dist/src/json-store.js.map +1 -0
- package/dist/src/llm.d.ts +35 -0
- package/dist/src/llm.d.ts.map +1 -0
- package/dist/src/llm.js +2 -0
- package/dist/src/llm.js.map +1 -0
- package/dist/src/memory/cold-storage.d.ts +60 -0
- package/dist/src/memory/cold-storage.d.ts.map +1 -0
- package/dist/src/memory/cold-storage.js +132 -0
- package/dist/src/memory/cold-storage.js.map +1 -0
- package/dist/src/memory/compression.d.ts +161 -0
- package/dist/src/memory/compression.d.ts.map +1 -0
- package/dist/src/memory/compression.js +193 -0
- package/dist/src/memory/compression.js.map +1 -0
- package/dist/src/memory/hot-memory.d.ts +69 -0
- package/dist/src/memory/hot-memory.d.ts.map +1 -0
- package/dist/src/memory/hot-memory.js +116 -0
- package/dist/src/memory/hot-memory.js.map +1 -0
- package/dist/src/memory/memory-budget.d.ts +162 -0
- package/dist/src/memory/memory-budget.d.ts.map +1 -0
- package/dist/src/memory/memory-budget.js +241 -0
- package/dist/src/memory/memory-budget.js.map +1 -0
- package/dist/src/memory/memory-config.d.ts +419 -0
- package/dist/src/memory/memory-config.d.ts.map +1 -0
- package/dist/src/memory/memory-config.js +297 -0
- package/dist/src/memory/memory-config.js.map +1 -0
- package/dist/src/memory/prefetcher.d.ts +137 -0
- package/dist/src/memory/prefetcher.d.ts.map +1 -0
- package/dist/src/memory/prefetcher.js +186 -0
- package/dist/src/memory/prefetcher.js.map +1 -0
- package/dist/src/memory/tiered-memory.d.ts +116 -0
- package/dist/src/memory/tiered-memory.d.ts.map +1 -0
- package/dist/src/memory/tiered-memory.js +215 -0
- package/dist/src/memory/tiered-memory.js.map +1 -0
- package/dist/src/memory/warm-storage.d.ts +74 -0
- package/dist/src/memory/warm-storage.d.ts.map +1 -0
- package/dist/src/memory/warm-storage.js +207 -0
- package/dist/src/memory/warm-storage.js.map +1 -0
- package/dist/src/openai-adapter.d.ts +20 -0
- package/dist/src/openai-adapter.d.ts.map +1 -0
- package/dist/src/openai-adapter.js +73 -0
- package/dist/src/openai-adapter.js.map +1 -0
- package/dist/src/parser.d.ts +27 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +76 -0
- package/dist/src/parser.js.map +1 -0
- package/dist/src/runtime.d.ts +172 -0
- package/dist/src/runtime.d.ts.map +1 -0
- package/dist/src/runtime.js +436 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/schema-utils.d.ts +7 -0
- package/dist/src/schema-utils.d.ts.map +1 -0
- package/dist/src/schema-utils.js +71 -0
- package/dist/src/schema-utils.js.map +1 -0
- package/dist/src/stage.d.ts +139 -0
- package/dist/src/stage.d.ts.map +1 -0
- package/dist/src/stage.js +2 -0
- package/dist/src/stage.js.map +1 -0
- package/dist/src/store.d.ts +51 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/store.js +2 -0
- package/dist/src/store.js.map +1 -0
- package/dist/src/tool.d.ts +12 -0
- package/dist/src/tool.d.ts.map +1 -0
- package/dist/src/tool.js +2 -0
- package/dist/src/tool.js.map +1 -0
- package/dist/src/trace.d.ts +60 -0
- package/dist/src/trace.d.ts.map +1 -0
- package/dist/src/trace.js +2 -0
- package/dist/src/trace.js.map +1 -0
- package/dist/src/validator.d.ts +17 -0
- package/dist/src/validator.d.ts.map +1 -0
- package/dist/src/validator.js +21 -0
- package/dist/src/validator.js.map +1 -0
- package/dist/src/workflow.d.ts +192 -0
- package/dist/src/workflow.d.ts.map +1 -0
- package/dist/src/workflow.js +50 -0
- package/dist/src/workflow.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory implementation of ConversationManager for testing and simple use cases.
|
|
3
|
+
*
|
|
4
|
+
* @module conversation/in-memory-conversation-store
|
|
5
|
+
* @since 2.0.0
|
|
6
|
+
*/
|
|
7
|
+
import type { ConversationManager, ConversationMessage, ConversationQuery, ConversationSnapshot, ConversationStats, MessageMetadata, PruneStrategy } from "./conversation-manager.js";
|
|
8
|
+
import type { Message } from "../component.js";
|
|
9
|
+
/**
|
|
10
|
+
* Simple in-memory conversation storage.
|
|
11
|
+
*
|
|
12
|
+
* This implementation keeps all messages in memory without persistence.
|
|
13
|
+
* Useful for testing, temporary conversations, or when persistence isn't needed.
|
|
14
|
+
*
|
|
15
|
+
* @since 2.0.0
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* const store = new InMemoryConversationStore();
|
|
20
|
+
* await store.addMessage({ role: "user", content: "Hello!" });
|
|
21
|
+
* const history = await store.getHistory();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class InMemoryConversationStore implements ConversationManager {
|
|
25
|
+
private messages;
|
|
26
|
+
addMessage(message: Message, metadata?: Partial<Omit<MessageMetadata, "id" | "timestamp">>): Promise<void>;
|
|
27
|
+
getHistory(): Promise<ConversationMessage[]>;
|
|
28
|
+
getRecent(count: number): Promise<ConversationMessage[]>;
|
|
29
|
+
search(query: ConversationQuery): Promise<ConversationMessage[]>;
|
|
30
|
+
prune(strategy: PruneStrategy): Promise<number>;
|
|
31
|
+
clear(): Promise<void>;
|
|
32
|
+
getStats(): Promise<ConversationStats>;
|
|
33
|
+
export(): Promise<ConversationSnapshot>;
|
|
34
|
+
import(snapshot: ConversationSnapshot): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=in-memory-conversation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-conversation-store.d.ts","sourceRoot":"","sources":["../../../src/conversation/in-memory-conversation-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,aAAa,EACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C;;;;;;;;;;;;;;GAcG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IACnE,OAAO,CAAC,QAAQ,CAA6B;IAEvC,UAAU,CACd,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC;IAaV,UAAU,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAI5C,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOxD,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA0ChE,KAAK,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA4C/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAgCtC,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAQvC,MAAM,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAS5D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory implementation of ConversationManager for testing and simple use cases.
|
|
3
|
+
*
|
|
4
|
+
* @module conversation/in-memory-conversation-store
|
|
5
|
+
* @since 2.0.0
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
8
|
+
/**
|
|
9
|
+
* Simple in-memory conversation storage.
|
|
10
|
+
*
|
|
11
|
+
* This implementation keeps all messages in memory without persistence.
|
|
12
|
+
* Useful for testing, temporary conversations, or when persistence isn't needed.
|
|
13
|
+
*
|
|
14
|
+
* @since 2.0.0
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const store = new InMemoryConversationStore();
|
|
19
|
+
* await store.addMessage({ role: "user", content: "Hello!" });
|
|
20
|
+
* const history = await store.getHistory();
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export class InMemoryConversationStore {
|
|
24
|
+
messages = [];
|
|
25
|
+
async addMessage(message, metadata) {
|
|
26
|
+
const fullMetadata = {
|
|
27
|
+
id: randomUUID(),
|
|
28
|
+
timestamp: Date.now(),
|
|
29
|
+
...metadata,
|
|
30
|
+
};
|
|
31
|
+
this.messages.push({
|
|
32
|
+
message,
|
|
33
|
+
metadata: fullMetadata,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async getHistory() {
|
|
37
|
+
return [...this.messages];
|
|
38
|
+
}
|
|
39
|
+
async getRecent(count) {
|
|
40
|
+
if (count === 0) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
return this.messages.slice(-count);
|
|
44
|
+
}
|
|
45
|
+
async search(query) {
|
|
46
|
+
let results = [...this.messages];
|
|
47
|
+
if (query.role !== undefined) {
|
|
48
|
+
results = results.filter((msg) => msg.message.role === query.role);
|
|
49
|
+
}
|
|
50
|
+
if (query.content !== undefined) {
|
|
51
|
+
const searchLower = query.content.toLowerCase();
|
|
52
|
+
results = results.filter((msg) => msg.message.content.toLowerCase().includes(searchLower));
|
|
53
|
+
}
|
|
54
|
+
if (query.stageId !== undefined) {
|
|
55
|
+
results = results.filter((msg) => msg.metadata.stageId === query.stageId);
|
|
56
|
+
}
|
|
57
|
+
if (query.after !== undefined) {
|
|
58
|
+
results = results.filter((msg) => msg.metadata.timestamp >= query.after);
|
|
59
|
+
}
|
|
60
|
+
if (query.before !== undefined) {
|
|
61
|
+
results = results.filter((msg) => msg.metadata.timestamp <= query.before);
|
|
62
|
+
}
|
|
63
|
+
if (query.important !== undefined) {
|
|
64
|
+
results = results.filter((msg) => msg.metadata.important === query.important);
|
|
65
|
+
}
|
|
66
|
+
if (query.limit !== undefined && query.limit > 0) {
|
|
67
|
+
results = results.slice(0, query.limit);
|
|
68
|
+
}
|
|
69
|
+
return results;
|
|
70
|
+
}
|
|
71
|
+
async prune(strategy) {
|
|
72
|
+
const originalLength = this.messages.length;
|
|
73
|
+
if (originalLength === 0) {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
const toKeep = [];
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
for (let i = 0; i < this.messages.length; i++) {
|
|
79
|
+
const msg = this.messages[i];
|
|
80
|
+
let keep = false;
|
|
81
|
+
if (strategy.keepRecent !== undefined &&
|
|
82
|
+
i >= this.messages.length - strategy.keepRecent) {
|
|
83
|
+
keep = true;
|
|
84
|
+
}
|
|
85
|
+
if (strategy.keepImportant !== undefined &&
|
|
86
|
+
strategy.keepImportant(msg)) {
|
|
87
|
+
keep = true;
|
|
88
|
+
}
|
|
89
|
+
if (strategy.maxAge !== undefined) {
|
|
90
|
+
const age = now - msg.metadata.timestamp;
|
|
91
|
+
if (age <= strategy.maxAge) {
|
|
92
|
+
keep = true;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (keep) {
|
|
96
|
+
toKeep.push(msg);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.messages = toKeep;
|
|
100
|
+
return originalLength - toKeep.length;
|
|
101
|
+
}
|
|
102
|
+
async clear() {
|
|
103
|
+
this.messages = [];
|
|
104
|
+
}
|
|
105
|
+
async getStats() {
|
|
106
|
+
const byRole = {};
|
|
107
|
+
let totalTokens = 0;
|
|
108
|
+
let oldestMessage;
|
|
109
|
+
let newestMessage;
|
|
110
|
+
for (const msg of this.messages) {
|
|
111
|
+
const role = msg.message.role;
|
|
112
|
+
byRole[role] = (byRole[role] || 0) + 1;
|
|
113
|
+
if (msg.metadata.tokens !== undefined) {
|
|
114
|
+
totalTokens += msg.metadata.tokens;
|
|
115
|
+
}
|
|
116
|
+
const timestamp = msg.metadata.timestamp;
|
|
117
|
+
if (oldestMessage === undefined || timestamp < oldestMessage) {
|
|
118
|
+
oldestMessage = timestamp;
|
|
119
|
+
}
|
|
120
|
+
if (newestMessage === undefined || timestamp > newestMessage) {
|
|
121
|
+
newestMessage = timestamp;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
messageCount: this.messages.length,
|
|
126
|
+
byRole,
|
|
127
|
+
totalTokens: totalTokens > 0 ? totalTokens : undefined,
|
|
128
|
+
oldestMessage,
|
|
129
|
+
newestMessage,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async export() {
|
|
133
|
+
return {
|
|
134
|
+
version: "1.0.0",
|
|
135
|
+
createdAt: Date.now(),
|
|
136
|
+
messages: [...this.messages],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
async import(snapshot) {
|
|
140
|
+
if (!snapshot.version.startsWith("1.")) {
|
|
141
|
+
throw new Error(`Unsupported snapshot version: ${snapshot.version}. Expected 1.x`);
|
|
142
|
+
}
|
|
143
|
+
this.messages = [...snapshot.messages];
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=in-memory-conversation-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-conversation-store.js","sourceRoot":"","sources":["../../../src/conversation/in-memory-conversation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Message } from "./component.js";
|
|
2
|
+
import type { LLMAdapter, LLMResponse, GenerationConfig } from "./llm.js";
|
|
3
|
+
import type { Tool } from "./tool.js";
|
|
4
|
+
export interface CopilotAdapterConfig {
|
|
5
|
+
/** GitHub PAT or output of `gh auth token`. Must have Copilot scope. */
|
|
6
|
+
githubToken: string;
|
|
7
|
+
/** Model to use (default: "gpt-4o") */
|
|
8
|
+
model?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* GitHub Copilot LLM adapter.
|
|
12
|
+
*
|
|
13
|
+
* Auth flow:
|
|
14
|
+
* 1. Exchange GitHub token for a short-lived Copilot session token
|
|
15
|
+
* 2. Use the session token as Bearer auth against the Copilot chat API
|
|
16
|
+
* 3. Token is cached and auto-refreshed when expired
|
|
17
|
+
*
|
|
18
|
+
* The chat completions API is OpenAI-compatible in request/response format.
|
|
19
|
+
*/
|
|
20
|
+
export declare class CopilotAdapter implements LLMAdapter {
|
|
21
|
+
private githubToken;
|
|
22
|
+
private model;
|
|
23
|
+
private cachedToken;
|
|
24
|
+
private tokenExpiresAt;
|
|
25
|
+
constructor(config: CopilotAdapterConfig);
|
|
26
|
+
/**
|
|
27
|
+
* Exchange the GitHub token for a Copilot session token.
|
|
28
|
+
* Caches the token and reuses it until it expires.
|
|
29
|
+
*/
|
|
30
|
+
private getCopilotToken;
|
|
31
|
+
generate(messages: Message[], tools?: Tool[], config?: GenerationConfig): Promise<LLMResponse>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=copilot-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-adapter.d.ts","sourceRoot":"","sources":["../../src/copilot-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAY,MAAM,UAAU,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAMtC,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;;;;GASG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,cAAc,CAAa;gBAEvB,MAAM,EAAE,oBAAoB;IAKxC;;;OAGG;YACW,eAAe;IAgCvB,QAAQ,CACZ,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,MAAM,CAAC,EAAE,gBAAgB,GACxB,OAAO,CAAC,WAAW,CAAC;CA4FxB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { zodToJsonSchema } from "./schema-utils.js";
|
|
2
|
+
const COPILOT_TOKEN_URL = "https://api.github.com/copilot_internal/v2/token";
|
|
3
|
+
const COPILOT_CHAT_URL = "https://api.githubcopilot.com/chat/completions";
|
|
4
|
+
/**
|
|
5
|
+
* GitHub Copilot LLM adapter.
|
|
6
|
+
*
|
|
7
|
+
* Auth flow:
|
|
8
|
+
* 1. Exchange GitHub token for a short-lived Copilot session token
|
|
9
|
+
* 2. Use the session token as Bearer auth against the Copilot chat API
|
|
10
|
+
* 3. Token is cached and auto-refreshed when expired
|
|
11
|
+
*
|
|
12
|
+
* The chat completions API is OpenAI-compatible in request/response format.
|
|
13
|
+
*/
|
|
14
|
+
export class CopilotAdapter {
|
|
15
|
+
githubToken;
|
|
16
|
+
model;
|
|
17
|
+
cachedToken = null;
|
|
18
|
+
tokenExpiresAt = 0;
|
|
19
|
+
constructor(config) {
|
|
20
|
+
this.githubToken = config.githubToken;
|
|
21
|
+
this.model = config.model ?? "gpt-4o";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Exchange the GitHub token for a Copilot session token.
|
|
25
|
+
* Caches the token and reuses it until it expires.
|
|
26
|
+
*/
|
|
27
|
+
async getCopilotToken() {
|
|
28
|
+
// Return cached token if still valid (with 60s buffer)
|
|
29
|
+
if (this.cachedToken && Date.now() / 1000 < this.tokenExpiresAt - 60) {
|
|
30
|
+
return this.cachedToken;
|
|
31
|
+
}
|
|
32
|
+
const response = await fetch(COPILOT_TOKEN_URL, {
|
|
33
|
+
method: "GET",
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${this.githubToken}`,
|
|
36
|
+
Accept: "application/json",
|
|
37
|
+
"User-Agent": "GitHubCopilotChat/0.26.7",
|
|
38
|
+
"Editor-Version": "vscode/1.99.3",
|
|
39
|
+
"Editor-Plugin-Version": "copilot-chat/0.26.7",
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
const text = await response.text();
|
|
44
|
+
throw new Error(`Failed to obtain Copilot token (${response.status}): ${text}. ` +
|
|
45
|
+
`Ensure your GitHub token has Copilot access.`);
|
|
46
|
+
}
|
|
47
|
+
const data = (await response.json());
|
|
48
|
+
this.cachedToken = data.token;
|
|
49
|
+
this.tokenExpiresAt = data.expires_at;
|
|
50
|
+
return this.cachedToken;
|
|
51
|
+
}
|
|
52
|
+
async generate(messages, tools, config) {
|
|
53
|
+
const copilotToken = await this.getCopilotToken();
|
|
54
|
+
const body = {
|
|
55
|
+
model: this.model,
|
|
56
|
+
messages: messages.map((m) => {
|
|
57
|
+
const msg = {
|
|
58
|
+
role: m.role,
|
|
59
|
+
content: m.content,
|
|
60
|
+
};
|
|
61
|
+
if (m.toolCallId) {
|
|
62
|
+
msg.tool_call_id = m.toolCallId;
|
|
63
|
+
}
|
|
64
|
+
return msg;
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
if (config?.temperature !== undefined) {
|
|
68
|
+
body.temperature = config.temperature;
|
|
69
|
+
}
|
|
70
|
+
if (config?.maxTokens !== undefined) {
|
|
71
|
+
body.max_tokens = config.maxTokens;
|
|
72
|
+
}
|
|
73
|
+
if (tools && tools.length > 0) {
|
|
74
|
+
body.tools = tools.map((tool) => ({
|
|
75
|
+
type: "function",
|
|
76
|
+
function: {
|
|
77
|
+
name: tool.name,
|
|
78
|
+
description: tool.description,
|
|
79
|
+
parameters: zodToJsonSchema(tool.inputSchema),
|
|
80
|
+
},
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
const response = await fetch(COPILOT_CHAT_URL, {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: {
|
|
86
|
+
"Content-Type": "application/json",
|
|
87
|
+
Authorization: `Bearer ${copilotToken}`,
|
|
88
|
+
"User-Agent": "GitHubCopilotChat/0.26.7",
|
|
89
|
+
"Editor-Version": "vscode/1.99.3",
|
|
90
|
+
"Editor-Plugin-Version": "copilot-chat/0.26.7",
|
|
91
|
+
},
|
|
92
|
+
body: JSON.stringify(body),
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok) {
|
|
95
|
+
const text = await response.text();
|
|
96
|
+
// If 401, the token may have been invalidated server-side — clear cache
|
|
97
|
+
if (response.status === 401) {
|
|
98
|
+
this.cachedToken = null;
|
|
99
|
+
this.tokenExpiresAt = 0;
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`Copilot API error (${response.status}): ${text}`);
|
|
102
|
+
}
|
|
103
|
+
const data = (await response.json());
|
|
104
|
+
const choice = data.choices[0];
|
|
105
|
+
if (!choice) {
|
|
106
|
+
throw new Error("Copilot returned empty response");
|
|
107
|
+
}
|
|
108
|
+
const toolCalls = choice.message.tool_calls?.map((tc) => ({
|
|
109
|
+
id: tc.id,
|
|
110
|
+
toolName: tc.function.name,
|
|
111
|
+
arguments: JSON.parse(tc.function.arguments),
|
|
112
|
+
}));
|
|
113
|
+
return {
|
|
114
|
+
content: choice.message.content ?? "",
|
|
115
|
+
toolCalls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=copilot-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-adapter.js","sourceRoot":"","sources":["../../src/copilot-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced trace logger with memory and performance tracking.
|
|
3
|
+
*
|
|
4
|
+
* Automatically captures memory statistics and performance metrics
|
|
5
|
+
* when logging trace entries.
|
|
6
|
+
*
|
|
7
|
+
* @module file-trace-enhanced
|
|
8
|
+
* @since 2.0.0
|
|
9
|
+
*/
|
|
10
|
+
import type { TraceEntry, TraceLogger } from "./trace.js";
|
|
11
|
+
import type { TieredMemoryManager } from "./memory/tiered-memory.js";
|
|
12
|
+
/**
|
|
13
|
+
* Options for enhanced trace logger.
|
|
14
|
+
*/
|
|
15
|
+
export interface EnhancedTraceOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Base trace logger to wrap.
|
|
18
|
+
*/
|
|
19
|
+
baseLogger: TraceLogger;
|
|
20
|
+
/**
|
|
21
|
+
* Optional memory manager for collecting memory stats.
|
|
22
|
+
*/
|
|
23
|
+
memoryManager?: TieredMemoryManager;
|
|
24
|
+
/**
|
|
25
|
+
* Whether to collect memory stats on every log entry.
|
|
26
|
+
* Can be expensive for high-frequency logging.
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
collectMemoryStats?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Whether to track performance metrics.
|
|
32
|
+
* @default true
|
|
33
|
+
*/
|
|
34
|
+
trackPerformance?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Enhanced trace logger that automatically captures memory and performance data.
|
|
38
|
+
*
|
|
39
|
+
* Wraps an existing TraceLogger and enriches entries with:
|
|
40
|
+
* - Memory statistics from TieredMemoryManager
|
|
41
|
+
* - Performance timing for stage execution
|
|
42
|
+
* - Memory hit/miss rates
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const baseLogger = new FileTraceLogger('trace.jsonl');
|
|
47
|
+
* const memory = new TieredMemoryManager();
|
|
48
|
+
*
|
|
49
|
+
* const enhancedLogger = new EnhancedTraceLogger({
|
|
50
|
+
* baseLogger,
|
|
51
|
+
* memoryManager: memory,
|
|
52
|
+
* collectMemoryStats: true,
|
|
53
|
+
* });
|
|
54
|
+
*
|
|
55
|
+
* // Log with automatic memory stats
|
|
56
|
+
* enhancedLogger.log({
|
|
57
|
+
* stageId: 'Step1',
|
|
58
|
+
* event: 'stage_start',
|
|
59
|
+
* });
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @since 2.0.0
|
|
63
|
+
*/
|
|
64
|
+
export declare class EnhancedTraceLogger implements TraceLogger {
|
|
65
|
+
private baseLogger;
|
|
66
|
+
private memoryManager?;
|
|
67
|
+
private collectMemoryStats;
|
|
68
|
+
private trackPerformance;
|
|
69
|
+
private stageStartTimes;
|
|
70
|
+
constructor(options: EnhancedTraceOptions);
|
|
71
|
+
/**
|
|
72
|
+
* Log a trace entry with automatic enrichment.
|
|
73
|
+
*/
|
|
74
|
+
log(entry: Omit<TraceEntry, "timestamp">): void;
|
|
75
|
+
/**
|
|
76
|
+
* Get all entries from base logger.
|
|
77
|
+
*/
|
|
78
|
+
getEntries(): TraceEntry[];
|
|
79
|
+
/**
|
|
80
|
+
* Flush base logger.
|
|
81
|
+
*/
|
|
82
|
+
flush(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Start timing a stage.
|
|
85
|
+
*
|
|
86
|
+
* Call this when stage execution begins.
|
|
87
|
+
*
|
|
88
|
+
* @param stageId - Stage identifier
|
|
89
|
+
*/
|
|
90
|
+
startStage(stageId: string): void;
|
|
91
|
+
/**
|
|
92
|
+
* End timing a stage and return duration.
|
|
93
|
+
*
|
|
94
|
+
* @param stageId - Stage identifier
|
|
95
|
+
* @returns Duration in milliseconds, or undefined if not started
|
|
96
|
+
*/
|
|
97
|
+
endStage(stageId: string): number | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Capture current memory statistics.
|
|
100
|
+
*/
|
|
101
|
+
private captureMemoryStats;
|
|
102
|
+
/**
|
|
103
|
+
* Capture performance metrics based on event type.
|
|
104
|
+
*/
|
|
105
|
+
private capturePerformance;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Helper to create an enhanced logger from an existing logger.
|
|
109
|
+
*
|
|
110
|
+
* @param baseLogger - Base trace logger
|
|
111
|
+
* @param memoryManager - Optional memory manager for stats
|
|
112
|
+
* @returns Enhanced trace logger
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const logger = createEnhancedLogger(
|
|
117
|
+
* new FileTraceLogger('trace.jsonl'),
|
|
118
|
+
* memoryManager
|
|
119
|
+
* );
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export declare function createEnhancedLogger(baseLogger: TraceLogger, memoryManager?: TieredMemoryManager): EnhancedTraceLogger;
|
|
123
|
+
//# sourceMappingURL=file-trace-enhanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-trace-enhanced.d.ts","sourceRoot":"","sources":["../../src/file-trace-enhanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAA6C,MAAM,YAAY,CAAC;AACrG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,EAAE,WAAW,CAAC;IAExB;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,mBAAoB,YAAW,WAAW;IACrD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,aAAa,CAAC,CAAsB;IAC5C,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,eAAe,CAAkC;gBAE7C,OAAO,EAAE,oBAAoB;IAOzC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,IAAI;IAiB/C;;OAEG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMjC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe7C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAiC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,WAAW,EACvB,aAAa,CAAC,EAAE,mBAAmB,GAClC,mBAAmB,CAOrB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enhanced trace logger with memory and performance tracking.
|
|
3
|
+
*
|
|
4
|
+
* Automatically captures memory statistics and performance metrics
|
|
5
|
+
* when logging trace entries.
|
|
6
|
+
*
|
|
7
|
+
* @module file-trace-enhanced
|
|
8
|
+
* @since 2.0.0
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Enhanced trace logger that automatically captures memory and performance data.
|
|
12
|
+
*
|
|
13
|
+
* Wraps an existing TraceLogger and enriches entries with:
|
|
14
|
+
* - Memory statistics from TieredMemoryManager
|
|
15
|
+
* - Performance timing for stage execution
|
|
16
|
+
* - Memory hit/miss rates
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const baseLogger = new FileTraceLogger('trace.jsonl');
|
|
21
|
+
* const memory = new TieredMemoryManager();
|
|
22
|
+
*
|
|
23
|
+
* const enhancedLogger = new EnhancedTraceLogger({
|
|
24
|
+
* baseLogger,
|
|
25
|
+
* memoryManager: memory,
|
|
26
|
+
* collectMemoryStats: true,
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Log with automatic memory stats
|
|
30
|
+
* enhancedLogger.log({
|
|
31
|
+
* stageId: 'Step1',
|
|
32
|
+
* event: 'stage_start',
|
|
33
|
+
* });
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @since 2.0.0
|
|
37
|
+
*/
|
|
38
|
+
export class EnhancedTraceLogger {
|
|
39
|
+
baseLogger;
|
|
40
|
+
memoryManager;
|
|
41
|
+
collectMemoryStats;
|
|
42
|
+
trackPerformance;
|
|
43
|
+
stageStartTimes = new Map();
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.baseLogger = options.baseLogger;
|
|
46
|
+
this.memoryManager = options.memoryManager;
|
|
47
|
+
this.collectMemoryStats = options.collectMemoryStats ?? false;
|
|
48
|
+
this.trackPerformance = options.trackPerformance ?? true;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Log a trace entry with automatic enrichment.
|
|
52
|
+
*/
|
|
53
|
+
log(entry) {
|
|
54
|
+
const enriched = { ...entry };
|
|
55
|
+
// Collect memory stats if enabled
|
|
56
|
+
if (this.collectMemoryStats && this.memoryManager) {
|
|
57
|
+
enriched.memory = this.captureMemoryStats();
|
|
58
|
+
}
|
|
59
|
+
// Track performance timing
|
|
60
|
+
if (this.trackPerformance) {
|
|
61
|
+
enriched.performance = this.capturePerformance(entry);
|
|
62
|
+
}
|
|
63
|
+
// Log to base logger
|
|
64
|
+
this.baseLogger.log(enriched);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get all entries from base logger.
|
|
68
|
+
*/
|
|
69
|
+
getEntries() {
|
|
70
|
+
return this.baseLogger.getEntries();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Flush base logger.
|
|
74
|
+
*/
|
|
75
|
+
async flush() {
|
|
76
|
+
return this.baseLogger.flush();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Start timing a stage.
|
|
80
|
+
*
|
|
81
|
+
* Call this when stage execution begins.
|
|
82
|
+
*
|
|
83
|
+
* @param stageId - Stage identifier
|
|
84
|
+
*/
|
|
85
|
+
startStage(stageId) {
|
|
86
|
+
if (this.trackPerformance) {
|
|
87
|
+
this.stageStartTimes.set(stageId, Date.now());
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* End timing a stage and return duration.
|
|
92
|
+
*
|
|
93
|
+
* @param stageId - Stage identifier
|
|
94
|
+
* @returns Duration in milliseconds, or undefined if not started
|
|
95
|
+
*/
|
|
96
|
+
endStage(stageId) {
|
|
97
|
+
if (!this.trackPerformance) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
const startTime = this.stageStartTimes.get(stageId);
|
|
101
|
+
if (startTime === undefined) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
const duration = Date.now() - startTime;
|
|
105
|
+
this.stageStartTimes.delete(stageId);
|
|
106
|
+
return duration;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Capture current memory statistics.
|
|
110
|
+
*/
|
|
111
|
+
captureMemoryStats() {
|
|
112
|
+
if (!this.memoryManager) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
// Note: stats() is async but we're calling it sync here
|
|
117
|
+
// In production, this would need to be awaited
|
|
118
|
+
// For now, return undefined if we can't get stats synchronously
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Capture performance metrics based on event type.
|
|
127
|
+
*/
|
|
128
|
+
capturePerformance(entry) {
|
|
129
|
+
if (!this.trackPerformance) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
const metrics = {};
|
|
133
|
+
// Calculate stage duration for completion/failure events
|
|
134
|
+
if (entry.event === "stage_complete" ||
|
|
135
|
+
entry.event === "stage_failed") {
|
|
136
|
+
const duration = this.endStage(entry.stageId);
|
|
137
|
+
if (duration !== undefined) {
|
|
138
|
+
metrics.duration = duration;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Extract timing from data if available
|
|
142
|
+
if (entry.data) {
|
|
143
|
+
if (typeof entry.data.duration === "number") {
|
|
144
|
+
metrics.llmDuration = entry.data.duration;
|
|
145
|
+
}
|
|
146
|
+
if (typeof entry.data.toolDuration === "number") {
|
|
147
|
+
metrics.toolDuration = entry.data.toolDuration;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Return metrics only if we have any data
|
|
151
|
+
return Object.keys(metrics).length > 0 ? metrics : undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Helper to create an enhanced logger from an existing logger.
|
|
156
|
+
*
|
|
157
|
+
* @param baseLogger - Base trace logger
|
|
158
|
+
* @param memoryManager - Optional memory manager for stats
|
|
159
|
+
* @returns Enhanced trace logger
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* const logger = createEnhancedLogger(
|
|
164
|
+
* new FileTraceLogger('trace.jsonl'),
|
|
165
|
+
* memoryManager
|
|
166
|
+
* );
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
export function createEnhancedLogger(baseLogger, memoryManager) {
|
|
170
|
+
return new EnhancedTraceLogger({
|
|
171
|
+
baseLogger,
|
|
172
|
+
memoryManager,
|
|
173
|
+
collectMemoryStats: !!memoryManager,
|
|
174
|
+
trackPerformance: true,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=file-trace-enhanced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-trace-enhanced.js","sourceRoot":"","sources":["../../src/file-trace-enhanced.ts"],"names":[],"mappings":"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"}
|