Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
4b6fabb
Merge pull request #114 from MemTensor/main
Wang-Daoji Jul 30, 2026
fbdaac2
feat: exclude dependency tests and docs from desktop packages (#123)
wustzdy Jul 31, 2026
e5734d5
Merge pull request #124 from MemTensor/main
Wang-Daoji Jul 31, 2026
302b8cd
fix: unify cross-agent action backgrounds
Jul 31, 2026
d692f00
Merge pull request #125 from hijzy/main
hijzy Jul 31, 2026
f108ad4
fix: simplify memory tool call headings
Jul 31, 2026
33729a2
Merge pull request #126 from hijzy/main
hijzy Jul 31, 2026
6642966
feat(memory): commit episode routing on turn complete
Aug 3, 2026
328c5df
Merge pull request #130 from hijzy/main
hijzy Aug 3, 2026
b7129d7
fix(memory): separate retrieval content and validate L3 evidence
Aug 3, 2026
8377766
Merge pull request #131 from hijzy/main
hijzy Aug 3, 2026
3074213
fix(memory): finalize episode rewards and processing
Aug 3, 2026
54b3dfe
Merge pull request #132 from hijzy/main
hijzy Aug 3, 2026
9407529
chore: docs
Aug 3, 2026
f8cf955
chore: readme
Aug 3, 2026
64ceb34
Merge pull request #133 from hijzy/main
hijzy Aug 3, 2026
b0b4df2
chore: show invitation token (#135)
ZongYue99 Aug 3, 2026
c388e5d
feat(memory): link related memory details
Aug 3, 2026
4ee0775
Merge pull request #136 from hijzy/main
hijzy Aug 3, 2026
9857a05
feat(analytics): track desktop memory adds during agent-source scans …
antalike Aug 3, 2026
ca31449
feat: merge pkg && optimize pkg (#140)
wustzdy Aug 3, 2026
91e881d
feat: tighten onboarding activation with cross-agent relay and produc…
Aug 3, 2026
49ea071
fix(backend): share scan permission per installation
Aug 3, 2026
06d7ae2
chore: reorganize desktop packaging internal scripts (#141)
wustzdy Aug 3, 2026
627bbb3
Merge pull request #142 from hijzy/main
hijzy Aug 3, 2026
2f59808
fix(backend): refine onboarding permissions and actions
Aug 4, 2026
65bf870
Merge pull request #143 from hijzy/main
hijzy Aug 4, 2026
326d7b9
fix: surface structured quota exhaustion errors
Wang-Daoji Aug 4, 2026
8b317cf
Merge pull request #144 from Wang-Daoji/feature/v1.0.5-wy
Wang-Daoji Aug 4, 2026
f58510c
feat(memory): add time-filtered trace recall
Aug 4, 2026
03499e9
Merge pull request #145 from hijzy/main
hijzy Aug 4, 2026
3e8ce6d
feat: trust Codex hooks and reveal account identifiers
Aug 4, 2026
43127e9
Merge pull request #146 from hijzy/main
hijzy Aug 4, 2026
becb87e
fix(config): fail loud on invalid config instead of silently using de…
fancyboi999 Aug 4, 2026
8656996
feat(feishu): add QR bot setup (#127)
Ericwong5021 Aug 4, 2026
80b07d7
fix(memmy-memory): surface memory-service outages instead of silent f…
fancyboi999 Aug 4, 2026
b826c35
chore: add embedding mode into pkg (#147)
wustzdy Aug 4, 2026
8c778ed
feat(analytics): send userId at the top level of /api/analytics/event…
antalike Aug 4, 2026
03783f4
feat: refine product tour for deny-scan and scroll placement
Aug 4, 2026
bae7941
feat: reshape onboarding analytics for funnel-friendly step tracking
Aug 5, 2026
5721f0f
Merge pull request #1 from antalike/feat/onboarding-activation
dolnna Aug 5, 2026
19c1a80
fix(settings): show BYOK usage detail copy (#155)
syzsunshine219 Aug 5, 2026
ef31740
fix: seed first-report chat instead of re-running the agent
Aug 5, 2026
23aa28d
Merge pull request #157 from dolnna/feat/onboarding-activation
hijzy Aug 5, 2026
c35fa1b
Merge pull request #2 from antalike/feat/onboarding-activation
dolnna Aug 5, 2026
38f5de3
Merge pull request #158 from dolnna/feat/onboarding-activation
hijzy Aug 5, 2026
6b76ae4
feat(onboarding): focus initial report on preferences and latest task
Aug 5, 2026
3304626
Merge remote-tracking branch 'upstream/dev-onboarding'
Aug 5, 2026
1190afc
feat(onboarding): prioritize first report memory handoff
Aug 5, 2026
adde22d
codeowners (#159)
ZongYue99 Aug 5, 2026
9622626
fix(onboarding): preserve first report context across agents
Aug 5, 2026
a579986
Merge pull request #160 from hijzy/main
hijzy Aug 5, 2026
8cd4d71
fix(onboarding): streamline first report handoff
Aug 5, 2026
0569504
Merge pull request #161 from hijzy/main
hijzy Aug 5, 2026
e0033c0
fix: open WorkBuddy with task deeplink and /memmy-memory prompt (#162)
antalike Aug 5, 2026
6b94b32
Merge pull request #163 from MemTensor/dev-onboarding
hijzy Aug 5, 2026
678aedb
release: Memmy v1.0.5 (#170)
syzsunshine219 Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
* @ZongYue99
/App/memmy-agent/ @Wang-Daoji @ZongYue99
/Memory/ @hijzy @ZongYue99
/scripts/ @wustzdy @ZongYue99
30 changes: 30 additions & 0 deletions .github/release-notes/v1.0.5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Memmy v1.0.5

## Highlights

- Improved time-aware Memory recall. Requests with a concrete time range can now retrieve matching L1 trace summaries in chronological context.
- Made episodic Memory capture more reliable by committing routing, raw turns, and L1 records only after a turn completes. Cancelled, interrupted, and structurally incomplete turns no longer reserve an episode or create durable L1 memories.
- Added QR-based Feishu bot setup through the official Lark flow, while retaining manual App ID and App Secret configuration as a fallback.

## Agent and integration improvements

- Refined the first-report handoff for detected Cursor, Claude Code, Codex, OpenCode, OpenClaw, Hermes, and WorkBuddy installations, with prompt-copy fallback and Memory lookup verification when permission allows.
- Codex integration setup now registers, trusts, and verifies only the two user-level Memmy hooks it installs.
- Structured quota-exhaustion errors are now propagated consistently across supported providers and the desktop UI, without mistaking ordinary response text for a quota failure.
- Invalid existing Agent configuration files now fail with a clear error instead of silently reverting to defaults; missing configuration files still retain first-run behavior.
- When the Memmy Memory service is unavailable, Agent turns continue but show an explicit warning instead of making a silent fallback look like an empty recall.

## Desktop and Memory improvements

- Reworked the onboarding report around user preferences and the latest task, and now preserves the generated report as a real chat and handoff memory instead of rerunning the Agent after onboarding.
- Expanded the guided product tour across Memory logs, connected Agents, sync settings, the Memory overview, and tools; the flow adapts when scan permission is declined.
- Memory detail views now provide direct navigation between related traces, tasks, policies, world-model entries, and skills.
- Strengthened L3 evidence validation and episode reward processing, including safer handling of negative outcomes and reusable avoidance guidance.
- Agent-source scan permission is now installation-scoped, so the same local installation uses one consistent choice across account contexts.
- Settings now show configured invitation reward amounts and clearer BYOK usage copy.

## Packaging notes

- Consolidated macOS and Windows packaging behind parameterized scripts for version, architecture, edition, and signing mode.
- Desktop packages now exclude dependency tests, documentation, examples, and coverage files from the runtime payload.
- Packaged builds now prepare and include the default local embedding model as an application resource.
24 changes: 2 additions & 22 deletions App/backend/local-api-contracts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -355,26 +355,6 @@ export const AgentSourceScanInputSchema = z.preprocess(
);
export type AgentSourceScanInput = z.infer<typeof AgentSourceScanInputSchema>;

export const OnboardingInsightActionTypeSchema = z.enum([
"continue_task",
"cross_agent_synthesis",
"decision_doc",
"problem_diagnosis",
"open_ended"
]);
export type OnboardingInsightActionType = z.infer<typeof OnboardingInsightActionTypeSchema>;

export const OnboardingInsightActionSchema = z.object({
type: OnboardingInsightActionTypeSchema,
buttonLabel: z.string().min(1),
description: z.string().min(1),
contextSummary: z.string().min(1),
relatedAgents: z.array(z.string().min(1)).default([]),
topicKeywords: z.array(z.string().min(1)).default([]),
suggestedPrompt: z.string().min(1)
});
export type OnboardingInsightAction = z.infer<typeof OnboardingInsightActionSchema>;

export const OnboardingInsightReportInputSchema = z.object({
locale: z.enum(["zh-CN", "en-US"]).optional(),
stream: z.boolean().optional()
Expand All @@ -386,6 +366,8 @@ export const OnboardingInsightDiagnosticsSchema = z.object({
sampledQueryCount: z.number().int().nonnegative(),
usedLlm: z.boolean(),
elapsedMs: z.number().int().nonnegative(),
reportLanguage: z.enum(["zh-CN", "en-US"]).optional(),
latestWorkspacePath: z.string().nullable().optional(),
agents: z.array(z.object({
sourceId: z.string().min(1),
displayName: z.string().min(1),
Expand All @@ -399,8 +381,6 @@ export type OnboardingInsightDiagnostics = z.infer<typeof OnboardingInsightDiagn
export const OnboardingInsightReportResponseSchema = z.object({
status: z.enum(["ready", "fallback", "skipped"]),
reportMarkdown: z.string(),
primaryAction: OnboardingInsightActionSchema.optional(),
secondaryActions: z.array(OnboardingInsightActionSchema).default([]),
diagnostics: OnboardingInsightDiagnosticsSchema
});
export type OnboardingInsightReportResponse = z.infer<typeof OnboardingInsightReportResponseSchema>;
Expand Down
13 changes: 9 additions & 4 deletions App/backend/local-api-contracts/src/memory-runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,6 @@ export const StartTurnOutputSchema = z.object({
turnId: NonEmptyStringSchema,
contextPacketId: NonEmptyStringSchema,
sessionId: NonEmptyStringSchema,
episodeId: NonEmptyStringSchema,
injectedContext: InjectedContextSchema,
searchEventId: NonEmptyStringSchema,
sourceMemoryIds: z.array(NonEmptyStringSchema),
Expand Down Expand Up @@ -333,11 +332,14 @@ export const CompleteTurnOutputSchema = z.object({
sessionId: NonEmptyStringSchema,
episodeId: NonEmptyStringSchema,
rawTurnId: NonEmptyStringSchema,
l1MemoryId: NonEmptyStringSchema,
l1MemoryId: z.string(),
l1MemoryIds: z.array(NonEmptyStringSchema),
closedEpisodeIds: z.array(NonEmptyStringSchema),
scheduledEvolution: z.boolean(),
jobs: z.array(JobRefSchema),
changeSeq: z.number().int().nonnegative(),
serverTime: IsoTimeSchema
serverTime: IsoTimeSchema,
duplicate: z.boolean().optional()
});
export type CompleteTurnOutput = z.infer<typeof CompleteTurnOutputSchema>;

Expand Down Expand Up @@ -423,12 +425,15 @@ export const GetMemoryOutputSchema = z.object({
worldModel: z
.object({
sourceMemoryIds: z.array(NonEmptyStringSchema),
confidence: z.number().optional()
confidence: z.number().optional(),
summary: z.string().optional()
})
.optional(),
skill: z
.object({
invocationGuide: z.string(),
retrievalBlurb: z.string().optional(),
triggerContext: z.string().optional(),
procedure: z.array(z.string()).optional(),
sourcePolicyIds: z.array(NonEmptyStringSchema),
sourceWorldModelIds: z.array(NonEmptyStringSchema),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ export function registerOnboardingInsightRoutes(
return reply.send(OnboardingInsightReportResponseSchema.parse({
status: "skipped",
reportMarkdown: "",
secondaryActions: [],
diagnostics: {
discoveredAgentCount: 0,
sampledQueryCount: 0,
Expand Down Expand Up @@ -60,7 +59,6 @@ export function registerOnboardingInsightRoutes(
response: {
status: "skipped",
reportMarkdown: "",
secondaryActions: [],
diagnostics: {
discoveredAgentCount: 0,
sampledQueryCount: 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,6 @@ function startTurnOutput() {
turnId: "turn-1",
contextPacketId: "context-1",
sessionId: "session-1",
episodeId: "episode-1",
injectedContext: { markdown: "", sections: [] },
searchEventId: "search-1",
sourceMemoryIds: [],
Expand All @@ -454,6 +453,8 @@ function completeTurnOutput() {
turnId: "turn-1",
sessionId: "session-1",
l1MemoryId: "memory-1",
l1MemoryIds: ["memory-1"],
closedEpisodeIds: [],
rawTurnId: "raw-1",
episodeId: "episode-1",
scheduledEvolution: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,6 @@ function createServer(): FastifyInstance {
return {
status: "ready",
reportMarkdown: "初见报告",
secondaryActions: [],
diagnostics: {
discoveredAgentCount: 1,
sampledQueryCount: 1,
Expand All @@ -254,7 +253,6 @@ function createServer(): FastifyInstance {
response: {
status: "ready",
reportMarkdown: "初见报告",
secondaryActions: [],
diagnostics: {
discoveredAgentCount: 1,
sampledQueryCount: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ describe("onboarding insight local api routes", () => {
expect(response.json()).toEqual({
status: "skipped",
reportMarkdown: "",
secondaryActions: [],
diagnostics: {
discoveredAgentCount: 0,
sampledQueryCount: 0,
Expand All @@ -49,7 +48,7 @@ describe("onboarding insight local api routes", () => {
expect(generateReport).not.toHaveBeenCalled();
});

it("streams first-login report chunks and final actions when scan permission is granted", async () => {
it("streams first-login report chunks and the final report when scan permission is granted", async () => {
app = createServer({
permissionManager: createPermissionManager("scan_only"),
onboardingInsight: {
Expand All @@ -63,16 +62,6 @@ describe("onboarding insight local api routes", () => {
response: {
status: "ready",
reportMarkdown: "你好",
primaryAction: {
type: "continue_task",
buttonLabel: "继续",
description: "继续任务",
contextSummary: "上下文",
relatedAgents: ["Codex"],
topicKeywords: ["Memory"],
suggestedPrompt: "继续任务"
},
secondaryActions: [],
diagnostics: {
discoveredAgentCount: 1,
sampledQueryCount: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,30 @@ export interface OnboardingSampledQuery {
workspacePath: string | null;
}

export interface OnboardingSampledMessage extends OnboardingSampledQuery {
role: "user" | "assistant" | "tool";
}

export interface OnboardingConversationReference {
sourceId: string;
displayName: string;
conversationId: string;
latestActivityAt: string;
workspacePath: string | null;
}

export interface OnboardingConversationWindow extends OnboardingConversationReference {
messages: OnboardingSampledMessage[];
}

export interface OnboardingSampleResult {
sourceId: string;
displayName: string;
recentSessionCount: number;
latestActivityAt: string | null;
queries: OnboardingSampledQuery[];
/** Recent visible messages used only to identify the newest conversation. */
recentMessages?: OnboardingSampledMessage[];
errors: Array<{ target: string; reason: string }>;
}

Expand All @@ -34,6 +52,13 @@ export interface OnboardingInsightSampler {
sampleRecentUserQueries(options: OnboardingInsightSampleOptions): Promise<OnboardingSampleResult>;
}

export interface OnboardingConversationWindowReader {
readConversation(
reference: OnboardingConversationReference,
options: Pick<OnboardingInsightSampleOptions, "maxQueryChars" | "deadlineMs" | "signal">
): Promise<OnboardingConversationWindow | null>;
}

export function emptyOnboardingSampleResult(input: {
sourceId: string;
displayName: string;
Expand Down
Loading