Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions crates/pidgin-napi/schema/api.json
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,52 @@
"name": "formatMissingSessionCwdPrompt"
}
}
},
{
"name": "parseCommandArgs",
"doc": "`parseCommandArgs` (harness/prompt-templates.ts): split an argument string\nusing simple shell-style single and double quotes.",
"shape": "unary",
"infallible": true,
"readonly": true,
"params": [
{
"name": "argsString",
"type": "string"
}
],
"returns": {
"list": "string"
},
"bindings": {
"node": {
"name": "parseCommandArgs"
}
}
},
{
"name": "substituteArgs",
"doc": "`substituteArgs` (harness/prompt-templates.ts): substitute prompt-template\nplaceholders (`$1`, `$@`, `$ARGUMENTS`, `${@:N}`, `${@:N:L}`) with args.",
"shape": "unary",
"infallible": true,
"readonly": true,
"params": [
{
"name": "content",
"type": "string"
},
{
"name": "args",
"type": {
"list": "string"
}
}
],
"returns": "string",
"bindings": {
"node": {
"name": "substituteArgs"
}
}
}
]
},
Expand Down
15 changes: 0 additions & 15 deletions crates/pidgin-napi/src/agent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,21 +98,6 @@ pub fn format_skill_invocation(
))
}

/// `parseCommandArgs` (harness/prompt-templates.ts): split an argument string
/// using simple shell-style single and double quotes.
#[napi(js_name = "parseCommandArgs")]
pub fn parse_command_args(args_string: String) -> Vec<String> {
pidgin_agent::harness::prompt_templates::parse_command_args(&args_string)
}

/// `substituteArgs` (harness/prompt-templates.ts): substitute prompt-template
/// placeholders (`$1`, `$@`, `$ARGUMENTS`, `${@:N}`, `${@:N:L}`) with args.
#[napi(js_name = "substituteArgs")]
pub fn substitute_args(content: String, args: Vec<String>) -> String {
let refs: Vec<&str> = args.iter().map(String::as_str).collect();
pidgin_agent::harness::prompt_templates::substitute_args(&content, &refs)
}

/// `formatPromptTemplateInvocation` (harness/prompt-templates.ts): substitute
/// positional arguments into a template's content. pi's `PromptTemplate`
/// crosses as a JSON object; the argument list crosses as a string array.
Expand Down
9 changes: 9 additions & 0 deletions crates/pidgin-napi/src/core_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,15 @@ impl crate::generated::PidginCore for PidginImpl {
fn format_missing_session_cwd_prompt(issue: crate::generated::SessionCwdIssueJs) -> String {
pidgin_coding::core::session_cwd::format_missing_session_cwd_prompt(&issue.into())
}

fn parse_command_args(args_string: String) -> Vec<String> {
pidgin_agent::harness::prompt_templates::parse_command_args(&args_string)
}

fn substitute_args(content: String, args: Vec<String>) -> String {
let refs: Vec<&str> = args.iter().map(String::as_str).collect();
pidgin_agent::harness::prompt_templates::substitute_args(&content, &refs)
}
}

// --- coding-agent session-cwd seam (core/session-cwd.ts) --------------------
Expand Down
16 changes: 16 additions & 0 deletions crates/pidgin-napi/src/generated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ pub trait PidginCore: Sized + Send + Sync + 'static {
) -> Option<SessionCwdIssueJs>;
fn format_missing_session_cwd_error(issue: SessionCwdIssueJs) -> String;
fn format_missing_session_cwd_prompt(issue: SessionCwdIssueJs) -> String;
fn parse_command_args(args_string: String) -> Vec<String>;
fn substitute_args(content: String, args: Vec<String>) -> String;
}

/// The `KeybindingsManagerCore` contract — implement over the engine in `crate::core_impl`.
Expand Down Expand Up @@ -322,6 +324,20 @@ pub fn format_missing_session_cwd_prompt(issue: SessionCwdIssueJs) -> String {
<crate::core_impl::PidginImpl as PidginCore>::format_missing_session_cwd_prompt(issue)
}

/// `parseCommandArgs` (harness/prompt-templates.ts): split an argument string
/// using simple shell-style single and double quotes.
#[napi(js_name = "parseCommandArgs")]
pub fn parse_command_args(args_string: String) -> Vec<String> {
<crate::core_impl::PidginImpl as PidginCore>::parse_command_args(args_string)
}

/// `substituteArgs` (harness/prompt-templates.ts): substitute prompt-template
/// placeholders (`$1`, `$@`, `$ARGUMENTS`, `${@:N}`, `${@:N:L}`) with args.
#[napi(js_name = "substituteArgs")]
pub fn substitute_args(content: String, args: Vec<String>) -> String {
<crate::core_impl::PidginImpl as PidginCore>::substitute_args(content, args)
}

/// The Rust-backed keybindings core, exposed to JavaScript as
/// `KeybindingsManagerCore`.
#[napi]
Expand Down