Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(templates): wire in memory to the runtime templates by Hweinstock · Pull Request #2116 · aws/agentcore-cli · GitHub
Skip to content

feat(templates): wire in memory to the runtime templates - #2116

Merged
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates
Aug 28, 2026
Merged

feat(templates): wire in memory to the runtime templates#2116
jariy17 merged 11 commits into
aws:refactorfrom
Hweinstock:memory-in-templates

Conversation

@Hweinstock

@HweinstockHweinstock commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Dependent on #2099 (ignore this until that is merged)

Problem

Memory is currently hardcoded to none. The old CLI defaulted to a real memory, and allowed none | longAndShort | short options.

Solutions

  • mirror old CLI arguments for memory with the same default.
  • wire that memory through to the template resolver.
  • refactor the fsTreeNode asset resolver to accept transformations and filters for added flexibility.

Testing

created a project with the memory template then deployed, verified the project and my cdk stack included a memory. Also verified the memory code was included in the asset rendering.

 > agentcore project create --name testP --template strands-python
...
> ls testP/app/strands_agent
README.md main.py mcp_client memory model pyproject.toml skills uv.lock
[ shows the memory folder which is conditionally rendered ] > cat testP/agentcore/agentcore.json | jq {
"name": "testP",
"version": 1,
"managedBy": "CDK",
"runtimes": [
{
"name": "strands_agent",
"build": "CodeZip",
"entrypoint": "main.py",
"codeLocation": "app/strands_agent",
"runtimeVersion": "PYTHON_3_14",
"protocol": "HTTP"
}
],
"memories": [
{
"name": "strands_agentMemory",
"eventExpiryDuration": 30,
"strategies": [
{
"type": "SEMANTIC",
"namespaceTemplates": [
"/users/{actorId}/facts"
]
},
{
"type": "USER_PREFERENCE",
"namespaceTemplates": [
"/users/{actorId}/preferences"
]
},
{
"type": "SUMMARIZATION",
"namespaceTemplates": [
"/summaries/{actorId}/{sessionId}"
]
},
{
"type": "EPISODIC",
"namespaceTemplates": [
"/episodes/{actorId}/{sessionId}"
],
"reflectionNamespaceTemplates": [
"/episodes/{actorId}"
]
}
]
}
]
}
[shows the memory config]
> agentcore project deploy
...

went to console and invoked it, and verified the memory was created.

  • unit tests!

@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added agentcore-harness-reviewing AgentCore Harness review in progress claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@codecov-commenter

codecov-commenter commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.25%. Comparing base (bcac2e6) to head (970ecac).

Additional details and impacted files
@@ Coverage Diff @@## refactor #2116 +/- ##
=========================================
Coverage 97.24% 97.25% =========================================
Files 472 472 Lines 28956 29018 +62 =========================================
+ Hits 28159 28221 +62 
Misses 797 797 

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@agentcore-devx-automationagentcore-devx-automationBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AgentCore Harness Review

Verdict: Looks good

I traced through the refactor and the new strands-http-python template. The extraction into templates/{project,runtime,harness,renderer,types,fsTree}.ts is coherent, the manager's addResource rollback semantics are preserved (mutating projectSpec in place is fine because it isn't written on the error path), the new fromTextFile correctly reads Dockerfile content from disk (so getHarnessTemplateResolver matches the old copyFile behavior, minus the pre-write existence check — the error is still thrown at write time via InputValidationError), and the manifest snapshot confirms memory/ is filtered out when --memory is not set.

Two very minor observations that are not blocking:

  • mergeSpecEntries in src/core/project/templates/project.ts merges runtimes/credentials/memories but ignores harnesses, even though SpecEntries includes it. Currently unreachable since createProjectTree only invokes the runtime resolver, so the omission is harmless — worth fixing if a future template contributes harnesses at project-create time.
  • src/assets/templates/strands-http-python/main.py references a pyJsonStr helper ({{pyJsonStr inputSchema}} and {{pyJsonStr litellmAdditionalParams}}) that isn't registered in HandlebarsTemplateRenderer. Guarded behind inlineFunctionTools / litellmAdditionalParams, both of which are never set in the current runtime.ts context, so it's latent — but it will blow up the day someone flips those flags on.

Neither of these needs to hold up the merge.

@agentcore-devx-automationagentcore-devx-automationBot removed the agentcore-harness-reviewing AgentCore Harness review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot removed the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@github-actionsgithub-actionsBot added the size/xl PR size: XL label Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added claude-security-reviewing Claude Code /security-review in progress and removed claude-security-reviewing Claude Code /security-review in progress labels Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@github-actionsgithub-actionsBot added size/xl PR size: XL and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
notgitika
notgitika previously approved these changes Aug 28, 2026

@notgitikanotgitika left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM thanks for addressing comments :)

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: the review did not analyze this PR (model took 0 turns). See the run for details; a later push or re-run is needed.

}
{{/if}}

return AgentCoreMemorySessionManager(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is fine for now since we said we don't want to make to many changes, and I know you said you would eventually like to improve the template. One thing we should change is to use the new AgentCoreMemoryManager and AgentCoreMemoryStore at some point. We should theoretically be using our own best practices.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

+1, good callout.

f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k=5, relevance_score=0.5),
{{/if}}
{{#if (includes memoryStrategies "SUMMARIZATION")}}
f"/summaries/{actor_id}": RetrievalConfig(top_k=3, relevance_score=0.5),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this retrieval namespace is different from the strategy being created. MEMORY_SHORTCUTS configures SUMMARIZATION as /summaries/{actorId}/{sessionId}, but the generated runtime queries /summaries/{actor_id}. That means summaries written under the configured session namespace will not be retrieved.

I think this should probablyt include session_id. I just looked and this mismatch also exists in the old template, but this PR makes that strategy part of the default memory so we may as well just make it right here.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is actually intentional. The namespace in the MEMORY_SHORTCUTS is where the LTM records get written (session specific path), and then the agent retrieves those records across all sessions by dropping the sessionId on the retrieval path.

I see a PR from main that fixes this exact behavior: #1660.

@aidandaly24aidandaly24Aug 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, I didn't realize this. This is definitely correct I was treating the retrieval namespace like an exact match, thanks!

},
{ rootDirName: input.name },
);
return { tree, spec: { runtimes: [buildRuntimeSpec(input)] } };

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the custom hello-world path can silently ignore --memory. Selecting --framework none routes here, but even when scaffoldRuntimeInput.memory is set, this return only adds the Runtime and does not generate a memories[] entry in agentcore.json or the memory template files. Do you think we should reject --memory for this path for cleanliness in UX?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is indirectly fixed in #2130 (comment). Let me rebase and verify.

Comment threadsrc/handlers/project/create/index.ts Outdated
modelProvider: flags["model-provider"],
apiKey,
memory: flags["memory"],
memory: MEMORY_SHORTCUTS[flags["memory"] ?? "longAndShortTerm"](runtimeName),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is memory supposed to be becoming the default here? Don't have a problem with it but like it is a breaking change. In the released CLI, omitting --memory does not create a Memory resource, but this defaults to longAndShortTerm and provisions four strategies.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, that was my intention. Since harness is also now defaulting to give customers a memory, I thought we should align and give them a memory by default as well. The runtime experience should be better with a memory attached, so I figure we should give them the best experience by default.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense to me

@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@github-actionsgithub-actionsBot added size/l PR size: L and removed size/l PR size: L labels Aug 28, 2026
@agentcore-devx-automationagentcore-devx-automationBot added the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automationagentcore-devx-automationBot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 28, 2026

/**
* Expands the flat asset listing under assetDir into a nested tree of nodes.
* Builds a file tree from assets under `input.assetDir`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now thats a code comment!

assetDir: string,
rootDirName?: string,
transform?: (content: string) => string,
config: { assetSource: AssetSource },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how we are using object types here.

@jariy17
jariy17 merged commit b18bb4b into aws:refactorAug 28, 2026
19 of 23 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/lPR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Hweinstock@codecov-commenter@notgitika@aidandaly24@jariy17